1// Copyright (c) 2018 Shivaram Lingamneni <slingamn@cs.stanford.edu>
2// released under the MIT license
3
4package irc
5
6import (
7	"testing"
8)
9
10func makeTestWhowas(nick string) WhoWas {
11	cfnick, err := CasefoldName(nick)
12	if err != nil {
13		panic(err)
14	}
15	return WhoWas{
16		nickCasefolded: cfnick,
17		nick:           nick,
18		username:       "user",
19		hostname:       "oragono.io",
20		realname:       "Real Name",
21	}
22}
23
24func TestWhoWas(t *testing.T) {
25	var results []WhoWas
26	var wwl WhoWasList
27	wwl.Initialize(3)
28	// test Find on empty list
29	results = wwl.Find("nobody", 10)
30	if len(results) != 0 {
31		t.Fatalf("incorrect whowas results: %v", results)
32	}
33
34	wwl.Append(makeTestWhowas("dan-"))
35	results = wwl.Find("nobody", 10)
36	if len(results) != 0 {
37		t.Fatalf("incorrect whowas results: %v", results)
38	}
39	results = wwl.Find("dan-", 10)
40	if len(results) != 1 || results[0].nick != "dan-" {
41		t.Fatalf("incorrect whowas results: %v", results)
42	}
43
44	wwl.Append(makeTestWhowas("slingamn"))
45	results = wwl.Find("slingamN", 10)
46	if len(results) != 1 || results[0].nick != "slingamn" {
47		t.Fatalf("incorrect whowas results: %v", results)
48	}
49
50	wwl.Append(makeTestWhowas("Dan-"))
51	results = wwl.Find("dan-", 10)
52	// reverse chronological order
53	if len(results) != 2 || results[0].nick != "Dan-" || results[1].nick != "dan-" {
54		t.Fatalf("incorrect whowas results: %v", results)
55	}
56	// 0 means no limit
57	results = wwl.Find("dan-", 0)
58	if len(results) != 2 || results[0].nick != "Dan-" || results[1].nick != "dan-" {
59		t.Fatalf("incorrect whowas results: %v", results)
60	}
61	// a limit of 1 should return the most recent entry only
62	results = wwl.Find("dan-", 1)
63	if len(results) != 1 || results[0].nick != "Dan-" {
64		t.Fatalf("incorrect whowas results: %v", results)
65	}
66
67	wwl.Append(makeTestWhowas("moocow"))
68	results = wwl.Find("moocow", 10)
69	if len(results) != 1 || results[0].nick != "moocow" {
70		t.Fatalf("incorrect whowas results: %v", results)
71	}
72	results = wwl.Find("dan-", 10)
73	// should have overwritten the original entry, leaving the second
74	if len(results) != 1 || results[0].nick != "Dan-" {
75		t.Fatalf("incorrect whowas results: %v", results)
76	}
77
78	// overwrite the second entry
79	wwl.Append(makeTestWhowas("enckse"))
80	results = wwl.Find("enckse", 10)
81	if len(results) != 1 || results[0].nick != "enckse" {
82		t.Fatalf("incorrect whowas results: %v", results)
83	}
84	results = wwl.Find("slingamn", 10)
85	if len(results) != 0 {
86		t.Fatalf("incorrect whowas results: %v", results)
87	}
88}
89
90func TestEmptyWhoWas(t *testing.T) {
91	// stupid edge case; setting an empty whowas buffer should not panic
92	var wwl WhoWasList
93	wwl.Initialize(0)
94	results := wwl.Find("slingamn", 10)
95	if len(results) != 0 {
96		t.Fatalf("incorrect whowas results: %v", results)
97	}
98	wwl.Append(makeTestWhowas("slingamn"))
99	results = wwl.Find("slingamn", 10)
100	if len(results) != 0 {
101		t.Fatalf("incorrect whowas results: %v", results)
102	}
103}
104