#!/usr/bin/env python
'''
$Id: test_KeqV.py,v 1.4 2003/11/27 08:12:41 zen Exp $
'''

__rcs_id__  = '$Id: test_KeqV.py,v 1.4 2003/11/27 08:12:41 zen Exp $'
__version__ = '$Revision: 1.4 $'[11:-2]

import unittest, sys
sys.path.extend(('.', '..'))
from KeqV import KeqV, ParseError

class TestKeqV(unittest.TestCase):
    def test_basic(self):
        dm = KeqV('realm="foo",realm=bar')
        realms = dm.getList('realm')
        self.failUnlessEqual(realms, ['foo', 'bar'])

    def test_utf8(self):
        realm = u'\N{CENT SIGN}'
        self.failIfEqual(realm.encode('utf-8'), realm.encode('iso-8859-1'))
        message = 'realm="%s",charset=utf-8' % (realm,)
        dm = KeqV(message.encode('utf-8'))
        self.failUnlessEqual(dm.getValue('realm'), realm)

    def test_iso_8859_1(self):
        realm = u'\N{CENT SIGN}'
        self.failIfEqual(realm.encode('utf-8'), realm.encode('iso-8859-1'))
        message = 'realm="%s"' % (realm,)
        dm = KeqV(message.encode('iso-8859-1'))
        self.failUnlessEqual(dm.getValue('realm'), realm)
        self.assertRaises(
                ParseError, KeqV, realm.encode('utf-8')
                )

    def test_mutable(self):
        dm = KeqV('realm="foo",realm=bar')
        dm.getList('realm').pop()
        realms = dm.getList('realm')
        self.failUnlessEqual(realms, [u'foo',])

    def test_commavalue(self):
        dm = KeqV('realm="here, there & everywhere"')
        self.failUnlessEqual(len(dm), 1)
        realm = dm.getList('realm')
        self.failUnlessEqual(len(realm), 1)
        self.failUnlessEqual(realm[0], 'here, there & everywhere')

    def test_rfc2616(self):
        # Test less strict formats, such as those spewed by HTTP servers
        dm = KeqV(
                'foo=bar; spam="e g\\"g;s,", '
                'another=header missing=semicolon, lonetoken; missingvalue='
                )
        self.failUnlessEqual(dm.getValue('foo'), u'bar')
        self.failUnlessEqual(dm.getValue('spam'), u'e g"g;s,')
        self.failUnlessEqual(dm.getValue('another'), u'header')
        self.failUnlessEqual(dm.getValue('missing'), u'semicolon')
        self.failUnlessEqual(dm.getValue('lonetoken'), None)
        self.failUnlessEqual(dm.getValue('missingvalue'), '')

        self.failUnlessEqual(KeqV('foo bar=baz').getValue('foo'), None)
        self.failUnlessEqual(KeqV('foo bar=baz').getValue('bar'), u'baz')

    def test_quoting(self):
        dm = KeqV('realm="\\"laser\\""')
        realm = dm.getValue('realm')
        self.failUnlessEqual(realm, '"laser"')

    def test_None(self):
        self.failUnlessEqual(
                KeqV('realm').getValue('realm'), None
                )
        self.failUnlessEqual(
                KeqV('foo bar baz').getValue('foo'), None
                )
        self.failUnlessEqual(
                KeqV('foo bar baz').getValue('bar'), None
                )
        self.failUnlessEqual(
                KeqV('foo bar baz').getValue('baz'), None
                )

    def test_empty(self):
        self.failUnlessEqual(
                KeqV('realm=').getValue('realm'), ''
                )
        self.failUnlessEqual(
                KeqV('realm=""').getValue('realm'), ''
                )
        self.failUnlessEqual(
                KeqV('realm=,bar').getValue('realm'), ''
                )

    def test_ambiguous(self):
        self.failUnlessEqual(
                KeqV('foo= bar').getValue('foo'), u'bar'
                )
        self.assertRaises(
                KeyError, KeqV('foo= bar').getValue, u'bar'
                )

    def test_default(self):
        self.failUnlessRaises(
                KeyError, KeqV('foo').getValue, u'bar'
                )
        self.failUnlessEqual(KeqV('foo').getValue(u'bar', u'baz'), u'baz')
        self.failUnlessEqual(
                KeqV('foo').getValue(u'bar', default=u'baz'), u'baz'
                )

    def test_invalid(self):
        self.assertRaises(ParseError, KeqV, 'foo="')
        self.assertRaises(ParseError, KeqV, ',foo=bar')
        self.assertRaises(ParseError, KeqV, 'foo==bar')
        self.assertRaises(ParseError, KeqV, 'foo=bar=')
        self.assertRaises(ParseError, KeqV, ',')
        self.assertRaises(ParseError, KeqV, 'foo,,bar')
        self.assertRaises(ParseError, KeqV, 'foo==bar')


if __name__ == '__main__':
    unittest.main()

# vim: set filetype=python ts=4 sw=4 et si


