1
0
mirror of https://github.com/exaloop/codon.git synced 2025-06-03 15:03:52 +08:00
codon/test/core/arithmetic.codon
A. R. Shajii 5613c1a84b
v0.16 (#335)
* Add Python extension lowering pass

* Add DocstringAttribute

* Add extension module codegen

* Handle different argument counts efficiently

* Add warnings to extension lowering

* Fix module name

* Fix extension codegen

* Fix argument check

* Auto-convert Codon exceptions to Python exceptions

* Fix #183

* Fix #162; Fix #135

* Fix #155

* Fix CPython interface in codegen

* Fix #191

* Fix #187

* Fix #189

* Generate object file in pyext mode

* Convert Codon exceptions to Python exceptions

* Fix vtable init; Fix failing tests on Linux

* Fix #190

* Fix #156

* Fix union routing

* Remove need for import python

* Automatic @export and wrapping for toplevel functions

* Reorganize API

* Add Python extension IR structs

* Add special calls for no-suspend yield-expr

* Add special calls for no-suspend yield-expr

* pyextension.h support [wip]

* pyextension.h support [wip]

* pyextension.h support

* pyextension.h support for toplevel functions

* clang-format

* Add PyFunction::nargs field

* Update pyextension codegen (WIP)

* SUpport nargs

* Add support for @pycapture

* PyType codegen (WIP)

* Py method codegen (WIP)

* Add type ptr hook

* Add getset codegen

* Add type alloc function

* Add type pointer hook codegen

* Re-organize codegen

* Add member codegen

* Update module init codegen

* Update module init codegen

* Add support for typePtrHook and new to/from_py hooks

* Fix extension codegen

* Fix init codegen

* Fix init codegen; add "tp_new" slot

* Fix type hook

* Add extra flags

* Specialized wrappers (PyType specs)

* Add static Python link option

* Fix C imports

* Add guards

* Remove unused field

* Python mode only when pyExt set

* Update python module

* Fix assert

* Update codegen/passes

* Fix tuple parsing in index expression

* Fix empty tuple unification

* Do not Cythonize underscore fns

* clang-format

* Fix switch

* Add Py support for cmp/setitem

* Add Py support for cmp/setitem

* Add type is support

* GetSet support

* clang-format

* GetSet support (fixes)

* Avoid useless vtable alloc

* Add iter support

* Fix size_t capture bug

* clang-format

* Fix POD type unification with tuples

* Add __try_from_py__ API

* Fix annotation

* Add static reflection methods (setattr; internal.static.*); refactor PyExt to python.codon; handle errors and kwargs in PyExt

* Python compat fixes

* Update Python object conversions

* Fix PyErrors

* clang-format; add copyright

* Add PyFunction::keywords field

* Fix JIT MRO handling; Refactor out Jupyter support

* Refactor out Jupyter support

* Add support for custom linking args (link=[]) to TOML plugins

* Fix tests

* Use g++ instead of gcc

* Fix Jupyter CMAKE

* Fix Jupyter CMAKE

* Add _PyArg_Parser definition

* Add complex64 type

* Add extra complex64 tests

* Fix Python calls; add staticenumerate

* Fix call

* Fix calls

* Update pyext wrappers

* Fix staticenumerate; Support static calls in tuple()

* Fix pyext routing

* Add add/mul for tuples

* clang-format

* Fix pyext codegen

* Fix wrap_multiple

* Add seq_alloc_atomic_uncollectable

* Fix default generics issue

* Add binary/ternary ops

* Fix missing generic issue

* Fix number slots

* Update pow

* Remove unnecessary pyobj

* Fix allocation

* Refactor errors

* Add test extension

* Fix formatting

* clang-format

* Fix getitem/setitem/delitem in pyext

* Fix pyext iterators

* Add builtin pow() (fix #294)

* Fix #244

* Fix #231

* Fix #229

* Fix #205

* Update docs

* Fix error message

* Add pyext tests

* Add pyext support for @property

* Add pyext support for toplevel fns and @tuple classes

* More pyext tests

* More pyext tests

* Fix file error checking

* More pyext tests

* Update pyext tests

* Update docs

* Add pyext test to CI

* Add pyext support for @tuple.__new__

* Add pyext support for @tuple.__new__

* Fix hetero-tuple issue with fn_overloads

* More pyext tests

* Bump versions

* Fix del magic in pyext

* Fix init magic for tuples in pyext

* Have test-pypi only run on develop branch

* Make exception type indices unnamed-addr

* Fix #316; Fix #317 (slash issue)

* Use uncollectible-alloc for vtable

* Fix #249

* Add pyext docs

* Fix #249; Fix clashing vtables; Fix super() and class_copy

* Add content-atomic type property instruction

* __contents_atomic__ support

* Update internal functions

* Use PIC when generating Python extension

* Cleanup

* Add Dockerfile & fix -fPIC

* Cleanup

* Fix setup.py

* Fix pyext fn iteration

* Fix CI

* clang-format

* Update long conversions in Py bridge

* Support wide-int to str conversions

* Fix test

* Add pow for arbitrary-width ints

* Fix Linux backtraces

* Cleanup

* Add more tests

* Fix docs; Remove tuple.__add__ for scalars

* Update docs

---------

Co-authored-by: Ibrahim Numanagić <ibrahimpasa@gmail.com>
2023-04-12 18:13:54 -04:00

145 lines
4.3 KiB
Python

@test
def t1():
assert 2 + 2 == 4
assert 3.14 * 2 == 6.28
assert 2 + 3*2 == 8
assert 1.0/0 == float('inf')
assert str(0.0/0) == 'nan'
assert 5 // 2 == 2
assert 5 / 2 == 2.5
assert 5.0 // 2.0 == 2
assert 5.0 / 2.0 == 2.5
assert 5 // 2.0 == 2
assert 5 / 2.0 == 2.5
assert 5.0 // 2 == 2
assert 5.0 / 2 == 2.5
assert int(Int[128](5) // Int[128](2)) == 2
assert Int[128](5) / Int[128](2) == 2.5
t1()
@test
def test_popcnt():
assert (42).popcnt() == 3
assert (123).popcnt() == 6
assert (0).popcnt() == 0
assert int.popcnt(-1) == 64
assert u8(-1).popcnt() == 8
assert (UInt[1024](0xfffffffffffffff3) * UInt[1024](0xfffffffffffffff3)).popcnt() == 4
assert UInt[128](-1).popcnt() == 128
test_popcnt()
@test
def test_conversions():
# int -> int, float, bool, str
assert int(-42) == -42
assert float(-42) == -42.0
assert bool(0) == False
assert bool(-1) == bool(1) == True
assert str(-42) == '-42'
# float -> int, float, bool, str
assert int(-4.2) == -4
assert int(4.2) == 4
assert float(-4.2) == -4.2
assert bool(0.0) == False
assert bool(-0.1) == bool(0.1) == True
assert str(-4.2) == '-4.2'
# bool -> int, float, bool, str
assert int(False) == 0
assert int(True) == 1
assert float(False) == 0.0
assert float(True) == 1.0
assert bool(False) == False
assert bool(True) == True
assert str(False) == 'False'
assert str(True) == 'True'
# byte -> int, float, bool, str
assert int(byte(42)) == 42
assert float(byte(42)) == 42.0
assert bool(byte(0)) == False
assert bool(byte(42)) == True
assert str(byte(42)) == '*'
# intN -> int, float, bool, str | N < 64
assert int(i32(-42)) == -42
assert float(i32(-42)) == -42.0
assert bool(i32(0)) == False
assert bool(i32(-1)) == bool(i32(1)) == True
assert str(i32(-42)) == '-42'
# intN -> int, float, bool, str | N == 64
assert int(Int[64](-42)) == -42
assert float(Int[64](-42)) == -42.0
assert bool(Int[64](0)) == False
assert bool(Int[64](-1)) == bool(Int[64](1)) == True
assert str(Int[64](-42)) == '-42'
# intN -> int, float, bool, str | N > 64
assert int(Int[80](-42)) == -42
assert float(Int[80](-42)) == -42.0
assert bool(Int[80](0)) == False
assert bool(Int[80](-1)) == bool(Int[80](1)) == True
assert str(Int[80](-42)) == '-42'
# uintN -> int, float, bool, str | N < 64
assert int(u32(42)) == 42
assert float(u32(42)) == 42.0
assert bool(u32(0)) == False
assert bool(u32(42)) == True
assert str(u32(42)) == '42'
# uintN -> int, float, bool, str | N == 64
assert int(UInt[64](42)) == 42
assert float(UInt[64](42)) == 42.0
assert bool(UInt[64](0)) == False
assert bool(UInt[64](42)) == True
assert str(UInt[64](42)) == '42'
# uintN -> int, float, bool, str | N > 64
assert int(UInt[80](42)) == 42
assert float(UInt[80](42)) == 42.0
assert bool(UInt[80](0)) == False
assert bool(Int[80](42)) == True
assert str(Int[80](42)) == '42'
test_conversions()
@test
def test_int_pow():
@nonpure
def f(n):
return n
assert f(3) ** f(2) == 9
assert f(27) ** f(7) == 10460353203
assert f(-27) ** f(7) == -10460353203
assert f(-27) ** f(6) == 387420489
assert f(1) ** f(0) == 1
assert f(1) ** f(1000) == 1
assert f(0) ** f(3) == 0
assert f(0) ** f(0) == 1
T1 = Int[512]
assert f(T1(3)) ** f(T1(2)) == T1(9)
assert f(T1(27)) ** f(T1(7)) == T1(10460353203)
assert f(T1(-27)) ** f(T1(7)) == T1(-10460353203)
assert f(T1(-27)) ** f(T1(6)) == T1(387420489)
assert f(T1(1)) ** f(T1(0)) == T1(1)
assert f(T1(1)) ** f(T1(1000)) == T1(1)
assert f(T1(0)) ** f(T1(3)) == T1(0)
assert f(T1(0)) ** f(T1(0)) == T1(1)
assert str(f(T1(31)) ** f(T1(31))) == '17069174130723235958610643029059314756044734431'
assert str(f(T1(-31)) ** f(T1(31))) == '-17069174130723235958610643029059314756044734431'
T2 = UInt[200]
assert f(T2(3)) ** f(T2(2)) == T2(9)
assert f(T2(27)) ** f(T2(7)) == T2(10460353203)
assert f(T2(1)) ** f(T2(0)) == T2(1)
assert f(T2(1)) ** f(T2(1000)) == T2(1)
assert f(T2(0)) ** f(T2(3)) == T2(0)
assert f(T2(0)) ** f(T2(0)) == T2(1)
assert str(f(T2(31)) ** f(T2(31))) == '17069174130723235958610643029059314756044734431'
test_int_pow()