355 lines
8.2 KiB
Go
355 lines
8.2 KiB
Go
package rooms
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/kr/pretty"
|
|
)
|
|
|
|
type releaseHandTest struct {
|
|
testName string
|
|
room, expected Room
|
|
releasingParticipantId PersonId
|
|
}
|
|
|
|
var releaseHandTests = []releaseHandTest{
|
|
singleHandActive,
|
|
raisingLevelFromExpandToMetaQ,
|
|
selectNextHigherLevel,
|
|
usingMarkToLoverLevel,
|
|
releasingNonSpeakerHand,
|
|
releaseToPersonWithHandAndMark,
|
|
raisingLevelSetMarksWithoutOverridingExisting,
|
|
releaseAllMarksWhenNoSpeaker,
|
|
}
|
|
|
|
func TestRoomReleaseHand(t *testing.T) {
|
|
for _, test := range releaseHandTests {
|
|
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.Logf("room state is %+v", test.room)
|
|
t.Logf("expected state is %+v", test.expected)
|
|
t.Errorf("Test release hand diff: (-want +got)\n%s", pretty.Diff(test.room, test.expected))
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
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{
|
|
testName: "singleHandActive",
|
|
room: Room{
|
|
Name: "test",
|
|
CurrentSpeaker: person1.Id,
|
|
AllKnownPeople: map[PersonId]Person{
|
|
person1.Id: person1,
|
|
person2.Id: person2,
|
|
},
|
|
ParticipantHands: map[PersonId]HandGesture{
|
|
person1.Id: Expand,
|
|
},
|
|
},
|
|
releasingParticipantId: person1.Id,
|
|
expected: Room{
|
|
Name: "test",
|
|
CurrentSpeaker: PersonId(0),
|
|
AllKnownPeople: map[PersonId]Person{
|
|
person1.Id: person1,
|
|
person2.Id: person2,
|
|
},
|
|
ParticipantHands: map[PersonId]HandGesture{},
|
|
},
|
|
}
|
|
|
|
// 3 person in room, active does expand, next is probingQ,
|
|
// this sets mark for all levels between levels
|
|
// so going down by many levels - starts from marked person due to 'count from' logic
|
|
// that uses marks from higher level if current level doesn't have a mark
|
|
// but also going down by 1 step keeps the marks until we return to initially diverged
|
|
// conversation layer
|
|
var raisingLevelFromExpandToMetaQ releaseHandTest = releaseHandTest{
|
|
testName: "raisingLevelFromExpandToMetaQ",
|
|
room: Room{
|
|
Name: "test",
|
|
CurrentSpeaker: person1.Id,
|
|
Paricipants: []PersonId{
|
|
person1.Id,
|
|
person2.Id,
|
|
person3.Id,
|
|
},
|
|
ParticipantHands: map[PersonId]HandGesture{
|
|
person1.Id: Expand,
|
|
person3.Id: Meta,
|
|
},
|
|
},
|
|
releasingParticipantId: person1.Id,
|
|
expected: Room{
|
|
Name: "test",
|
|
CurrentSpeaker: person3.Id,
|
|
Paricipants: []PersonId{
|
|
person1.Id,
|
|
person2.Id,
|
|
person3.Id,
|
|
},
|
|
ParticipantHands: map[PersonId]HandGesture{
|
|
person3.Id: Meta,
|
|
},
|
|
Marks: map[HandGesture]PersonId{
|
|
Expand: person1.Id,
|
|
ClarifyingQ: person1.Id,
|
|
},
|
|
},
|
|
}
|
|
|
|
// 3 person in room, active does expand, next is meta,
|
|
// this sets mark between level of current speaker and next speaker
|
|
var raisingLevelSetMarksWithoutOverridingExisting releaseHandTest = releaseHandTest{
|
|
testName: "raisingLevelSetMarksWithoutOverridingExisting",
|
|
room: Room{
|
|
Name: "test",
|
|
CurrentSpeaker: person1.Id,
|
|
Paricipants: []PersonId{
|
|
person1.Id,
|
|
person2.Id,
|
|
person3.Id,
|
|
},
|
|
ParticipantHands: map[PersonId]HandGesture{
|
|
person1.Id: Expand,
|
|
person3.Id: Meta,
|
|
},
|
|
Marks: map[HandGesture]PersonId{
|
|
ChangeTopic: person2.Id,
|
|
},
|
|
},
|
|
releasingParticipantId: person1.Id,
|
|
expected: Room{
|
|
Name: "test",
|
|
CurrentSpeaker: person3.Id,
|
|
Paricipants: []PersonId{
|
|
person1.Id,
|
|
person2.Id,
|
|
person3.Id,
|
|
},
|
|
ParticipantHands: map[PersonId]HandGesture{
|
|
person3.Id: Meta,
|
|
},
|
|
Marks: map[HandGesture]PersonId{
|
|
ChangeTopic: person2.Id,
|
|
Expand: person1.Id,
|
|
ClarifyingQ: 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: []PersonId{
|
|
person1.Id,
|
|
person2.Id,
|
|
person3.Id,
|
|
},
|
|
ParticipantHands: map[PersonId]HandGesture{
|
|
person1.Id: Meta,
|
|
person2.Id: Expand,
|
|
person3.Id: Meta,
|
|
},
|
|
},
|
|
releasingParticipantId: person1.Id,
|
|
expected: Room{
|
|
Name: "test",
|
|
CurrentSpeaker: person3.Id,
|
|
Paricipants: []PersonId{
|
|
person1.Id,
|
|
person2.Id,
|
|
person3.Id,
|
|
},
|
|
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: []PersonId{
|
|
person1.Id,
|
|
person2.Id,
|
|
person3.Id,
|
|
person4.Id,
|
|
},
|
|
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: []PersonId{
|
|
person1.Id,
|
|
person2.Id,
|
|
person3.Id,
|
|
person4.Id,
|
|
},
|
|
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: []PersonId{
|
|
person1.Id,
|
|
person2.Id,
|
|
person3.Id,
|
|
person4.Id,
|
|
},
|
|
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: []PersonId{
|
|
person1.Id,
|
|
person2.Id,
|
|
person3.Id,
|
|
person4.Id,
|
|
},
|
|
ParticipantHands: map[PersonId]HandGesture{
|
|
person2.Id: Expand,
|
|
person3.Id: Meta,
|
|
},
|
|
Marks: map[HandGesture]PersonId{
|
|
ClarifyingQ: person3.Id,
|
|
Expand: person1.Id,
|
|
},
|
|
},
|
|
}
|
|
|
|
// there is a mark for Expand on person 2, and raised hand with Expand on person 2
|
|
// speaker is person 3 with Meta
|
|
// after hand release person 2 should be speaking, with mark removed
|
|
var releaseToPersonWithHandAndMark releaseHandTest = releaseHandTest{
|
|
testName: "releaseToPersonWithHandAndMark",
|
|
room: Room{
|
|
Name: "test",
|
|
CurrentSpeaker: person3.Id,
|
|
Paricipants: []PersonId{
|
|
person1.Id,
|
|
person2.Id,
|
|
person3.Id,
|
|
person4.Id,
|
|
},
|
|
ParticipantHands: map[PersonId]HandGesture{
|
|
person2.Id: Expand,
|
|
person3.Id: Meta,
|
|
},
|
|
Marks: map[HandGesture]PersonId{
|
|
Expand: person2.Id,
|
|
},
|
|
},
|
|
releasingParticipantId: person3.Id,
|
|
expected: Room{
|
|
Name: "test",
|
|
CurrentSpeaker: person2.Id,
|
|
Paricipants: []PersonId{
|
|
person1.Id,
|
|
person2.Id,
|
|
person3.Id,
|
|
person4.Id,
|
|
},
|
|
ParticipantHands: map[PersonId]HandGesture{
|
|
person2.Id: Expand,
|
|
},
|
|
Marks: map[HandGesture]PersonId{},
|
|
},
|
|
}
|
|
|
|
// there is a mark for Expand on person 2, mark for Change Topic on person 3
|
|
// speaker is person 1 with Expand
|
|
// after hand release person nobody should be speaking, with all marks removed
|
|
var releaseAllMarksWhenNoSpeaker releaseHandTest = releaseHandTest{
|
|
testName: "releaseAllMarksWhenNoSpeaker",
|
|
room: Room{
|
|
Name: "test",
|
|
CurrentSpeaker: person1.Id,
|
|
Paricipants: []PersonId{
|
|
person1.Id,
|
|
person2.Id,
|
|
person3.Id,
|
|
person4.Id,
|
|
},
|
|
ParticipantHands: map[PersonId]HandGesture{
|
|
person1.Id: Expand,
|
|
},
|
|
Marks: map[HandGesture]PersonId{
|
|
Expand: person2.Id,
|
|
ChangeTopic: person3.Id,
|
|
},
|
|
},
|
|
releasingParticipantId: person1.Id,
|
|
expected: Room{
|
|
Name: "test",
|
|
CurrentSpeaker: PersonId(0),
|
|
Paricipants: []PersonId{
|
|
person1.Id,
|
|
person2.Id,
|
|
person3.Id,
|
|
person4.Id,
|
|
},
|
|
ParticipantHands: map[PersonId]HandGesture{},
|
|
Marks: map[HandGesture]PersonId{},
|
|
},
|
|
}
|