diff --git a/test/callbacks_test.py b/test/callbacks_test.py new file mode 100644 index 000000000..582deb874 --- /dev/null +++ b/test/callbacks_test.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python + +### +# Copyright (c) 2002, Jeremiah Fincher +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions, and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions, and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the author of this software nor the name of +# contributors to this software may be used to endorse or promote products +# derived from this software without specific prior written consent. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +### + +from test import * + +import conf +import ircmsgs +import callbacks + +tokenize = callbacks.tokenize + + +class TokenizerTestCase(unittest.TestCase): + def testEmpty(self): + self.assertEqual(tokenize(''), []) + + def testSingleWord(self): + self.assertEqual(tokenize('foo'), ['foo']) + + def testMultipleSimpleWords(self): + words = 'one two three four five six seven eight'.split() + for i in range(len(words)): + self.assertEqual(tokenize(' '.join(words[:i])), words[:i]) + + def testSingleQuotesNotQuotes(self): + self.assertEqual(tokenize("it's"), ["it's"]) + + def testQuotedWords(self): + self.assertEqual(tokenize('"foo bar"'), ['foo bar']) + self.assertEqual(tokenize('""'), ['']) + self.assertEqual(tokenize('foo "" bar'), ['foo', '', 'bar']) + self.assertEqual(tokenize('foo "bar baz" quux'), + ['foo', 'bar baz', 'quux']) + + def testNesting(self): + self.assertEqual(tokenize('[]'), [[]]) + self.assertEqual(tokenize('[foo]'), [['foo']]) + self.assertEqual(tokenize('foo [bar]'), ['foo', ['bar']]) + self.assertEqual(tokenize('foo bar [baz quux]'), + ['foo', 'bar', ['baz', 'quux']]) + + def testError(self): + self.assertRaises(SyntaxError, tokenize, '[foo') #] + self.assertRaises(SyntaxError, tokenize, '"foo') #" + + +class FunctionsTestCase(unittest.TestCase): + def testCanonicalName(self): + self.assertEqual('foo', callbacks.canonicalName('foo')) + self.assertEqual('foobar', callbacks.canonicalName('foo-bar')) + self.assertEqual('foobar', callbacks.canonicalName('foo_bar')) + self.assertEqual('foobar', callbacks.canonicalName('FOO-bar')) + self.assertEqual('foobar', callbacks.canonicalName('FOOBAR')) + self.assertEqual('foobar', callbacks.canonicalName('foo___bar')) + self.assertEqual('foobar', callbacks.canonicalName('_f_o_o-b_a_r_')) + + def testAddressed(self): + oldprefixchars = conf.prefixChars + nick = 'supybot' + conf.prefixChars = '~!@' + inChannel = ['~foo', '@foo', '!foo', + '%s: foo' % nick, '%s foo' % nick] + inChannel = [ircmsgs.privmsg('#foo', s) for s in inChannel] + badmsg = ircmsgs.privmsg('#foo', '%s:foo' % nick) + self.failIf(callbacks.addressed(nick, badmsg)) + for msg in inChannel: + self.assertEqual('foo', callbacks.addressed(nick, msg), msg) + msg = ircmsgs.privmsg(nick, 'foo') + self.assertEqual('foo', callbacks.addressed(nick, msg)) + conf.prefixChars = oldprefixchars + + def testReply(self): + prefix = 'foo!bar@baz' + channelMsg = ircmsgs.privmsg('#foo', 'bar baz', prefix=prefix) + nonChannelMsg = ircmsgs.privmsg('supybot', 'bar baz', prefix=prefix) + self.assertEqual(ircmsgs.privmsg(nonChannelMsg.nick, 'foo'), + callbacks.reply(nonChannelMsg, 'foo')) + self.assertEqual(ircmsgs.privmsg(channelMsg.args[0], + '%s: foo' % channelMsg.nick), + callbacks.reply(channelMsg, 'foo')) diff --git a/test/irclib_test.py b/test/irclib_test.py new file mode 100644 index 000000000..06935fb8b --- /dev/null +++ b/test/irclib_test.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python + +### +# Copyright (c) 2002, Jeremiah Fincher +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions, and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions, and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the author of this software nor the name of +# contributors to this software may be used to endorse or promote products +# derived from this software without specific prior written consent. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +### + +from test import * + +import irclib +import ircmsgs + +class IrcMsgQueueTestCase(unittest.TestCase): + mode = ircmsgs.op('#foo', 'jemfinch') + msg = ircmsgs.privmsg('#foo', 'hey, you') + msgs = [ircmsgs.privmsg('#foo', str(i)) for i in range(10)] + kick = ircmsgs.kick('#foo', 'PeterB') + pong = ircmsgs.pong('123') + ping = ircmsgs.ping('123') + notice = ircmsgs.notice('jemfinch', 'supybot here') + + def testEmpty(self): + q = irclib.IrcMsgQueue() + self.failIf(q) + + def testEnqueueDequeue(self): + q = irclib.IrcMsgQueue() + q.enqueue(self.msg) + self.failUnless(q) + self.assertEqual(self.msg, q.dequeue()) + self.failIf(q) + q.enqueue(self.msg) + q.enqueue(self.notice) + self.assertEqual(self.msg, q.dequeue()) + self.assertEqual(self.notice, q.dequeue()) + for msg in self.msgs: + q.enqueue(msg) + for msg in self.msgs: + self.assertEqual(msg, q.dequeue()) + + def testPrioritizing(self): + q = irclib.IrcMsgQueue() + q.enqueue(self.msg) + q.enqueue(self.mode) + self.assertEqual(self.mode, q.dequeue()) + self.assertEqual(self.msg, q.dequeue()) + q.enqueue(self.msg) + q.enqueue(self.kick) + self.assertEqual(self.kick, q.dequeue()) + q.enqueue(self.ping) + q.enqueue(self.msg) + self.assertEqual(self.msg, q.dequeue()) + self.assertEqual(self.ping, q.dequeue()) + q.enqueue(self.ping) + q.enqueue(self.msgs[0]) + q.enqueue(self.kick) + q.enqueue(self.msgs[1]) + q.enqueue(self.mode) + self.assertEqual(self.kick, q.dequeue()) + self.assertEqual(self.mode, q.dequeue()) + self.assertEqual(self.msgs[0], q.dequeue()) + self.assertEqual(self.msgs[1], q.dequeue()) + self.assertEqual(self.ping, q.dequeue()) + + def testNoIdenticals(self): + q = irclib.IrcMsgQueue() + q.enqueue(self.msg) + q.enqueue(self.msg) + self.assertEqual(self.msg, q.dequeue()) + self.failIf(q) + +