| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- # Test cases for tuples (compile and run)
- [case testTuple]
- from typing import List, Optional, Tuple
- from typing import Tuple
- def f(x: Tuple[int, int]) -> Tuple[int,int]:
- return x
- def lurr(x: List[Optional[Tuple[int, str]]]) -> object:
- return x[0]
- def asdf(x: Tuple[int, str]) -> None:
- pass
- [file driver.py]
- from testutil import assertRaises
- from native import f, lurr, asdf
- assert f((1,2)) == (1, 2)
- assert lurr([(1, '2')]) == (1, '2')
- with assertRaises(TypeError):
- print(lurr([(1, 2)]))
- with assertRaises(TypeError):
- asdf((1, 2))
- [case testTupleGet]
- from typing import Tuple
- def f(x: Tuple[Tuple[int, bool], int]) -> int:
- return x[0][0]
- [file driver.py]
- from native import f
- print(f(((1,True),2)))
- big_number = pow(2, 80)
- print(f(((big_number,True),2)))
- [out]
- 1
- 1208925819614629174706176
- [case testSequenceTupleArg]
- from typing import Tuple
- def f(x: Tuple[int, ...]) -> int:
- return x[1]
- [file driver.py]
- from native import f
- print(f((1,2,3,4)))
- [out]
- 2
- [case testTupleAttr]
- from typing import Tuple
- class C:
- b: Tuple[Tuple[Tuple[int, int], int], int, str, object]
- c: Tuple[()]
- def f() -> None:
- c = C()
- c.b = (((1, 2), 2), 1, 'hi', 'hi2')
- print(c.b)
- def g() -> None:
- try:
- h()
- except Exception:
- print('caught the exception')
- def h() -> Tuple[Tuple[Tuple[int, int], int], int, str, object]:
- raise Exception('Intentional exception')
- [file driver.py]
- from native import f, g, C
- f()
- g()
- assert not hasattr(C(), 'c')
- [out]
- (((1, 2), 2), 1, 'hi', 'hi2')
- caught the exception
- [case testNamedTupleAttributeRun]
- from typing import NamedTuple
- NT = NamedTuple('NT', [('x', int), ('y', int)])
- def f(nt: NT) -> int:
- if nt.x > nt.y:
- return nt.x
- return nt.y
- nt = NT(1, 2)
- [file driver.py]
- from native import NT, nt, f
- assert f(nt) == 2
- assert f(NT(3, 2)) == 3
- class Sub(NT):
- pass
- assert f(Sub(3, 2)) == 3
- -- Ref: https://github.com/mypyc/mypyc/issues/924
- [case testNamedTupleClassSyntax]
- from typing import Dict, List, NamedTuple, Optional, Tuple, Union
- from typing_extensions import final
- class FuncIR: pass
- StealsDescription = Union[bool, List[bool]]
- class Record(NamedTuple):
- st_mtime: float
- st_size: int
- is_borrowed: bool
- hash: str
- python_path: Tuple[str, ...]
- type: 'ClassIR'
- method: FuncIR
- shadow_method: Optional[FuncIR]
- classes: Dict[str, 'ClassIR']
- steals: StealsDescription
- ordering: Optional[List[int]]
- extra_int_constants: List[Tuple[int]]
- # Make sure mypyc loads the annotation string for this forward reference.
- # Ref: https://github.com/mypyc/mypyc/issues/938
- class ClassIR: pass
- # Ref: https://github.com/mypyc/mypyc/issues/927
- @final
- class Inextensible(NamedTuple):
- x: int
- [file driver.py]
- from typing import ForwardRef, Optional
- from native import ClassIR, FuncIR, Record
- assert Record.__annotations__ == {
- 'st_mtime': float,
- 'st_size': int,
- 'is_borrowed': bool,
- 'hash': str,
- 'python_path': tuple,
- 'type': ForwardRef('ClassIR'),
- 'method': FuncIR,
- 'shadow_method': type,
- 'classes': dict,
- 'steals': type,
- 'ordering': type,
- 'extra_int_constants': list,
- }, Record.__annotations__
- [case testTupleOps]
- from typing import Tuple, List, Any, Optional
- from typing_extensions import Final
- def f() -> Tuple[()]:
- return ()
- def test_empty_tuple() -> None:
- assert f() == ()
- def f2() -> Any:
- return ()
- def test_empty_tuple_with_any_type():
- assert f2() == ()
- def f3() -> int:
- x = (False, 1)
- return x[1]
- def test_new_tuple() -> None:
- assert f3() == 1
- def f4(y: int) -> int:
- x = (False, y)
- return x[1]
- def test_new_tuple_boxed_int() -> None:
- big_number = 1208925819614629174706176
- assert f4(big_number) == big_number
- def f5(x: List[int]) -> int:
- return tuple(x)[1]
- def test_sequence_tuple() -> None:
- assert f5([1,2,3,4]) == 2
- def f6(x: List[int]) -> int:
- return len(tuple(x))
- def test_sequence_tuple_len() -> None:
- assert f6([1,2,3,4]) == 4
- def f7(x: List[Tuple[int, int]]) -> int:
- a, b = x[0]
- return a + b
- def test_unbox_tuple() -> None:
- assert f7([(5, 6)]) == 11
- # Test that order is irrelevant to unions. Really I only care that this builds.
- class A:
- pass
- def lol() -> A:
- return A()
- def foo(x: bool, y: bool) -> Tuple[Optional[A], bool]:
- z = lol()
- return None if y else z, x
- def test_slicing() -> None:
- # Use dummy adds to avoid constant folding
- zero = int()
- two = zero + 2
- s: Tuple[str, ...] = ("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")
- def f8(val: int) -> bool:
- return val % 2 == 0
- def test_sequence_generator() -> None:
- source_list = [1, 2, 3]
- a = tuple(f8(x) for x in source_list)
- assert a == (False, True, False)
- source_tuple: Tuple[int, ...] = (1, 2, 3)
- a = tuple(f8(x) for x in source_tuple)
- assert a == (False, True, False)
- source_fixed_length_tuple = (1, 2, 3, 4)
- a = tuple(f8(x) for x in source_fixed_length_tuple)
- assert a == (False, True, False, True)
- source_str = 'abbc'
- b = tuple('s:' + x for x in source_str)
- assert b == ('s:a', 's:b', 's:b', 's:c')
- TUPLE: Final[Tuple[str, ...]] = ('x', 'y')
- def test_final_boxed_tuple() -> None:
- t = TUPLE
- assert t == ('x', 'y')
|