Finish signed magnitude tests.
authorjbj <devnull@localhost>
Sat, 17 May 2003 02:34:45 +0000 (02:34 +0000)
committerjbj <devnull@localhost>
Sat, 17 May 2003 02:34:45 +0000 (02:34 +0000)
CVS patchset: 6851
CVS date: 2003/05/17 02:34:45

python/mpw/test/test_methods.py
python/rpmmpw-py.c
python/sub.py

index 04ef234..7ac4c5b 100644 (file)
@@ -3,22 +3,45 @@ Basic TestCases for BTree and hash DBs, with and without a DBEnv, with
 various DB flags, etc.
 """
 
-import os
-import sys
-import errno
-import shutil
-import string
-import tempfile
-from pprint import pprint
 import unittest
 
 import rpm
-import mpz
 
 from test_all import verbose
 
 DASH = '-'
 
+Methods = ( '__add__', '__sub__', '__mul__', '__div__', '__mod__', '__lshift__', '__rshift__', '__and__', '__xor__', '__or__')
+
+class Factory(object):
+    def __init__(self, false_self, method_name):
+       self.false_self = false_self
+       self.method_name = method_name
+
+    def __call__(self, val):
+       xself = long(self.false_self)
+       yself = int(self.false_self)
+       xm = long.__getattribute__(xself, self.method_name)
+       ym = rpm.mpw.__getattribute__(yself, self.method_name)
+       xa = xm(long(val))
+       ya = ym(int(val))
+       print "  Comparing", xa, ya
+       assert xa == ya
+       return xa
+
+class Long(long):
+    def __getattribute__(self, name):
+       print "__getattribute__ ~%s~" % name
+       if name not in ('__add__', '__sub__'):
+           return long.getattr(self, name)
+        return Factory(self, name)
+
+#a1 = Bar(1)
+#a2 = Bar(2)
+#print a1.__add__(a2)
+#print "Done"
+#print a1 + a2
+
 #----------------------------------------------------------------------
 
 class BasicTestCase(unittest.TestCase):
@@ -51,6 +74,9 @@ class BasicTestCase(unittest.TestCase):
        wa = rpm.mpw(self.a)
        wb = rpm.mpw(self.b)
        wc = rpm.mpw(self.c)
+#      xa - Long(self.a)
+#      xb = Long(self.b)
+#      xc = Long(self.c)
        za = long(self.a)
        zb = long(self.b)
        zc = long(self.c)
@@ -135,10 +161,52 @@ class BasicTestCase(unittest.TestCase):
             print '\n', '-=' * 30
             print "Running %s.test03_Signs..." % \
                   self.__class__.__name__
-       a = 9876543210
-       wa = -rpm.mpw(a);
-       za = -long(a);
-       print "-9876543210:\t", wa, "\t",  za
+       wp = rpm.mpw(10)
+       wm = -wp
+       wpp = wp + 1
+       wmm = -wpp
+       zp = long(10)
+       zm = -zp
+       zpp = zp + 1
+       zmm = -zpp
+       print "add --:\t", (wm+wm), "\t", (zm+zm)
+       print "add -+:\t", (wm+wp), "\t", (zm+zp)
+       print "add +-:\t", (wp+wm), "\t", (zp+zm)
+       print "add ++:\t", (wp+wp), "\t", (zp+zp)
+       print "sub --:\t", (wm-wm), "\t", (zm-zm)
+       print "sub -+:\t", (wm-wp), "\t", (zm-zp)
+       print "sub +-:\t", (wp-wm), "\t", (zp-zm)
+       print "sub ++:\t", (wp-wp), "\t", (zp-zp)
+       print "mul --:\t", (wm*wm), "\t", (zm*zm)
+       print "mul -+:\t", (wm*wp), "\t", (zm*zp)
+       print "mul +-:\t", (wp*wm), "\t", (zp*zm)
+       print "mul ++:\t", (wp*wp), "\t", (zp*zp)
+       print "div --:\t", (wm/wm), "\t", (zm/zm)
+       print "div -+:\t", (wm/wp), "\t", (zm/zp)
+       print "div +-:\t", (wp/wm), "\t", (zp/zm)
+       print "div ++:\t", (wp/wp), "\t", (zp/zp)
+       print "pow --:\t", (wm**wm), "\t", (zm**zm)
+       print "pow -+:\t", (wm**wp), "\t", (zm**zp)
+       print "pow +-:\t", (wp**wm), "\t", (zp**zm)
+       print "pow ++:\t", (wp**wp), "\t", (zp**zp)
+
+       wpa = rpm.mpw(13)
+       wma = -wpa
+       wpb = wpa - 3
+       wmb = -wpb
+       zpa = long(13)
+       zma = -zpa
+       zpb = zpa - 3
+       zmb = -zpb
+       print "mod --:\t", (wma%wmb), "\t", (zma%zmb)
+       print "mod -+:\t", (wma%wpb), "\t", (zma%zpb)
+       print "mod +-:\t", (wpa%wmb), "\t", (zpa%zmb)
+       print "mod ++:\t", (wpa%wpb), "\t", (zpa%zpb)
+
+       print "rem --:\t", divmod(wma, wmb), "\t", divmod(zma, zmb)
+       print "rem -+:\t", divmod(wma, wpb), "\t", divmod(zma, zpb)
+       print "rem +-:\t", divmod(wpa, wmb), "\t", divmod(zpa, zmb)
+       print "rem ++:\t", divmod(wpa, wpb), "\t", divmod(zpa, zpb)
        pass
 
     #----------------------------------------
index f389985..4be45db 100644 (file)
@@ -1422,9 +1422,10 @@ fprintf(stderr, "sub ++: borrow\n");
     case '*':
        zsize = xsize + msize;
        zdata = alloca(zsize * sizeof(*zdata));
+       zsign = x->ob_size * m->ob_size;
        mpmul(zdata, xsize, xdata, msize, mdata);
        z = mpw_FromMPW(zsize, zdata, 1);
-       if (zsign)
+       if (zsign < 0)
            z->ob_size = -z->ob_size;
        break;
     case '/':
@@ -1437,6 +1438,7 @@ fprintf(stderr, "sub ++: borrow\n");
 
        zsize = asize + 1;
        zdata = alloca(zsize * sizeof(*zdata));
+       zsign = x->ob_size * m->ob_size;
        wksp = alloca((bsize+1) * sizeof(*wksp));
 
        shift = mpnorm(bsize, bdata);
@@ -1446,7 +1448,7 @@ fprintf(stderr, "sub ++: borrow\n");
        zsize -= bsize;
 
        z = mpw_FromMPW(zsize, zdata, 1);
-       if (zsign)
+       if (zsign < 0)
            z->ob_size = -z->ob_size;
        break;
     case '%':
@@ -1458,13 +1460,28 @@ fprintf(stderr, "sub ++: borrow\n");
 
        zsize = asize;
        zdata = alloca(zsize * sizeof(*zdata));
+       zsign = x->ob_size * m->ob_size;
        wksp = alloca((bsize+1) * sizeof(*wksp));
 
        mpnmod(zdata, asize, adata, bsize, bdata, wksp);
 
+       if (zsign < 0) {
+           if (m->ob_size < 0) {
+               (void) mpsubx(zsize, zdata, bsize, bdata);
+               mpneg(zsize, zdata);
+           } else {
+               zsign = 0;
+               mpneg(zsize, zdata);
+               (void) mpaddx(zsize, zdata, bsize, bdata);
+           }
+       }
        z = mpw_FromMPW(zsize, zdata, 1);
-       if (zsign)
+       if (zsign < 0) {
            z->ob_size = -z->ob_size;
+       } else if (zsign > 0) {
+           if (x->ob_size < 0)
+               z->ob_size = -z->ob_size;
+       }
        break;
     case '<':
        /* XXX FIXME: enlarge? negative count? sign?. */
@@ -1520,10 +1537,15 @@ fprintf(stderr, "sub ++: borrow\n");
     {  mpnumber zn;
 
        mpnzero(&zn);
-       mpnpow_w(&zn, xsize, xdata, msize, mdata);
+       if (msize == 0 || (msize == 1 && *mdata == 0))
+           mpnsetw(&zn, 1);
+       else if (m->ob_size < 0)
+           mpnsetw(&zn, 0);
+       else
+           mpnpow_w(&zn, xsize, xdata, msize, mdata);
        z = mpw_FromMPW(zn.size, zn.data, 1);
        mpnfree(&zn);
-       if (zsign)
+       if (zsign < 0)
            z->ob_size = -z->ob_size;
     }  break;
     case 'G':
@@ -1884,6 +1906,7 @@ mpw_divmod(PyObject * v, PyObject * w)
     size_t zsize;
     mpw* zdata;
     mpw* wksp;
+    int qsign = 0;
 
     if (a == NULL || b == NULL)
        goto exit;
@@ -1910,6 +1933,7 @@ mpw_divmod(PyObject * v, PyObject * w)
        bsize -= bnorm;
        bdata += bnorm;
     }
+    qsign = a->ob_size * b->ob_size;
     wksp = alloca((bsize+1) * sizeof(*wksp));
 
     mpndivmod(zdata, asize, adata, bsize, bdata, wksp);
@@ -1924,12 +1948,26 @@ fprintf(stderr, "    z %p[%d]:\t", zdata, zsize), mpfprintln(stderr, zsize, zdat
     r = mpw_FromMPW(bsize, zdata+zsize, 1);
     if (r == NULL)
        goto exit;
+    if (qsign < 0) {
+       if (b->ob_size < 0) {
+           (void) mpsubx(MPW_SIZE(r), MPW_DATA(r), bsize, bdata);
+           mpneg(MPW_SIZE(r), MPW_DATA(r));
+       } else {
+           mpneg(MPW_SIZE(r), MPW_DATA(r));
+           (void) mpaddx(MPW_SIZE(r), MPW_DATA(r), bsize, bdata);
+       }
+       (void) mpaddw(zsize, zdata, (mpw)1);
+    }
+    if (b->ob_size < 0)
+       r->ob_size = -r->ob_size;
 
     q = mpw_FromMPW(zsize, zdata, 1);
     if (q == NULL) {
        Py_DECREF(r);
        goto exit;
     }
+    if (qsign < 0)
+       q->ob_size = -q->ob_size;
 
 if (_mpw_debug) {
 prtmpw("q", q);
index 6ad57a7..e4230cb 100644 (file)
@@ -1,28 +1,53 @@
+import rpm
+
+rpm.mpw().Debug(1)
+
+Methods = ( '__neg__', '__pos__', '__abs__', '__invert__', '__add__', '__sub__', '__mul__', '__div__', '__mod__', '__divmod__', '__pow__', '__lshift__', '__rshift__', '__and__', '__xor__', '__or__')
+
 class Factory(object):
     def __init__(self, false_self, method_name):
        self.false_self = false_self
        self.method_name = method_name
 
     def __call__(self, val):
-       lself = long(self.false_self)
-       iself = int(self.false_self)
-       lm = long.__getattribute__(lself, self.method_name)
-       im = int.__getattribute__(iself, self.method_name)
-       la = lm(long(val))
-       ia = im(int(val))
-       print "  Comparing", la, ia
-       assert la == ia
-       return la
-
-class Bar(long):
+       xself = long(self.false_self)
+       yself = rpm.mpw(self.false_self)
+       xm = long.__getattribute__(xself, self.method_name)
+       ym = rpm.mpw.__getattribute__(yself, self.method_name)
+       xa = xm(long(val))
+       ya = ym(rpm.mpw(val))
+       print "  Comparing", self.method_name, type(xa), xa, type(ya), ya
+       assert xa == ya
+       return xa
+
+class Long(long):
     def __getattribute__(self, name):
        print "__getattribute__ ~%s~" % name
-       if name not in ('__add__', '__sub__', ):
+       if name not in Methods:
            return long.getattr(self, name)
         return Factory(self, name)
 
-a1 = Bar(1)
-a2 = Bar(2)
+a1 = Long(0x987654321)
+a2 = Long(0x10)
+a3 = Long(0x0fedcba000000000)
+
+#print a1.__neg__()
+#print a1.__pos__()
+#print a1.__abs__()
+#print a1.__invert__()
+
 print a1.__add__(a2)
-print "Done"
-print a1 + a2
+print a1.__sub__(a2)
+print a1.__mul__(a2)
+print a1.__div__(a2)
+print a1.__mod__(a2)
+
+#print a1.__divmod(a2)
+
+print a1.__pow__(a2)
+
+print a1.__lshift__(a2)
+print a1.__rshift__(a2)
+print a1.__and__(a3)
+print a1.__xor__(a3)
+print a1.__or__(a3)