diff options
Diffstat (limited to 'tests/papod_test.go')
-rw-r--r-- | tests/papod_test.go | 342 |
1 files changed, 342 insertions, 0 deletions
diff --git a/tests/papod_test.go b/tests/papod_test.go index efac1bc..9b7cd9f 100644 --- a/tests/papod_test.go +++ b/tests/papod_test.go @@ -1,16 +1,358 @@ package papo_test import ( + "bufio" "bytes" "encoding/json" "fmt" "log/slog" + "reflect" + "strings" "testing" "euandre.org/papo/src" ) +func errorIf(t *testing.T, err error) { + if err != nil { + t.Errorf("Unexpected error: %#v\n", err) + } +} + +func assertEqual(t *testing.T, given any, expected any) { + if !reflect.DeepEqual(given, expected) { + t.Errorf("given != expected") + t.Errorf("given: %#v\n", given) + t.Errorf("expected: %#v\n", expected) + } +} + +func TestSplitOnCRLF(t *testing.T) { + inputs := []string { + "", + "\r\n", + "abc\r\n", + "abc\r\n ", + "abc\r\n \r\n", + " \r\n \r\n", + "aaa\r\nbbb\r\nccc\r\n", + "\r\nsplit \r \n CRLF\r\n\r\n", + } + expected := [][]string { + nil, + { "" }, + { "abc" }, + { "abc" }, + { "abc", " " }, + { " ", " " }, + { "aaa", "bbb", "ccc" }, + { "", "split \r \n CRLF", "" }, + } + given := make([][]string, len(inputs)) + + for i, input := range inputs { + scanner := bufio.NewScanner(strings.NewReader(input)) + scanner.Split(papo.SplitOnCRLF) + for scanner.Scan() { + given[i] = append(given[i], scanner.Text()) + } + + err := scanner.Err() + errorIf(t, err) + } + + assertEqual(t, given, expected) +} + +func TestSplitOnRawMessage(t *testing.T) { + inputs := []string { + "first message\r\nsecond message\r\n", + "message 1\r\n\r\nmessage 2\r\n\r\nignored", + } + expected := [][]string { + { "first message", "second message" }, + { "message 1", "message 2" }, + } + given := make([][]string, len(inputs)) + + for i, input := range inputs { + scanner := bufio.NewScanner(strings.NewReader(input)) + scanner.Split(papo.SplitOnRawMessage) + for scanner.Scan() { + given[i] = append(given[i], scanner.Text()) + } + + err := scanner.Err() + errorIf(t, err) + } + + assertEqual(t, given, expected) +} + +func TestParseMessageParams(t *testing.T) { + inputs := []string { + "", + " ", + " :", + " : ", + ": ", + ": ", + " : ", + " :", + " :", + "a", + "ab", + "a b", + "a b c", + "a b:c", + "a b:c:", + "a b :c", + "a b :c:", + "a b :c ", + "a b : c", + "a b : c ", + "a b : c :", + "a b : c : ", + "a b : c :d", + "a b : c :d ", + "a b : c : d ", + } + expected := []papo.MessageParams { + papo.MessageParams { + Middle: []string { }, + Trailing: "", + }, + papo.MessageParams { + Middle: []string { }, + Trailing: "", + }, + papo.MessageParams { + Middle: []string { }, + Trailing: "", + }, + papo.MessageParams { + Middle: []string { }, + Trailing: " ", + }, + papo.MessageParams { + Middle: []string { ":" }, + Trailing: "", + }, + papo.MessageParams { + Middle: []string { ":" }, + Trailing: "", + }, + papo.MessageParams { + Middle: []string { }, + Trailing: " ", + }, + papo.MessageParams { + Middle: []string { }, + Trailing: "", + }, + papo.MessageParams { + Middle: []string { }, + Trailing: "", + }, + papo.MessageParams { + Middle: []string { "a" }, + Trailing: "", + }, + papo.MessageParams { + Middle: []string { "ab" }, + Trailing: "", + }, + papo.MessageParams { + Middle: []string { "a", "b" }, + Trailing: "", + }, + papo.MessageParams { + Middle: []string { "a", "b", "c" }, + Trailing: "", + }, + papo.MessageParams { + Middle: []string { "a", "b:c" }, + Trailing: "", + }, + papo.MessageParams { + Middle: []string { "a", "b:c:" }, + Trailing: "", + }, + papo.MessageParams { + Middle: []string { "a", "b" }, + Trailing: "c", + }, + papo.MessageParams { + Middle: []string { "a", "b" }, + Trailing: "c:", + }, + papo.MessageParams { + Middle: []string { "a", "b" }, + Trailing: "c ", + }, + papo.MessageParams { + Middle: []string { "a", "b" }, + Trailing: " c", + }, + papo.MessageParams { + Middle: []string { "a", "b" }, + Trailing: " c ", + }, + papo.MessageParams { + Middle: []string { "a", "b" }, + Trailing: " c :", + }, + papo.MessageParams { + Middle: []string { "a", "b" }, + Trailing: " c : ", + }, + papo.MessageParams { + Middle: []string { "a", "b" }, + Trailing: " c :d", + }, + papo.MessageParams { + Middle: []string { "a", "b" }, + Trailing: " c :d ", + }, + papo.MessageParams { + Middle: []string { "a", "b" }, + Trailing: " c : d ", + }, + } + given := make([]papo.MessageParams, len(inputs)) + + for i, input := range inputs { + given[i] = papo.ParseMessageParams(input) + } + + assertEqual(t, given, expected) +} + +func TestParseMessage(t *testing.T) { + inputs := []string { + "NICK joebloe ", + "USER joebloe 0.0.0.0 joe :Joe Bloe", + ":pre USER joebloe 0.0.0.0 joe :Joe Bloe", + ":pre USER joebloe 0.0.0.0 joe : Joe Bloe ", + ":pre USER joebloe: 0:0:0:0 joe::a: : Joe Bloe ", + ":pre USER :Joe Bloe", + ":pre USER : Joe Bloe", + ":pre USER : Joe Bloe", + ":pre USER : ", + ":pre USER :", + } + expected := []papo.Message { + papo.Message { + Prefix: "", + Command: "NICK", + Params: papo.MessageParams { + Middle: []string { "joebloe" }, + Trailing: "", + }, + Raw: "NICK joebloe ", + }, + papo.Message { + Prefix: "", + Command: "USER", + Params: papo.MessageParams { + Middle: []string { + "joebloe", "0.0.0.0", "joe", + }, + Trailing: "Joe Bloe", + }, + Raw: "USER joebloe 0.0.0.0 joe :Joe Bloe", + }, + papo.Message { + Prefix: "pre", + Command: "USER", + Params: papo.MessageParams { + Middle: []string { + "joebloe", "0.0.0.0", "joe", + }, + Trailing: "Joe Bloe", + }, + Raw: ":pre USER joebloe 0.0.0.0 joe :Joe Bloe", + }, + papo.Message { + Prefix: "pre", + Command: "USER", + Params: papo.MessageParams { + Middle: []string { + "joebloe", "0.0.0.0", "joe", + }, + Trailing: " Joe Bloe ", + }, + Raw: ":pre USER joebloe 0.0.0.0 joe : Joe Bloe ", + }, + papo.Message { + Prefix: "pre", + Command: "USER", + Params: papo.MessageParams { + Middle: []string { + "joebloe:", "0:0:0:0", "joe::a:", + }, + Trailing: " Joe Bloe ", + }, + Raw: ":pre USER joebloe: 0:0:0:0 joe::a: : Joe Bloe ", + }, + papo.Message { + Prefix: "pre", + Command: "USER", + Params: papo.MessageParams { + Middle: []string { }, + Trailing: "Joe Bloe", + }, + Raw: ":pre USER :Joe Bloe", + }, + papo.Message { + Prefix: "pre", + Command: "USER", + Params: papo.MessageParams { + Middle: []string { }, + Trailing: " Joe Bloe", + }, + Raw: ":pre USER : Joe Bloe", + }, + papo.Message { + Prefix: "pre", + Command: "USER", + Params: papo.MessageParams { + Middle: []string { }, + Trailing: " Joe Bloe", + }, + Raw: ":pre USER : Joe Bloe", + }, + papo.Message { + Prefix: "pre", + Command: "USER", + Params: papo.MessageParams { + Middle: []string { }, + Trailing: " ", + }, + Raw: ":pre USER : ", + }, + papo.Message { + Prefix: "pre", + Command: "USER", + Params: papo.MessageParams { + Middle: []string { }, + Trailing: "", + }, + Raw: ":pre USER :", + }, + } + given := make([]papo.Message, len(inputs)) + + for i, input := range inputs { + parsed, err := papo.ParseMessage(input) + errorIf(t, err) + given[i] = parsed + } + + assertEqual(t, given, expected) +} + func TestSetLoggerOutput(t *testing.T) { return type entry struct { |