diff --git a/go.mod b/go.mod index 92d9317..4f5b2ce 100644 --- a/go.mod +++ b/go.mod @@ -2,8 +2,14 @@ module sunshine.industries/some-automoderation go 1.20 +require ( + github.com/kr/pretty v0.3.1 + github.com/redis/go-redis/v9 v9.2.1 +) + require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/redis/go-redis/v9 v9.2.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/rogpeppe/go-internal v1.9.0 // indirect ) diff --git a/go.sum b/go.sum index 0ad7837..bfcf2c8 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,16 @@ +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/redis/go-redis/v9 v9.2.1 h1:WlYJg71ODF0dVspZZCpYmoF1+U1Jjk9Rwd7pq6QmlCg= github.com/redis/go-redis/v9 v9.2.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= diff --git a/rooms/room.go b/rooms/room.go index e081610..196a714 100644 --- a/rooms/room.go +++ b/rooms/room.go @@ -66,7 +66,7 @@ gestureIteration: startIndex := r.gestureSearchStartIndex(gesture, currentSpeakerGesture) participantsCount := len(r.Paricipants) for i := 1; i < participantsCount; i++ { - checkIndex := startIndex + i%participantsCount + checkIndex := (startIndex + i) % participantsCount checkPerson := r.Paricipants[checkIndex] checkGesture, isFound := r.ParticipantHands[checkPerson.Id] if isFound && checkGesture == gesture { @@ -111,19 +111,22 @@ func (r *Room) gestureSearchStartIndex(gesture, curSpeakerGesture HandGesture) i return 0 } - var personFromWhichToStartSearch PersonId + var personFromWhichToStartSearch PersonId = r.CurrentSpeaker // if searched guesture is higher or same as current speaker, start from speaker if gesture >= curSpeakerGesture { personFromWhichToStartSearch = r.CurrentSpeaker } // if searched gesture is of lower priority from current speaker, check marks to return to, or use speaker level - gestureMark, found := r.Marks[gesture] - if found { - personFromWhichToStartSearch = gestureMark + if gesture < curSpeakerGesture { + gestureMark, found := r.Marks[gesture] + if found { + personFromWhichToStartSearch = gestureMark + } + // if no mark found - count from the speaker } - // if no mark found - count from the speaker - personFromWhichToStartSearch = r.CurrentSpeaker + log.Printf("> selecting person from which to start. cur speaker %s, for gestrue %s, got person %d", + curSpeakerGesture.String(), gesture.String(), personFromWhichToStartSearch) indexFromWhichToStart := slices.IndexFunc(r.Paricipants, func(p Person) bool { return p.Id == personFromWhichToStartSearch diff --git a/rooms/room_release_hand_test.go b/rooms/room_release_hand_test.go index cc5fc96..ac31d12 100644 --- a/rooms/room_release_hand_test.go +++ b/rooms/room_release_hand_test.go @@ -2,63 +2,228 @@ package rooms import ( "testing" + + "github.com/kr/pretty" ) type releaseHandTest struct { + testName string room, expected Room releasingParticipantId PersonId } var releaseHandTests = []releaseHandTest{ singleHandActive, + raisingLevelFromExpandToClarifyingQ, + selectNextHigherLevel, + usingMarkToLoverLevel, + releasingNonSpeakerHand, } func TestRoomReleaseHand(t *testing.T) { for _, test := range releaseHandTests { - test.room.InitMaps() - test.expected.InitMaps() - if test.room.ReleaseHand(test.releasingParticipantId); !test.room.Equal(&test.expected) { - t.Errorf("Output \n%+v \nnot equal to expected \n%+v", test.room, test.expected) - } + t.Run(test.testName, func(t *testing.T){ + test.room.InitMaps() + test.expected.InitMaps() + if test.room.ReleaseHand(test.releasingParticipantId); !test.room.Equal(&test.expected) { + t.Errorf("Test release hand diff: (-want +got)\n%s", pretty.Diff(test.room, test.expected)) + } + }) } } -var p1Id = PersonId(1) -var p2Id = PersonId(2) +var person1 = Person{ + Id: PersonId(100), + Name: "test person 1", +} +var person2 = Person{ + Id: PersonId(200), + Name: "test person 2", +} +var person3 = Person{ + Id: PersonId(300), + Name: "test person 3", +} +var person4 = Person{ + Id: PersonId(400), + Name: "test person 4", +} + +// 2 persons, 1 hand active, releasing it makes 'nobody' active var singleHandActive releaseHandTest = releaseHandTest{ - room : Room{ - Name: "test", - CurrentSpeaker: p1Id, + testName: "singleHandActive", + room: Room{ + Name: "test", + CurrentSpeaker: person1.Id, Paricipants: []Person{ - { - Id : p1Id, - Name: "p1", - }, - { - Id : PersonId(2), - Name: "p2", - }, + person1, + person2, }, ParticipantHands: map[PersonId]HandGesture{ - p1Id: Expand, + person1.Id: Expand, }, }, - releasingParticipantId: p1Id, + releasingParticipantId: person1.Id, expected: Room{ - Name: "test", + Name: "test", CurrentSpeaker: PersonId(0), Paricipants: []Person{ - { - Id : p1Id, - Name: "p1", - }, - { - Id : PersonId(2), - Name: "p2", - }, + person1, + person2, + }, + ParticipantHands: map[PersonId]HandGesture{}, + }, +} + +// 3 person in room, active does expand, next is probingQ, this sets mark for expand +var raisingLevelFromExpandToClarifyingQ releaseHandTest = releaseHandTest{ + testName: "raisingLevelFromExpandToClarifyingQ", + room: Room{ + Name: "test", + CurrentSpeaker: person1.Id, + Paricipants: []Person{ + person1, + person2, + person3, }, ParticipantHands: map[PersonId]HandGesture{ + person1.Id: Expand, + person3.Id: ClarifyingQ, + }, + }, + releasingParticipantId: person1.Id, + expected: Room{ + Name: "test", + CurrentSpeaker: person3.Id, + Paricipants: []Person{ + person1, + person2, + person3, + }, + ParticipantHands: map[PersonId]HandGesture{ + person3.Id: ClarifyingQ, + }, + Marks: map[HandGesture]PersonId{ + Expand: person1.Id, + }, + }, +} + +// 3 person in room, active does expand, next is probingQ, this sets mark for expand +var selectNextHigherLevel releaseHandTest = releaseHandTest{ + testName: "selectNextHigherLevel", + room: Room{ + Name: "test", + CurrentSpeaker: person1.Id, + Paricipants: []Person{ + person1, + person2, + person3, + }, + ParticipantHands: map[PersonId]HandGesture{ + person1.Id: Meta, + person2.Id: Expand, + person3.Id: Meta, + }, + }, + releasingParticipantId: person1.Id, + expected: Room{ + Name: "test", + CurrentSpeaker: person3.Id, + Paricipants: []Person{ + person1, + person2, + person3, + }, + ParticipantHands: map[PersonId]HandGesture{ + person2.Id: Expand, + person3.Id: Meta, + }, + Marks: map[HandGesture]PersonId{ + }, + }, +} + +// 4 person in room, returning to lover level, start not from cur speaker, but from mark +var usingMarkToLoverLevel releaseHandTest = releaseHandTest{ + testName: "usingMarkToLoverLevel", + room: Room{ + Name: "test", + CurrentSpeaker: person3.Id, + Paricipants: []Person{ + person1, + person2, + person3, + person4, + }, + ParticipantHands: map[PersonId]HandGesture{ + person2.Id: Expand, + person3.Id: Meta, + person4.Id: Expand, + }, + Marks: map[HandGesture]PersonId{ + ClarifyingQ: person3.Id, + Expand: person1.Id, + }, + }, + releasingParticipantId: person3.Id, + expected: Room{ + Name: "test", + CurrentSpeaker: person2.Id, + Paricipants: []Person{ + person1, + person2, + person3, + person4, + }, + ParticipantHands: map[PersonId]HandGesture{ + person2.Id: Expand, + person4.Id: Expand, + }, + Marks: map[HandGesture]PersonId{ + }, + }, +} + +// 4 person in room, releasing hand for non-speaker changes nothing else +var releasingNonSpeakerHand releaseHandTest = releaseHandTest{ + testName: "releasingNonSpeakerHand", + room: Room{ + Name: "test", + CurrentSpeaker: person3.Id, + Paricipants: []Person{ + person1, + person2, + person3, + person4, + }, + ParticipantHands: map[PersonId]HandGesture{ + person2.Id: Expand, + person3.Id: Meta, + person4.Id: Expand, + }, + Marks: map[HandGesture]PersonId{ + ClarifyingQ: person3.Id, + Expand: person1.Id, + }, + }, + releasingParticipantId: person4.Id, + expected: Room{ + Name: "test", + CurrentSpeaker: person3.Id, + Paricipants: []Person{ + person1, + person2, + person3, + person4, + }, + ParticipantHands: map[PersonId]HandGesture{ + person2.Id: Expand, + person3.Id: Meta, + }, + Marks: map[HandGesture]PersonId{ + ClarifyingQ: person3.Id, + Expand: person1.Id, }, }, - } diff --git a/routes/login_page.go b/routes/login_page.go index 16ef0dd..92fbb8d 100644 --- a/routes/login_page.go +++ b/routes/login_page.go @@ -231,7 +231,7 @@ func joinRoomHandler(templateFs *embed.FS, return toRoom }) if err != nil { - log.Printf("/login/join problem adding person to room", person.Name) + log.Printf("/login/join problem adding person to room %+v", person.Name) w.WriteHeader(http.StatusInternalServerError) // TODO render error to be put in error place // with message try again