"Tests for cmp() compatibility with CPython"
import UserDict
import unittest
from test import test_support

class CmpGeneralTestCase(unittest.TestCase):

    def test_type_crash(self):
        # Used to throw ArrayStoreException:
        # http://bugs.jython.org/issue1382
        class Configuration(object, UserDict.DictMixin):
            pass
        self.assertNotEqual(Configuration(), None)


class UnicodeDerivedCmp(unittest.TestCase):
    "Test for http://bugs.jython.org/issue1889394"
    def testCompareWithString(self):
        class Test(unicode):
            pass
        test = Test('{1:1}')
        self.assertNotEqual(test, {1:1})
    def testCompareEmptyDerived(self):
        class A(unicode): pass
        class B(unicode): pass
        self.assertEqual(A(), B())


class LongDerivedCmp(unittest.TestCase):
    def testCompareWithString(self):
        class Test(long):
            pass
        self.assertNotEqual(Test(0), 'foo')
        self.assertTrue('foo' in [Test(12), 'foo'])


class IntStrCmp(unittest.TestCase):
    def testIntStrCompares(self):
        assert not (-1 > 'a')
        assert (-1 < 'a')
        assert not (4 > 'a')
        assert (4 < 'a')
        assert not (-2 > 'a')
        assert (-2 < 'a')
        assert not (-1 == 'a')


class CustomCmp(unittest.TestCase):
    def test___cmp___returns(self):
        class Foo(object):
            def __int__(self):
                return 0
        class Bar(object):
            def __int__(self):
                raise ValueError('doh')
        class Baz(object):
            def __cmp__(self, other):
                return self.cmp(other)
        baz = Baz()
        baz.cmp = lambda other : Foo()
        self.assertEqual(cmp(100, baz), 0)
        baz.cmp = lambda other : NotImplemented
        # CPython is faulty here (returns 1)
        self.assertEqual(cmp(100, baz), -1 if test_support.is_jython else 1)
        baz.cmp = lambda other: Bar()
        self.assertRaises(ValueError, cmp, 100, baz)
        baz.cmp = lambda other: 1 / 0
        self.assertRaises(ZeroDivisionError, cmp, 100, baz)
        del Baz.__cmp__
        self.assertEqual(cmp(100, baz), -1)

    def test_cmp_stops_short(self):
        class Foo(object):
            __eq__ = lambda self, other: False
        class Bar(object):
            __eq__ = lambda self, other: True
        self.assertEqual(cmp(Foo(), Bar()), 1)


def test_main():
    test_support.run_unittest(
            CmpGeneralTestCase,
            UnicodeDerivedCmp,
            LongDerivedCmp,
            IntStrCmp,
            CustomCmp
            )


if __name__ == '__main__':
    test_main()
