diff --git a/session/events_test.go b/session/events_test.go new file mode 100644 index 00000000..a4f96fab --- /dev/null +++ b/session/events_test.go @@ -0,0 +1,301 @@ +package session + +import ( + "sync" + "testing" + "time" +) + +func TestNewEvent(t *testing.T) { + + type args struct { + tag string + data interface{} + } + tests := []struct { + name string + args args + want Event + }{ + { + name: "Create new event with nil data", + args: args{"tag", nil}, + want: Event{Tag: "tag", Data: nil}, + }, + { + name: "Create new event with string data", + args: args{"tag", "test string"}, + want: Event{Tag: "tag", Data: "test string"}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := NewEvent(tt.args.tag, tt.args.data) + if got.Data != tt.args.data { + t.Errorf("Expected %+v data, got %+v", tt.args.data, got.Data) + } + if got.Tag != tt.args.tag { + t.Errorf("Expected %+v Tag, got %+v", tt.args.tag, got.Tag) + } + }) + } +} + +func TestNewEventPool(t *testing.T) { + type args struct { + debug bool + silent bool + } + tests := []struct { + name string + args args + want *EventPool + }{ + { + name: "Test creating debug event pool", + args: args{true, false}, + want: &EventPool{debug: true, silent: false}, + }, + { + name: "Test creating silent and event pool", + args: args{true, false}, + want: &EventPool{debug: true, silent: false}, + }, + // { + // name: "Test creating silent and debug event pool", + // args: args{true, true}, + // want: nil, + // }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := NewEventPool(tt.args.debug, tt.args.silent) + if got == nil { + t.Fatal("NewEventPool() returned unexpected nil") + } + if got.silent != tt.want.silent { + t.Errorf("Didn't get correct silent var %v, want %v", got.silent, tt.want.silent) + } + }) + } +} + +func TestEventPool_SetSilent(t *testing.T) { + type fields struct { + Mutex sync.Mutex + debug bool + silent bool + events []Event + listeners []chan Event + } + type args struct { + s bool + } + tests := []struct { + name string + fields fields + args args + }{ + { + name: "Set silent on non-silent event pool", + fields: fields{silent: false, debug: false}, + args: args{s: true}, + }, + { + name: "Set silent on silent event pool", + fields: fields{silent: true, debug: false}, + args: args{s: true}, + }, + { + name: "Set non-silent on non-silent event pool", + fields: fields{silent: false, debug: false}, + args: args{s: false}, + }, + { + name: "Set silent on silent event pool", + fields: fields{silent: true, debug: false}, + args: args{s: false}, + }, + { + name: "Set silent on non-silent and debug event pool", + fields: fields{silent: false, debug: true}, + args: args{s: true}, + }, + { + name: "Set non-silent on non-silent and debug event pool", + fields: fields{silent: false, debug: true}, + args: args{s: false}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + p := &EventPool{ + Mutex: tt.fields.Mutex, + debug: tt.fields.debug, + silent: tt.fields.silent, + events: tt.fields.events, + listeners: tt.fields.listeners, + } + p.SetSilent(tt.args.s) + if p.silent != tt.args.s { + t.Error("p.SetSilent didn't set the eventpool to silent") + } + }) + } +} + +func TestEventPool_SetDebug(t *testing.T) { + type fields struct { + Mutex sync.Mutex + debug bool + silent bool + events []Event + listeners []chan Event + } + + type args struct { + s bool + } + + tests := []struct { + name string + fields fields + args args + }{ + { + name: "Set debug on non-debug event pool", + fields: fields{silent: false, debug: false}, + args: args{s: true}, + }, + { + name: "Set debug on debug event pool", + fields: fields{silent: false, debug: true}, + args: args{s: true}, + }, + { + name: "Set non-debug on non-debug event pool", + fields: fields{silent: false, debug: false}, + args: args{s: false}, + }, + { + name: "Set non-debug on debug event pool", + fields: fields{silent: false, debug: true}, + args: args{s: false}, + }, + { + name: "Set silent on non-silent and debug event pool", + fields: fields{silent: false, debug: true}, + args: args{s: true}, + }, + { + name: "Set non-silent on non-silent and debug event pool", + fields: fields{silent: false, debug: true}, + args: args{s: true}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + p := &EventPool{ + Mutex: tt.fields.Mutex, + debug: tt.fields.debug, + silent: tt.fields.silent, + events: tt.fields.events, + listeners: tt.fields.listeners, + } + p.SetDebug(tt.args.s) + if p.debug != tt.args.s { + t.Error("p.SetDebug didn't set the eventpool to debug") + } + }) + } +} + +func TestEventPool_Clear(t *testing.T) { + type fields struct { + Mutex sync.Mutex + debug bool + silent bool + events []Event + listeners []chan Event + } + + tests := []struct { + name string + fields fields + }{ + { + name: "Clear events on empty list", + fields: fields{debug: false, silent: false, events: []Event{}}, + }, + { + name: "Clear events", + fields: fields{debug: false, silent: false, events: []Event{{Tag: "meh", Data: "something", Time: time.Now()}}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + p := &EventPool{ + Mutex: tt.fields.Mutex, + debug: tt.fields.debug, + silent: tt.fields.silent, + events: tt.fields.events, + listeners: tt.fields.listeners, + } + p.Clear() + if len(p.events) != 0 { + t.Errorf("Expected empty list after clear, got %d", len(p.events)) + } + }) + } +} + +func TestEventPool_Add(t *testing.T) { + type fields struct { + Mutex sync.Mutex + debug bool + silent bool + events []Event + listeners []chan Event + } + type args struct { + tag string + data interface{} + } + tests := []struct { + name string + fields fields + args args + }{ + { + name: "Add event with nil data on empty event list", + fields: fields{debug: false, silent: false, events: []Event{}}, + args: args{tag: "tag with empty data", data: nil}, + }, + { + name: "Add event with nil data", + fields: fields{debug: false, silent: false, events: []Event{{Tag: "meh", Data: "something", Time: time.Now()}}}, + args: args{tag: "tag with empty data", data: nil}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + p := &EventPool{ + Mutex: tt.fields.Mutex, + debug: tt.fields.debug, + silent: tt.fields.silent, + events: tt.fields.events, + listeners: tt.fields.listeners, + } + eventsList := tt.fields.events[:] + // It's prepended + eventsList = append([]Event{{Tag: tt.args.tag, Data: tt.args.data}}, eventsList...) + p.Add(tt.args.tag, tt.args.data) + t.Logf("eventsList : %+v", eventsList) + for index, e := range eventsList { + if e.Tag != p.events[index].Tag { + t.Errorf("Tag mismatch, got %s want %s", p.events[index].Tag, e.Tag) + } + } + }) + } +}