| # Test cases for lists (compile and run) |
| |
| [case testListPlusEquals] |
| from typing import Any |
| def append(x: Any) -> None: |
| x += [1] |
| |
| [file driver.py] |
| from native import append |
| x = [] |
| append(x) |
| assert x == [1] |
| |
| [case testListSum] |
| from typing import List |
| def sum(a: List[int], l: int) -> int: |
| sum = 0 |
| i = 0 |
| while i < l: |
| sum = sum + a[i] |
| i = i + 1 |
| return sum |
| [file driver.py] |
| from native import sum |
| print(sum([], 0)) |
| print(sum([3], 1)) |
| print(sum([5, 6, -4], 3)) |
| print(sum([2**128 + 5, -2**127 - 8], 2)) |
| [out] |
| 0 |
| 3 |
| 7 |
| 170141183460469231731687303715884105725 |
| |
| [case testListSet] |
| from typing import List |
| def copy(a: List[int], b: List[int], l: int) -> int: |
| i = 0 |
| while i < l: |
| a[i] = b[i] |
| i = i + 1 |
| return 0 |
| [file driver.py] |
| from native import copy |
| a = [0, ''] |
| copy(a, [-1, 5], 2) |
| print(1, a) |
| copy(a, [2**128 + 5, -2**127 - 8], 2) |
| print(2, a) |
| [out] |
| 1 [-1, 5] |
| 2 [340282366920938463463374607431768211461, -170141183460469231731687303715884105736] |
| |
| [case testSieve] |
| from typing import List |
| |
| def primes(n: int) -> List[int]: |
| a = [1] * (n + 1) |
| a[0] = 0 |
| a[1] = 0 |
| i = 0 |
| while i < n: |
| if a[i] == 1: |
| j = i * i |
| while j < n: |
| a[j] = 0 |
| j = j + i |
| i = i + 1 |
| return a |
| [file driver.py] |
| from native import primes |
| print(primes(3)) |
| print(primes(13)) |
| [out] |
| \[0, 0, 1, 1] |
| \[0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1] |
| |
| [case testListBuild] |
| def test_list_build() -> None: |
| # Currently LIST_BUILDING_EXPANSION_THRESHOLD equals to 10 |
| # long list built by list_build_op |
| l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] |
| l1.pop() |
| l1.append(100) |
| assert l1 == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100] |
| # short list built by Setmem |
| l2 = [1, 2] |
| l2.append(3) |
| l2.pop() |
| l2.pop() |
| assert l2 == [1] |
| # empty list |
| l3 = [] |
| l3.append('a') |
| assert l3 == ['a'] |
| |
| [case testListPrims] |
| from typing import List |
| |
| def test_append() -> None: |
| l = [1, 2] |
| l.append(10) |
| assert l == [1, 2, 10] |
| l.append(3) |
| l.append(4) |
| l.append(5) |
| assert l == [1, 2, 10, 3, 4, 5] |
| |
| def test_pop_last() -> None: |
| l = [1, 2, 10, 3, 4, 5] |
| l.pop() |
| l.pop() |
| assert l == [1, 2, 10, 3] |
| |
| def test_pop_index() -> None: |
| l = [1, 2, 10, 3] |
| l.pop(2) |
| assert l == [1, 2, 3] |
| l.pop(-2) |
| assert l == [1, 3] |
| |
| def test_count() -> None: |
| l = [1, 3] |
| assert l.count(1) == 1 |
| assert l.count(2) == 0 |
| |
| def test_insert() -> None: |
| l = [1, 3] |
| l.insert(0, 0) |
| assert l == [0, 1, 3] |
| l.insert(2, 2) |
| assert l == [0, 1, 2, 3] |
| l.insert(4, 4) |
| assert l == [0, 1, 2, 3, 4] |
| l.insert(-1, 5) |
| assert l == [0, 1, 2, 3, 5, 4] |
| l = [1, 3] |
| l.insert(100, 5) |
| assert l == [1, 3, 5] |
| l.insert(-100, 6) |
| assert l == [6, 1, 3, 5] |
| for long_int in 1 << 100, -(1 << 100): |
| try: |
| l.insert(long_int, 5) |
| except Exception as e: |
| # The error message is used by CPython |
| assert type(e).__name__ == 'OverflowError' |
| assert str(e) == 'Python int too large to convert to C ssize_t' |
| else: |
| assert False |
| |
| def test_sort() -> None: |
| l = [1, 4, 3, 6, -1] |
| l.sort() |
| assert l == [-1, 1, 3, 4, 6] |
| l.sort() |
| assert l == [-1, 1, 3, 4, 6] |
| l = [] |
| l.sort() |
| assert l == [] |
| |
| def test_reverse() -> None: |
| l = [1, 4, 3, 6, -1] |
| l.reverse() |
| assert l == [-1, 6, 3, 4, 1] |
| l.reverse() |
| assert l == [1, 4, 3, 6, -1] |
| l = [] |
| l.reverse() |
| assert l == [] |
| |
| def test_remove() -> None: |
| l = [1, 3, 4, 3] |
| l.remove(3) |
| assert l == [1, 4, 3] |
| l.remove(3) |
| assert l == [1, 4] |
| try: |
| l.remove(3) |
| except ValueError: |
| pass |
| else: |
| assert False |
| |
| def test_index() -> None: |
| l = [1, 3, 4, 3] |
| assert l.index(1) == 0 |
| assert l.index(3) == 1 |
| assert l.index(4) == 2 |
| try: |
| l.index(0) |
| except ValueError: |
| pass |
| else: |
| assert False |
| |
| [case testListOfUserDefinedClass] |
| class C: |
| x: int |
| |
| def f() -> int: |
| c = C() |
| c.x = 5 |
| a = [c] |
| d = a[0] |
| return d.x + 1 |
| |
| def g() -> int: |
| a = [C()] |
| a[0].x = 3 |
| return a[0].x + 4 |
| [file driver.py] |
| from native import f, g |
| print(f()) |
| print(g()) |
| [out] |
| 6 |
| 7 |
| |
| [case testListOps] |
| def test_slicing() -> None: |
| # Use dummy adds to avoid constant folding |
| zero = int() |
| two = zero + 2 |
| s = ["f", "o", "o", "b", "a", "r"] |
| assert s[two:] == ["o", "b", "a", "r"] |
| assert s[:two] == ["f", "o"] |
| assert s[two:-two] == ["o", "b"] |
| assert s[two:two] == [] |
| assert s[two:two + 1] == ["o"] |
| assert s[-two:] == ["a", "r"] |
| assert s[:-two] == ["f", "o", "o", "b"] |
| assert s[:] == ["f", "o", "o", "b", "a", "r"] |
| assert s[two:333] == ["o", "b", "a", "r"] |
| assert s[333:two] == [] |
| assert s[two:-333] == [] |
| assert s[-333:two] == ["f", "o"] |
| long_int: int = 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 |
| assert s[1:long_int] == ["o", "o", "b", "a", "r"] |
| assert s[long_int:] == [] |
| assert s[-long_int:-1] == ["f", "o", "o", "b", "a"] |
| |
| [case testOperatorInExpression] |
| |
| def tuple_in_int0(i: int) -> bool: |
| return i in [] |
| |
| def tuple_in_int1(i: int) -> bool: |
| return i in (1,) |
| |
| def tuple_in_int3(i: int) -> bool: |
| return i in (1, 2, 3) |
| |
| def tuple_not_in_int0(i: int) -> bool: |
| return i not in [] |
| |
| def tuple_not_in_int1(i: int) -> bool: |
| return i not in (1,) |
| |
| def tuple_not_in_int3(i: int) -> bool: |
| return i not in (1, 2, 3) |
| |
| def tuple_in_str(s: "str") -> bool: |
| return s in ("foo", "bar", "baz") |
| |
| def tuple_not_in_str(s: "str") -> bool: |
| return s not in ("foo", "bar", "baz") |
| |
| def list_in_int0(i: int) -> bool: |
| return i in [] |
| |
| def list_in_int1(i: int) -> bool: |
| return i in (1,) |
| |
| def list_in_int3(i: int) -> bool: |
| return i in (1, 2, 3) |
| |
| def list_not_in_int0(i: int) -> bool: |
| return i not in [] |
| |
| def list_not_in_int1(i: int) -> bool: |
| return i not in (1,) |
| |
| def list_not_in_int3(i: int) -> bool: |
| return i not in (1, 2, 3) |
| |
| def list_in_str(s: "str") -> bool: |
| return s in ("foo", "bar", "baz") |
| |
| def list_not_in_str(s: "str") -> bool: |
| return s not in ("foo", "bar", "baz") |
| |
| def list_in_mixed(i: object): |
| return i in [[], (), "", 0, 0.0, False, 0j, {}, set(), type] |
| |
| [file driver.py] |
| |
| from native import * |
| |
| assert not tuple_in_int0(0) |
| assert not tuple_in_int1(0) |
| assert tuple_in_int1(1) |
| assert not tuple_in_int3(0) |
| assert tuple_in_int3(1) |
| assert tuple_in_int3(2) |
| assert tuple_in_int3(3) |
| assert not tuple_in_int3(4) |
| |
| assert tuple_not_in_int0(0) |
| assert tuple_not_in_int1(0) |
| assert not tuple_not_in_int1(1) |
| assert tuple_not_in_int3(0) |
| assert not tuple_not_in_int3(1) |
| assert not tuple_not_in_int3(2) |
| assert not tuple_not_in_int3(3) |
| assert tuple_not_in_int3(4) |
| |
| assert tuple_in_str("foo") |
| assert tuple_in_str("bar") |
| assert tuple_in_str("baz") |
| assert not tuple_in_str("apple") |
| assert not tuple_in_str("pie") |
| assert not tuple_in_str("\0") |
| assert not tuple_in_str("") |
| |
| assert not list_in_int0(0) |
| assert not list_in_int1(0) |
| assert list_in_int1(1) |
| assert not list_in_int3(0) |
| assert list_in_int3(1) |
| assert list_in_int3(2) |
| assert list_in_int3(3) |
| assert not list_in_int3(4) |
| |
| assert list_not_in_int0(0) |
| assert list_not_in_int1(0) |
| assert not list_not_in_int1(1) |
| assert list_not_in_int3(0) |
| assert not list_not_in_int3(1) |
| assert not list_not_in_int3(2) |
| assert not list_not_in_int3(3) |
| assert list_not_in_int3(4) |
| |
| assert list_in_str("foo") |
| assert list_in_str("bar") |
| assert list_in_str("baz") |
| assert not list_in_str("apple") |
| assert not list_in_str("pie") |
| assert not list_in_str("\0") |
| assert not list_in_str("") |
| |
| assert list_in_mixed(0) |
| assert list_in_mixed([]) |
| assert list_in_mixed({}) |
| assert list_in_mixed(()) |
| assert list_in_mixed(False) |
| assert list_in_mixed(0.0) |
| assert not list_in_mixed([1]) |
| assert not list_in_mixed(object) |
| assert list_in_mixed(type) |
| |
| [case testListBuiltFromGenerator] |
| def test() -> None: |
| source_a = ["a", "b", "c"] |
| a = list(x + "f2" for x in source_a) |
| assert a == ["af2", "bf2", "cf2"] |
| source_b = [1, 2, 3, 4, 5] |
| b = [x * 2 for x in source_b] |
| assert b == [2, 4, 6, 8, 10] |
| source_c = [10, 20, 30] |
| c = [x + "f4" for x in (str(y) + "yy" for y in source_c)] |
| assert c == ["10yyf4", "20yyf4", "30yyf4"] |
| source_d = [True, False] |
| d = [not x for x in source_d] |
| assert d == [False, True] |
| source_e = [0, 1, 2] |
| e = list((x ** 2) for x in (y + 2 for y in source_e)) |
| assert e == [4, 9, 16] |
| source_str = "abcd" |
| f = list("str:" + x for x in source_str) |
| assert f == ["str:a", "str:b", "str:c", "str:d"] |
| [case testNextBug] |
| from typing import List, Optional |
| |
| def test(x: List[int]) -> None: |
| res = next((i for i in x), None) |