# Copyright (c) 2007-2009 The PyAMF Project.
# See LICENSE.txt for details.

"""
Tests for the adapters.util module.

@since: 0.4
"""

import unittest

from pyamf.adapters import util

# check for set function in python 2.3
import __builtin__

if not hasattr(__builtin__, 'set'):
    from sets import Set as set


class Iterable(object):
    """
    A generic iterable class that supports .. iterating.
    """

    def __init__(self, iterable):
        self.iterable = iterable

    def __iter__(self):
        return iter(self.iterable)

    def keys(self):
        return self.iterable.keys()

    def values(self):
        return self.iterable.values()

    def __getitem__(self, name):
        return self.iterable.__getitem__(name)


class HelperTestCase(unittest.TestCase):
    def setUp(self):
        self.encoder = object()

    def test_to_list(self):
        self.assertEquals(util.to_list(Iterable([1, 2, 3]), self.encoder), [1, 2, 3])
        self.assertEquals(util.to_list(['a', 'b'], self.encoder), ['a', 'b'])
        self.assertEquals(util.to_list('a', self.encoder), ['a'])

        obj = object()
        self.assertRaises(TypeError, util.to_list, obj, self.encoder)

    def test_to_set(self):
        self.assertEquals(util.to_set(Iterable([1, 2, 3]), self.encoder), set([1, 2, 3]))
        self.assertEquals(util.to_set(['a', 'b'], self.encoder), set(['a', 'b']))
        self.assertEquals(util.to_set('a', self.encoder), set('a'))

        obj = object()
        self.assertRaises(TypeError, util.to_set, obj, self.encoder)

    def test_to_dict(self):
        self.assertEquals(util.to_dict(Iterable({'a': 'b'}), self.encoder), {'a': 'b'})

        obj = object()
        self.assertRaises(TypeError, util.to_dict, obj, self.encoder)

    def test_to_tuple(self):
        self.assertEquals(util.to_tuple(Iterable((1, 2, 3)), self.encoder), (1, 2, 3))

        obj = object()
        self.assertRaises(TypeError, util.to_tuple, obj, self.encoder)


def suite():
    suite = unittest.TestSuite()

    suite.addTest(unittest.makeSuite(HelperTestCase))

    return suite


def main():
    unittest.main(defaultTest='suite')

if __name__ == '__main__':
    main()
