Permalink
Cannot retrieve contributors at this time
343 lines (303 sloc)
7.97 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # IRC parser tests | |
| # splitting messages into usable atoms | |
| # Written in 2015 by Daniel Oaks <daniel@danieloaks.net> | |
| # | |
| # To the extent possible under law, the author(s) have dedicated all copyright | |
| # and related and neighboring rights to this software to the public domain | |
| # worldwide. This software is distributed without any warranty. | |
| # | |
| # You should have received a copy of the CC0 Public Domain Dedication along | |
| # with this software. If not, see | |
| # <http://creativecommons.org/publicdomain/zero/1.0/>. | |
| # some of the tests here originate from grawity's test vectors, which is WTFPL v2 licensed | |
| # https://github.com/grawity/code/tree/master/lib/tests | |
| # some of the tests here originate from Mozilla's test vectors, which is public domain | |
| # https://dxr.mozilla.org/comm-central/source/chat/protocols/irc/test/test_ircMessage.js | |
| # some of the tests here originate from Sadie's test vectors, which she's indicated I am free to include here | |
| # https://github.com/SadieCat/ircparser-ruby/tree/master/test | |
| # we follow RFC1459 with regards to multiple ascii spaces splitting atoms: | |
| # The prefix, command, and all parameters are | |
| # separated by one (or more) ASCII space character(s) (0x20). | |
| # because doing it as RFC2812 says (strictly as a single ascii space) isn't sane | |
| tests: | |
| # input is the string coming directly from the server to parse | |
| # the atoms dict has the keys: | |
| # * tags: tags dict | |
| # tags with no value are an empty string | |
| # * source: source string, without single leading colon | |
| # * verb: verb string | |
| # * params: params split up as a list | |
| # if the params key does not exist, assume it is empty | |
| # if any other keys do no exist, assume they are null | |
| # a key that is null does not exist or is not specified with the | |
| # given input string | |
| # simple | |
| - input: "foo bar baz asdf" | |
| atoms: | |
| verb: "foo" | |
| params: | |
| - "bar" | |
| - "baz" | |
| - "asdf" | |
| # with source | |
| - input: ":coolguy foo bar baz asdf" | |
| atoms: | |
| source: "coolguy" | |
| verb: "foo" | |
| params: | |
| - "bar" | |
| - "baz" | |
| - "asdf" | |
| # with trailing param | |
| - input: "foo bar baz :asdf quux" | |
| atoms: | |
| verb: "foo" | |
| params: | |
| - "bar" | |
| - "baz" | |
| - "asdf quux" | |
| - input: "foo bar baz :" | |
| atoms: | |
| verb: "foo" | |
| params: | |
| - "bar" | |
| - "baz" | |
| - "" | |
| - input: "foo bar baz ::asdf" | |
| atoms: | |
| verb: "foo" | |
| params: | |
| - "bar" | |
| - "baz" | |
| - ":asdf" | |
| # with source and trailing param | |
| - input: ":coolguy foo bar baz :asdf quux" | |
| atoms: | |
| source: "coolguy" | |
| verb: "foo" | |
| params: | |
| - "bar" | |
| - "baz" | |
| - "asdf quux" | |
| - input: ":coolguy foo bar baz : asdf quux " | |
| atoms: | |
| source: "coolguy" | |
| verb: "foo" | |
| params: | |
| - "bar" | |
| - "baz" | |
| - " asdf quux " | |
| - input: ":coolguy PRIVMSG bar :lol :) " | |
| atoms: | |
| source: "coolguy" | |
| verb: "PRIVMSG" | |
| params: | |
| - "bar" | |
| - "lol :) " | |
| - input: ":coolguy foo bar baz :" | |
| atoms: | |
| source: "coolguy" | |
| verb: "foo" | |
| params: | |
| - "bar" | |
| - "baz" | |
| - "" | |
| - input: ":coolguy foo bar baz : " | |
| atoms: | |
| source: "coolguy" | |
| verb: "foo" | |
| params: | |
| - "bar" | |
| - "baz" | |
| - " " | |
| # with tags | |
| - input: "@a=b;c=32;k;rt=ql7 foo" | |
| atoms: | |
| verb: "foo" | |
| tags: | |
| "a": "b" | |
| "c": "32" | |
| "k": "" | |
| "rt": "ql7" | |
| # with escaped tags | |
| - input: "@a=b\\\\and\\nk;c=72\\s45;d=gh\\:764 foo" | |
| atoms: | |
| verb: "foo" | |
| tags: | |
| "a": "b\\and\nk" | |
| "c": "72 45" | |
| "d": "gh;764" | |
| # with tags and source | |
| - input: "@c;h=;a=b :quux ab cd" | |
| atoms: | |
| tags: | |
| "c": "" | |
| "h": "" | |
| "a": "b" | |
| source: "quux" | |
| verb: "ab" | |
| params: | |
| - "cd" | |
| # different forms of last param | |
| - input: ":src JOIN #chan" | |
| atoms: | |
| source: "src" | |
| verb: "JOIN" | |
| params: | |
| - "#chan" | |
| - input: ":src JOIN :#chan" | |
| atoms: | |
| source: "src" | |
| verb: "JOIN" | |
| params: | |
| - "#chan" | |
| # with and without last param | |
| - input: ":src AWAY" | |
| atoms: | |
| source: "src" | |
| verb: "AWAY" | |
| - input: ":src AWAY " | |
| atoms: | |
| source: "src" | |
| verb: "AWAY" | |
| # tab is not considered <SPACE> | |
| - input: ":cool\tguy foo bar baz" | |
| atoms: | |
| source: "cool\tguy" | |
| verb: "foo" | |
| params: | |
| - "bar" | |
| - "baz" | |
| # with weird control codes in the source | |
| - input: ":coolguy!ag@net\x035w\x03ork.admin PRIVMSG foo :bar baz" | |
| atoms: | |
| source: "coolguy!ag@net\x035w\x03ork.admin" | |
| verb: "PRIVMSG" | |
| params: | |
| - "foo" | |
| - "bar baz" | |
| - input: ":coolguy!~ag@n\x02et\x0305w\x0fork.admin PRIVMSG foo :bar baz" | |
| atoms: | |
| source: "coolguy!~ag@n\x02et\x0305w\x0fork.admin" | |
| verb: "PRIVMSG" | |
| params: | |
| - "foo" | |
| - "bar baz" | |
| - input: "@tag1=value1;tag2;vendor1/tag3=value2;vendor2/tag4= :irc.example.com COMMAND param1 param2 :param3 param3" | |
| atoms: | |
| tags: | |
| tag1: "value1" | |
| tag2: "" | |
| vendor1/tag3: "value2" | |
| vendor2/tag4: "" | |
| source: "irc.example.com" | |
| verb: "COMMAND" | |
| params: | |
| - "param1" | |
| - "param2" | |
| - "param3 param3" | |
| - input: ":irc.example.com COMMAND param1 param2 :param3 param3" | |
| atoms: | |
| source: "irc.example.com" | |
| verb: "COMMAND" | |
| params: | |
| - "param1" | |
| - "param2" | |
| - "param3 param3" | |
| - input: "@tag1=value1;tag2;vendor1/tag3=value2;vendor2/tag4 COMMAND param1 param2 :param3 param3" | |
| atoms: | |
| tags: | |
| tag1: "value1" | |
| tag2: "" | |
| vendor1/tag3: "value2" | |
| vendor2/tag4: "" | |
| verb: "COMMAND" | |
| params: | |
| - "param1" | |
| - "param2" | |
| - "param3 param3" | |
| - input: "COMMAND" | |
| atoms: | |
| verb: "COMMAND" | |
| # yaml encoding + slashes is fun | |
| - input: "@foo=\\\\\\\\\\:\\\\s\\s\\r\\n COMMAND" | |
| atoms: | |
| tags: | |
| foo: "\\\\;\\s \r\n" | |
| verb: "COMMAND" | |
| # broken messages from unreal | |
| - input: ":gravel.mozilla.org 432 #momo :Erroneous Nickname: Illegal characters" | |
| atoms: | |
| source: "gravel.mozilla.org" | |
| verb: "432" | |
| params: | |
| - "#momo" | |
| - "Erroneous Nickname: Illegal characters" | |
| - input: ":gravel.mozilla.org MODE #tckk +n " | |
| atoms: | |
| source: "gravel.mozilla.org" | |
| verb: "MODE" | |
| params: | |
| - "#tckk" | |
| - "+n" | |
| - input: ":services.esper.net MODE #foo-bar +o foobar " | |
| atoms: | |
| source: "services.esper.net" | |
| verb: "MODE" | |
| params: | |
| - "#foo-bar" | |
| - "+o" | |
| - "foobar" | |
| # tag values should be parsed char-at-a-time to prevent wayward replacements. | |
| - input: "@tag1=value\\\\ntest COMMAND" | |
| atoms: | |
| tags: | |
| tag1: "value\\ntest" | |
| verb: "COMMAND" | |
| # If a tag value has a slash followed by a character which doesn't need | |
| # to be escaped, the slash should be dropped. | |
| - input: "@tag1=value\\1 COMMAND" | |
| atoms: | |
| tags: | |
| tag1: "value1" | |
| verb: "COMMAND" | |
| # A slash at the end of a tag value should be dropped | |
| - input: "@tag1=value1\\ COMMAND" | |
| atoms: | |
| tags: | |
| tag1: "value1" | |
| verb: "COMMAND" | |
| # Duplicate tags: Parsers SHOULD disregard all but the final occurence | |
| - input: "@tag1=1;tag2=3;tag3=4;tag1=5 COMMAND" | |
| atoms: | |
| tags: | |
| tag1: "5" | |
| tag2: "3" | |
| tag3: "4" | |
| verb: "COMMAND" | |
| # vendored tags can have the same name as a non-vendored tag | |
| - input: "@tag1=1;tag2=3;tag3=4;tag1=5;vendor/tag2=8 COMMAND" | |
| atoms: | |
| tags: | |
| tag1: "5" | |
| tag2: "3" | |
| tag3: "4" | |
| vendor/tag2: "8" | |
| verb: "COMMAND" | |
| # Some parsers handle /MODE in a special way, make sure they do it right | |
| - input: ":SomeOp MODE #channel :+i" | |
| atoms: | |
| source: "SomeOp" | |
| verb: "MODE" | |
| params: | |
| - "#channel" | |
| - "+i" | |
| - input: ":SomeOp MODE #channel +oo SomeUser :AnotherUser" | |
| atoms: | |
| source: "SomeOp" | |
| verb: "MODE" | |
| params: | |
| - "#channel" | |
| - "+oo" | |
| - "SomeUser" | |
| - "AnotherUser" |