package ircmsg import ( "fmt" "reflect" "testing" ) type testcase struct { escaped string unescaped string } var tests = []testcase{ {"te\\nst", "te\nst"}, {"tes\\\\st", "tes\\st"}, {"te๐Ÿ˜ƒst", "te๐Ÿ˜ƒst"}, } var unescapeTests = []testcase{ {"te\\n\\kst", "te\nkst"}, {"te\\n\\kst\\", "te\nkst"}, {"te\\\\nst", "te\\nst"}, {"te๐Ÿ˜ƒst", "te๐Ÿ˜ƒst"}, {"0\\n1\\n2\\n3\\n4\\n5\\n6\\n\\", "0\n1\n2\n3\n4\n5\n6\n"}, {"test\\", "test"}, {"te\\:st\\", "te;st"}, {"te\\:\\st\\", "te; t"}, {"\\\\te\\:\\st", "\\te; t"}, {"test\\", "test"}, {"\\", ""}, {"", ""}, } func TestEscape(t *testing.T) { for _, pair := range tests { val := EscapeTagValue(pair.unescaped) if val != pair.escaped { t.Error( "For", pair.unescaped, "expected", pair.escaped, "got", val, ) } } } func TestUnescape(t *testing.T) { for _, pair := range tests { val := UnescapeTagValue(pair.escaped) if val != pair.unescaped { t.Error( "For", pair.escaped, "expected", pair.unescaped, "got", val, ) } } for _, pair := range unescapeTests { val := UnescapeTagValue(pair.escaped) if val != pair.unescaped { t.Error( "For", pair.escaped, "expected", pair.unescaped, "got", val, ) } } } func TestValidateTagName(t *testing.T) { if !validateTagName("c") { t.Error("c is valid") } if validateTagName("a_b") { t.Error("a_b is invalid") } } // tag string tests type testtags struct { raw string tags map[string]string } var tagdecodetests = []testtags{ {"", map[string]string{}}, {"time=12732;re", map[string]string{"time": "12732", "re": ""}}, {"time=12732;re=;asdf=5678", map[string]string{"time": "12732", "re": "", "asdf": "5678"}}, {"time=12732;draft/label=b;re=;asdf=5678", map[string]string{"time": "12732", "re": "", "asdf": "5678", "draft/label": "b"}}, {"=these;time=12732;=shouldbe;re=;asdf=5678;=ignored", map[string]string{"time": "12732", "re": "", "asdf": "5678"}}, {"dolphin=๐Ÿฌ;time=123456", map[string]string{"dolphin": "๐Ÿฌ", "time": "123456"}}, {"+dolphin=๐Ÿฌ;+draft/fox=f๐ŸฆŠx", map[string]string{"+dolphin": "๐Ÿฌ", "+draft/fox": "f๐ŸฆŠx"}}, {"+dolphin=๐Ÿฌ;+draft/f๐ŸฆŠx=fox", map[string]string{"+dolphin": "๐Ÿฌ"}}, {"+dolphin=๐Ÿฌ;+f๐ŸฆŠx=fox", map[string]string{"+dolphin": "๐Ÿฌ"}}, {"+dolphin=๐Ÿฌ;f๐ŸฆŠx=fox", map[string]string{"+dolphin": "๐Ÿฌ"}}, {"dolphin=๐Ÿฌ;f๐ŸฆŠx=fox", map[string]string{"dolphin": "๐Ÿฌ"}}, {"f๐ŸฆŠx=fox;+oragono.io/dolphin=๐Ÿฌ", map[string]string{"+oragono.io/dolphin": "๐Ÿฌ"}}, {"a=b;\\/=.", map[string]string{"a": "b"}}, } func parseTags(rawTags string) (map[string]string, error) { message, err := ParseLineStrict(fmt.Sprintf("@%s :shivaram TAGMSG #darwin\r\n", rawTags), true, 0) return message.AllTags(), err } func TestDecodeTags(t *testing.T) { for _, pair := range tagdecodetests { tags, err := parseTags(pair.raw) if err != nil { t.Error( "For", pair.raw, "Failed to parse line:", err, ) } if !reflect.DeepEqual(tags, pair.tags) { t.Error( "For", pair.raw, "expected", pair.tags, "got", tags, ) } } } var invalidtagdatatests = []string{ "label=\xff;batch=c", "label=a\xffb;batch=c", "label=a\xffb", "label=a\xff", "label=a\xff", "label=a\xf0a", } func TestTagInvalidUtf8(t *testing.T) { for _, tags := range invalidtagdatatests { _, err := ParseLineStrict(fmt.Sprintf("@%s PRIVMSG #chan hi\r\n", tags), true, 0) if err != ErrorInvalidTagContent { t.Errorf("") } } }