if __name__ == '__main__':
    from   os.path import dirname, abspath, join
    import sys
    sys.path.append( abspath( join( dirname(__file__), '..' )))

import palm.convert
import unittest

class ConvertTests(unittest.TestCase):

    def test_str2bool_true_spelling(self):
        self.assertEqual( palm.convert.str2bool('true'),    True )
        self.assertEqual( palm.convert.str2bool('TRUE'),    True )
        self.assertEqual( palm.convert.str2bool('TrUe'),    True )

        self.assertEqual( palm.convert.str2bool('  true'),  True )
        self.assertEqual( palm.convert.str2bool('true  '),  True )
        self.assertEqual( palm.convert.str2bool(' true' ),  True )

    def test_str2bool_false_spelling(self):
        self.assertEqual( palm.convert.str2bool('false'),   False )
        self.assertEqual( palm.convert.str2bool('FALSE'),   False )
        self.assertEqual( palm.convert.str2bool('FaLsE'),   False )

        self.assertEqual( palm.convert.str2bool('  false'), False )
        self.assertEqual( palm.convert.str2bool('false  '), False )
        self.assertEqual( palm.convert.str2bool(' false' ), False )


    def test_str2bool_true_variants(self):
        self.assertEqual( palm.convert.str2bool('true'),    True )
        self.assertEqual( palm.convert.str2bool('yes'),     True )
        self.assertEqual( palm.convert.str2bool('on'),      True )

    def test_str2bool_false_variants(self):
        self.assertEqual( palm.convert.str2bool('false'),   False )
        self.assertEqual( palm.convert.str2bool('no'),      False )
        self.assertEqual( palm.convert.str2bool('off'),     False )


    def test_str2bool_fails(self):
        self.assertRaises(
            ValueError,
            palm.convert.str2bool,
            None
            )
        self.assertRaises(
            ValueError,
            palm.convert.str2bool,
            ''
            )
        self.assertRaises(
            ValueError,
            palm.convert.str2bool,
            'hello'
            )
        self.assertRaises(
            ValueError,
            palm.convert.str2bool,
            1234
            )


    def test_str2type(self):
        def assertValue( v, e, t ):
            self.assertEqual( v, e )
            self.assertEqual( type(v), t )

        assertValue( palm.convert.str2type(None), None, type(None) )

        assertValue( palm.convert.str2type('false'), False,   bool )
        assertValue( palm.convert.str2type('on'),    True,    bool )
        assertValue( palm.convert.str2type('YES'),   True,    bool )

        assertValue( palm.convert.str2type('1'),     1,       int )
        assertValue( palm.convert.str2type('0'),     0,       int )
        assertValue( palm.convert.str2type('-1234'), -1234,   int )

        assertValue( palm.convert.str2type('1.0'),     1.0,   float )
        assertValue( palm.convert.str2type('.0'),      0,     float )
        assertValue( palm.convert.str2type('-12.34'), -12.34, float )

        assertValue( palm.convert.str2type(''), '',           str )
        assertValue( palm.convert.str2type('hello'), 'hello', str )


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