From 0f1913b1d039def4216c3228ba6c0a843f38ee6f Mon Sep 17 00:00:00 2001 From: "A. R. Shajii" Date: Thu, 30 Mar 2023 11:07:01 -0400 Subject: [PATCH] More pyext tests --- test/python/myextension.codon | 44 +++++++++++++++++++ test/python/pyext.py | 81 +++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) diff --git a/test/python/myextension.codon b/test/python/myextension.codon index 5fd4a277..d6ade89c 100644 --- a/test/python/myextension.codon +++ b/test/python/myextension.codon @@ -1,5 +1,32 @@ print('Hello from Codon') +def f1(a: float = 1.11, b: float = 2.22): + return (a, b) + +def f2(): + return ({1: 'one'}, {2}, [3]) + +def f3(x): + return x * 2 + +def f4(x): + return x + +@overload +def f4(a: float = 1.11, b: float = 2.22): + return f1(a=a, b=b) + +@overload +def f4(): + return ['f4()'] + +@overload +def f4(x: str): + return x, x + +def f5(): + pass + @dataclass(python=True) class Vec: a: float @@ -277,3 +304,20 @@ class Vec: @property def nd(self): return Vec.d + +def f6(x: float, t: str): + return Vec(x, x, t) + +@tuple +class Foo: + a: List[str] + x: Dict[str, int] + + def __new__(a: List[str]) -> Foo: + return (a, {s: i for i, s in enumerate(a)}) + + def __iter__(self): + return iter(self.a) + + def __repr__(self): + return f'Foo({self.a}, {self.x})' diff --git a/test/python/pyext.py b/test/python/pyext.py index 2cbfe916..82b48c83 100644 --- a/test/python/pyext.py +++ b/test/python/pyext.py @@ -3,6 +3,80 @@ import myext as m def equal(v, a, b, tag): return v.a == a and v.b == b and v.tag == tag +# functions # +############# + +assert m.f1(2.2, 3.3) == (2.2, 3.3) +assert m.f1(2.2, 3.3) == (2.2, 3.3) +assert m.f1(3.3) == (3.3, 2.22) +assert m.f1() == (1.11, 2.22) +assert m.f1(a=2.2, b=3.3) == (2.2, 3.3) +assert m.f1(2.2, b=3.3) == (2.2, 3.3) +assert m.f1(b=3.3, a=2.2) == (2.2, 3.3) +assert m.f1(a=2.2) == (2.2, 2.22) +assert m.f1(b=3.3) == (1.11, 3.3) + +try: + m.f1(1.1, 2.2, 3.3) +except: + pass +else: + assert False + +try: + m.f1(z=1) +except: + pass +else: + assert False + +assert m.f2() == ({1: 'one'}, {2}, [3]) + +try: + m.f2(1) +except: + pass +else: + assert False + +try: + m.f2(z=1, y=5) +except: + pass +else: + assert False + +assert m.f3(42) == 84 +assert m.f3(1.5) == 3.0 +assert m.f3('x') == 'xx' + +try: + m.f3(1, 2) +except: + pass +else: + assert False + +try: + m.f3(a=1, b=2) +except: + pass +else: + assert False + +assert m.f4() == ['f4()'] +assert m.f4(2.2, 3.3) == (2.2, 3.3) +assert m.f4(3.3) == (3.3, 2.22) +assert m.f4(a=2.2, b=3.3) == (2.2, 3.3) +assert m.f4(2.2, b=3.3) == (2.2, 3.3) +assert m.f4(b=3.3, a=2.2) == (2.2, 3.3) +assert m.f4(a=2.2) == (2.2, 2.22) +assert m.f4(b=3.3) == (1.11, 3.3) +assert m.f4('foo') == ('foo', 'foo') +assert m.f4({1}) == {1} +assert m.f5() is None +assert equal(m.f6(1.9, 't'), 1.9, 1.9, 't') + # constructors # ################ @@ -58,6 +132,13 @@ except: else: assert False +try: + x.foo(1, z=2) +except: + pass +else: + assert False + assert equal(x.bar(), 3.14, 4.2, 'x') assert equal(y.bar(), 100, 1000, 'y') assert equal(z.bar(), 1.1, 2.2, 'v0')