diff --git a/test/python/myextension.codon b/test/python/myextension.codon index 7bc97fdc..5fd4a277 100644 --- a/test/python/myextension.codon +++ b/test/python/myextension.codon @@ -29,6 +29,10 @@ class Vec: def nop(): return 'nop' + @property + def c(self): + return self.a + self.b + def __str__(self): return f'{self.tag}: <{self.a}, {self.b}>' @@ -41,7 +45,7 @@ class Vec: def __iadd__(self, other: Vec): self.a += other.a self.b += other.b - self.tag = f'({self.tag}+i+{other.tag})' + self.tag = f'({self.tag}+={other.tag})' return self def __add__(self, x: float): @@ -62,7 +66,7 @@ class Vec: def __isub__(self, other: Vec): self.a -= other.a self.b -= other.b - self.tag = f'({self.tag}+={other.tag})' + self.tag = f'({self.tag}-={other.tag})' return self def __mul__(self, x: float): @@ -194,7 +198,7 @@ class Vec: def __imatmul__(self, x: float): self.a *= x self.b *= x - self.tag = f'({self.tag}@{x})' + self.tag = f'({self.tag}@={x})' return self def __len__(self): @@ -269,3 +273,7 @@ class Vec: def __del__(self): Vec.d += 1 + + @property + def nd(self): + return Vec.d diff --git a/test/python/pyext.py b/test/python/pyext.py index 67eb7067..73c5ced2 100644 --- a/test/python/pyext.py +++ b/test/python/pyext.py @@ -11,6 +11,7 @@ y = m.Vec(100, 1000, tag='y') z = m.Vec(b=2.2, a=1.1) s = m.Vec(10) t = m.Vec(b=11) +r = m.Vec(3, 4) assert equal(x, 3.14, 4.2, 'x') assert equal(y, 100, 1000, 'y') @@ -31,7 +32,6 @@ else: assert str(x) == 'x: <3.14, 4.2>' assert repr(x) == "Vec(3.14, 4.2, 'x')" - # methods # ########### @@ -104,8 +104,137 @@ else: assert m.Vec.nop() == 'nop' assert x.nop() == 'nop' +assert y.c == 1100 + +# fields # +########## + +t.a = 99 +assert equal(t, 99, 11, 'v2') +t.tag = 't' +assert equal(t, 99, 11, 't') # magics # ########## +assert equal(+y, 100, 1000, '(+y)') +assert equal(-y, -100, -1000, '(-y)') +assert equal(~y, -101, -1001, '(~y)') +assert abs(r) == 5.0 +assert bool(y) +assert not bool(m.Vec()) +assert len(x) == 1 +assert len(x + y) == 5 +assert hash(y) == 1100 +assert equal(x + y, 103.14, 1004.2, '(x+y)') +try: + x + 'x' +except: + pass +else: + assert False +assert equal(x + y + y, 203.14, 2004.2, '((x+y)+y)') +assert equal(y + 50.5, 150.5, 1050.5, '(y+50.5)') +assert equal(y + 50, 150, 1050, '(y++50)') +# assert equal(50.5 + y, 150.5, 1050.5, '(y+50.5)') # support for r-magics? +assert equal(y - x, 96.86, 995.8, '(y-x)') +assert equal(y * 3.5, 350.0, 3500.0, '(y*3.5)') +assert equal(y // 3, 33, 333, '(y//3)') +assert equal(y / 2.5, 40.0, 400.0, '(y/2.5)') +try: + divmod(y, 1) +except ArithmeticError as e: + assert str(e) == 'no divmod' +else: + assert False +assert equal(y % 7, 2, 6, '(y%7)') +assert equal(y ** 2, 10000, 1000000, '(y**2)') +assert equal(y << 1, 200, 2000, '(y<<1)') +assert equal(y >> 2, 25, 250, '(y>>2)') +assert equal(y & 77, 68, 72, '(y&77)') +assert equal(y | 77, 109, 1005, '(y|77)') +assert equal(y ^ 77, 41, 933, '(y^77)') +assert y @ r == 4300 + +def dup(v): + return m.Vec(v.a, v.b, v.tag + '1') + +y1 = dup(y) +y1 += x +assert equal(y1, 103.14, 1004.2, '(y1+=x)') + +y1 = dup(y) +y1 += 1.5 +assert equal(y1, 101.5, 1001.5, '(y1+=1.5)') + +y1 = dup(y) +y1 -= x +assert equal(y1, 96.86, 995.8, '(y1-=x)') + +y1 = dup(y) +y1 *= 3.5 +assert equal(y1, 350.0, 3500.0, '(y1*=3.5)') + +y1 = dup(y) +y1 //= 3 +assert equal(y1, 33, 333, '(y1//=3)') + +y1 = dup(y) +y1 /= 2.5 +assert equal(y1, 40.0, 400.0, '(y1/=2.5)') + +y1 = dup(y) +y1 %= 7 +assert equal(y1, 2, 6, '(y1%=7)') + +y1 = dup(y) +y1 **= 2 +assert equal(y1, 10000, 1000000, '(y1**=2)') + +y1 = dup(y) +y1 <<= 1 +assert equal(y1, 200, 2000, '(y1<<=1)') + +y1 = dup(y) +y1 >>= 2 +assert equal(y1, 25, 250, '(y1>>=2)') + +y1 = dup(y) +y1 &= 77 +assert equal(y1, 68, 72, '(y1&=77)') + +y1 = dup(y) +y1 |= 77 +assert equal(y1, 109, 1005, '(y1|=77)') + +y1 = dup(y) +y1 ^= 77 +assert equal(y1, 41, 933, '(y1^=77)') + +y1 = dup(y) +y1 @= 3.5 +assert equal(y1, 350.0, 3500.0, '(y1@=3.5)') + +assert equal(y(), 100, 1000, '(y())') +assert x(2.2, 3.3) == (3.14, 2.2, 3.3) +assert y(3.3) == (100, 3.3, 2.22) +assert x(a=2.2, b=3.3) == (3.14, 2.2, 3.3) +assert x(2.2, b=3.3) == (3.14, 2.2, 3.3) +assert x(b=3.3, a=2.2) == (3.14, 2.2, 3.3) +assert x(a=2.2) == (3.14, 2.2, 2.22) +assert x(b=3.3) == (3.14, 1.11, 3.3) +assert y('foo') == (100.0, 1000.0, 'foo') + +assert x == x +assert x != y +assert r == m.Vec(3, 4, '?') +assert x < y +assert y > x +assert x <= y +assert y >= x +assert y <= y +assert x >= x + +assert list(iter(x)) == ['x'] +assert list(iter(x+y+y)) == list('((x+y)+y)')