mp.c: Accept `0x', `0o' and `0b' prefixes on strings with explicit base.
[catacomb-python] / t / t-mp.py
index ec84d74..9927c12 100644 (file)
--- a/t/t-mp.py
+++ b/t/t-mp.py
@@ -56,14 +56,17 @@ class TestMP (U.TestCase):
     me.assertEqual(C.MP(str(big)), big)
     me.assertEqual(C.MP('0x4eeb684a0954ec4ceb255e3e9778d41'), big)
     me.assertEqual(C.MP('4eeb684a0954ec4ceb255e3e9778d41', 16), big)
+    me.assertEqual(C.MP('0x4eeb684a0954ec4ceb255e3e9778d41', 16), big)
     me.assertEqual(C.MP('0b0', 16), 176) # not 0
 
     me.assertEqual(C.MP('047353320450112516611472622536175135706501'), big)
     me.assertEqual(C.MP('0o47353320450112516611472622536175135706501'), big)
     me.assertEqual(C.MP('047353320450112516611472622536175135706501', 8), big)
+    me.assertEqual(C.MP('0o47353320450112516611472622536175135706501', 8), big)
     me.assertEqual(C.MP('47353320450112516611472622536175135706501', 8), big)
 
     me.assertEqual(C.MP('0b100111011011001100000010001011'), 661438603)
+    me.assertEqual(C.MP('0b100111011011001100000010001011', 2), 661438603)
     me.assertEqual(C.MP('100111011011001100000010001011', 2), 661438603)
 
   def test_string(me):
@@ -71,7 +74,12 @@ class TestMP (U.TestCase):
     me.assertEqual(str(y), '6556380541834372447694561492436749633')
     me.assertEqual(repr(y), 'MP(6556380541834372447694561492436749633)')
     me.assertEqual(hex(y), '0x4eeb684a0954ec4ceb255e3e9778d41')
-    me.assertEqual(oct(y), '047353320450112516611472622536175135706501')
+    me.assertEqual(oct(y), T.py23('0', '0o') +
+                   '47353320450112516611472622536175135706501')
+    try: bin
+    except NameError: pass
+    else: me.assertEqual(bin(C.MP(661438603)),
+                         '0b100111011011001100000010001011')
 
   def test_number(me):
     x, y, m, zero = C.MP(169), C.MP(24), C.MP(205), C.MP(0)
@@ -149,6 +157,14 @@ class TestMP (U.TestCase):
     while z == z + 1: z *= 2.0
     me.assertNotEqual(C.MP(int(z)) + 1, z)
 
+  def test_strconv(me):
+    x, y = C.MP(169), "24"
+    for fn in [T.add, T.sub, T.div]:
+      me.assertRaises(TypeError, fn, x, y)
+      me.assertRaises(TypeError, fn, y, x)
+    me.assertEqual(x*y, 169*"24")
+    me.assertEqual(y*x, 169*"24")
+
   def test_bits(me):
     x, y, zero = C.MP(169), C.MP(-24), C.MP(0)
     me.assertTrue(x.testbit(0))
@@ -391,21 +407,25 @@ class TestGF (U.TestCase):
     me.assertEqual(C.GF(E(1, 4)), C.GF(1))
     me.assertRaises(TypeError, C.GF, E())
 
+    me.assertNotEqual(x, 5) # no implicit conversion to int
     me.assertEqual(int(x), 5)
     y = C.GF(0x4eeb684a0954ec4ceb255e3e9778d41)
     me.assertEqual(type(int(y)), T.long)
 
     me.assertEqual(C.GF('0x4eeb684a0954ec4ceb255e3e9778d41'), y)
     me.assertEqual(C.GF('4eeb684a0954ec4ceb255e3e9778d41', 16), y)
+    me.assertEqual(C.GF('0x4eeb684a0954ec4ceb255e3e9778d41', 16), y)
     me.assertEqual(C.GF('0b0', 16), C.GF(176)) # not 0
 
     me.assertEqual(C.GF('047353320450112516611472622536175135706501'), y)
     me.assertEqual(C.GF('0o47353320450112516611472622536175135706501'), y)
     me.assertEqual(C.GF('047353320450112516611472622536175135706501', 8), y)
+    me.assertEqual(C.GF('0o47353320450112516611472622536175135706501', 8), y)
     me.assertEqual(C.GF('47353320450112516611472622536175135706501', 8), y)
 
     t = C.GF(661438603)
     me.assertEqual(C.GF('0b100111011011001100000010001011'), t)
+    me.assertEqual(C.GF('0b100111011011001100000010001011', 2), t)
     me.assertEqual(C.GF('100111011011001100000010001011', 2), t)
 
   def test_string(me):
@@ -413,7 +433,12 @@ class TestGF (U.TestCase):
     me.assertEqual(str(y), '0x4eeb684a0954ec4ceb255e3e9778d41')
     me.assertEqual(repr(y), 'GF(0x4eeb684a0954ec4ceb255e3e9778d41)')
     me.assertEqual(hex(y), '0x4eeb684a0954ec4ceb255e3e9778d41')
-    me.assertEqual(oct(y), '047353320450112516611472622536175135706501')
+    me.assertEqual(oct(y), T.py23('0', '0o') +
+                   '47353320450112516611472622536175135706501')
+    try: bin
+    except NameError: pass
+    else: me.assertEqual(bin(C.GF(661438603)),
+                         '0b100111011011001100000010001011')
 
   def test_number(me):
     x, y, m, zero = C.GF(0xa9), C.GF(0x18), C.GF(0x11b), C.GF(0)