summaryrefslogtreecommitdiff
path: root/tests/basics
diff options
context:
space:
mode:
authorBenjamin Shockley <benjaminshockley@hotmail.com>2020-08-20 13:48:15 -0500
committerGitHub <noreply@github.com>2020-08-20 13:48:15 -0500
commit0084f0af24e4e219bc040c52ee723959423de6e2 (patch)
tree1aebdb362f08bf6417caa87836e3e4e739afc964 /tests/basics
parent9aebe2f1efc99871fcf283c304e3a8700050d736 (diff)
parent4d7b9cde33934a44c4c905a49d2f831339fc8bd2 (diff)
Merge pull request #2 from adafruit/master
Master
Diffstat (limited to 'tests/basics')
-rw-r--r--tests/basics/assign1.py1
-rw-r--r--tests/basics/bigint_array_overflow.py28
-rw-r--r--tests/basics/builtin_chr.py1
-rw-r--r--tests/basics/class_bytes.py9
-rw-r--r--tests/basics/dict1.py2
-rw-r--r--tests/basics/dict_popitem.py1
-rw-r--r--tests/basics/dict_setdefault.py2
-rw-r--r--tests/basics/exception1.py1
-rw-r--r--tests/basics/gen_yield_from.py.exp14
-rw-r--r--tests/basics/gen_yield_from_close.py.exp20
-rw-r--r--tests/basics/gen_yield_from_throw.py2
-rw-r--r--tests/basics/gen_yield_from_throw.py.exp6
-rw-r--r--tests/basics/gen_yield_from_throw2.py2
-rw-r--r--tests/basics/generator_close.py.exp10
-rw-r--r--tests/basics/generator_return.py2
-rw-r--r--tests/basics/int_big_and2.py4
-rw-r--r--tests/basics/int_big_and3.py4
-rw-r--r--tests/basics/int_big_error.py4
-rw-r--r--tests/basics/int_big_or.py8
-rw-r--r--tests/basics/int_big_or2.py4
-rw-r--r--tests/basics/int_big_or3.py4
-rw-r--r--tests/basics/int_big_xor.py8
-rw-r--r--tests/basics/int_big_xor2.py4
-rw-r--r--tests/basics/int_big_xor3.py4
-rw-r--r--tests/basics/int_bytes.py24
-rw-r--r--tests/basics/int_bytes_intbig.py18
-rw-r--r--tests/basics/int_longint_bytes.py1
-rw-r--r--tests/basics/parser.py.exp3
-rw-r--r--tests/basics/python34.py6
-rw-r--r--tests/basics/python34.py.exp1
-rw-r--r--tests/basics/set_iter.py1
-rw-r--r--tests/basics/set_pop.py2
-rw-r--r--tests/basics/smallint_array_overflow.py52
-rw-r--r--tests/basics/string_cr_conversion.py2
-rw-r--r--tests/basics/string_pep498_fstring.py113
-rw-r--r--tests/basics/string_pep498_fstring.py.exp0
-rw-r--r--tests/basics/struct_overflow.py47
-rw-r--r--tests/basics/subclass_native3.py4
-rw-r--r--tests/basics/subscr_tuple.py6
-rw-r--r--tests/basics/try_as_var.py2
40 files changed, 388 insertions, 39 deletions
diff --git a/tests/basics/assign1.py b/tests/basics/assign1.py
index 118747f74..01047fa92 100644
--- a/tests/basics/assign1.py
+++ b/tests/basics/assign1.py
@@ -8,4 +8,3 @@ print(a, b)
a = b = c = 3
print(a, b, c)
-
diff --git a/tests/basics/bigint_array_overflow.py b/tests/basics/bigint_array_overflow.py
new file mode 100644
index 000000000..0dd79c23d
--- /dev/null
+++ b/tests/basics/bigint_array_overflow.py
@@ -0,0 +1,28 @@
+import skip_if
+skip_if.no_bigint()
+
+try:
+ from array import array
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+def test_array_overflow(typecode, val):
+ try:
+ print(array(typecode, [val]))
+ except OverflowError:
+ print('OverflowError')
+
+# big int -1
+test_array_overflow('Q', -2**64 // 2**64)
+test_array_overflow('L', -2**64 // 2**64)
+test_array_overflow('I', -2**64 // 2**64)
+test_array_overflow('H', -2**64 // 2**64)
+test_array_overflow('B', -2**64 // 2**64)
+
+# big int 2**63
+test_array_overflow('q', 2**63)
+test_array_overflow('l', 2**63)
+test_array_overflow('i', 2**63)
+test_array_overflow('h', 2**63)
+test_array_overflow('b', 2**63)
diff --git a/tests/basics/builtin_chr.py b/tests/basics/builtin_chr.py
index 02d783ae6..c1a9f7053 100644
--- a/tests/basics/builtin_chr.py
+++ b/tests/basics/builtin_chr.py
@@ -6,4 +6,3 @@ try:
chr(0x110000)
except ValueError:
print("ValueError")
-
diff --git a/tests/basics/class_bytes.py b/tests/basics/class_bytes.py
new file mode 100644
index 000000000..75e2e7244
--- /dev/null
+++ b/tests/basics/class_bytes.py
@@ -0,0 +1,9 @@
+class C1:
+ def __init__(self, value):
+ self.value = value
+
+ def __bytes__(self):
+ return self.value
+
+c1 = C1(b"class 1")
+print(bytes(c1))
diff --git a/tests/basics/dict1.py b/tests/basics/dict1.py
index 20fa9def3..0cec51173 100644
--- a/tests/basics/dict1.py
+++ b/tests/basics/dict1.py
@@ -27,7 +27,7 @@ print({1:1} == {2:1})
try:
{}[0]
except KeyError as er:
- print('KeyError', er, repr(er), er.args)
+ print('KeyError', er, er.args)
# unsupported unary op
try:
diff --git a/tests/basics/dict_popitem.py b/tests/basics/dict_popitem.py
index e37bcec19..0e3384253 100644
--- a/tests/basics/dict_popitem.py
+++ b/tests/basics/dict_popitem.py
@@ -13,4 +13,3 @@ except KeyError:
else:
print("Did not raise KeyError")
print(sorted(els))
-
diff --git a/tests/basics/dict_setdefault.py b/tests/basics/dict_setdefault.py
index 57d0ba451..87de5b3af 100644
--- a/tests/basics/dict_setdefault.py
+++ b/tests/basics/dict_setdefault.py
@@ -9,5 +9,3 @@ d.pop(5)
print(d.setdefault(5, 1))
print(d[1])
print(d[5])
-
-
diff --git a/tests/basics/exception1.py b/tests/basics/exception1.py
index 739dd3275..d83764cb9 100644
--- a/tests/basics/exception1.py
+++ b/tests/basics/exception1.py
@@ -1,7 +1,6 @@
print(repr(IndexError()))
print(str(IndexError()))
-print(repr(IndexError("foo")))
print(str(IndexError("foo")))
a = IndexError(1, "test", [100, 200])
diff --git a/tests/basics/gen_yield_from.py.exp b/tests/basics/gen_yield_from.py.exp
new file mode 100644
index 000000000..507f2b9ca
--- /dev/null
+++ b/tests/basics/gen_yield_from.py.exp
@@ -0,0 +1,14 @@
+here1
+3
+here2
+[1, 2]
+here1
+None
+here2
+[1, 2]
+here1
+123
+here2
+[1, 2]
+444
+[0, 1, 2]
diff --git a/tests/basics/gen_yield_from_close.py.exp b/tests/basics/gen_yield_from_close.py.exp
new file mode 100644
index 000000000..a44d1353d
--- /dev/null
+++ b/tests/basics/gen_yield_from_close.py.exp
@@ -0,0 +1,20 @@
+-1
+1
+StopIteration
+-1
+1
+2
+leaf caught GeneratorExit and swallowed it
+delegating caught GeneratorExit
+StopIteration
+-1
+1
+2
+leaf caught GeneratorExit and raised StopIteration instead
+delegating caught GeneratorExit
+StopIteration
+123
+RuntimeError
+0
+1
+close
diff --git a/tests/basics/gen_yield_from_throw.py b/tests/basics/gen_yield_from_throw.py
index 829bf0f3b..d6754d5cd 100644
--- a/tests/basics/gen_yield_from_throw.py
+++ b/tests/basics/gen_yield_from_throw.py
@@ -21,7 +21,7 @@ except TypeError:
def gen3():
yield 123
yield 456
-
+
g3 = gen3()
print(next(g3))
try:
diff --git a/tests/basics/gen_yield_from_throw.py.exp b/tests/basics/gen_yield_from_throw.py.exp
new file mode 100644
index 000000000..6ce97ad86
--- /dev/null
+++ b/tests/basics/gen_yield_from_throw.py.exp
@@ -0,0 +1,6 @@
+1
+got ValueError from upstream!
+str1
+got TypeError from downstream!
+123
+got StopIteration from downstream!
diff --git a/tests/basics/gen_yield_from_throw2.py b/tests/basics/gen_yield_from_throw2.py
index 0abfdd8cc..5c0fc7dbc 100644
--- a/tests/basics/gen_yield_from_throw2.py
+++ b/tests/basics/gen_yield_from_throw2.py
@@ -6,7 +6,7 @@ def gen():
except GeneratorExit:
print('GeneratorExit')
yield 456
-
+
# thrown a class
g = gen()
print(next(g))
diff --git a/tests/basics/generator_close.py.exp b/tests/basics/generator_close.py.exp
new file mode 100644
index 000000000..fcd583935
--- /dev/null
+++ b/tests/basics/generator_close.py.exp
@@ -0,0 +1,10 @@
+None
+StopIteration
+1
+None
+StopIteration
+[1, 2]
+None
+StopIteration
+None
+ValueError
diff --git a/tests/basics/generator_return.py b/tests/basics/generator_return.py
index a3ac88575..5814ce837 100644
--- a/tests/basics/generator_return.py
+++ b/tests/basics/generator_return.py
@@ -7,4 +7,4 @@ print(next(g))
try:
print(next(g))
except StopIteration as e:
- print(repr(e))
+ print(type(e), e.args)
diff --git a/tests/basics/int_big_and2.py b/tests/basics/int_big_and2.py
index f8c81fe0c..045a90ef7 100644
--- a/tests/basics/int_big_and2.py
+++ b/tests/basics/int_big_and2.py
@@ -1,4 +1,4 @@
-# test + +
+# test + +
print( 97989513389222316022151446562729620153292831887555425160965597396
& 23716683549865351578586448630079789776107310103486834795830390982)
@@ -24,7 +24,7 @@ print( 283894311
print( 40019818573920230246248826511203818792007462193311949166285967147
& 9487909752)
-# test - -
+# test - -
print( -97989513389222316022151446562729620153292831887555425160965597396
& -23716683549865351578586448630079789776107310103486834795830390982)
diff --git a/tests/basics/int_big_and3.py b/tests/basics/int_big_and3.py
index 788ecd823..7a3b415af 100644
--- a/tests/basics/int_big_and3.py
+++ b/tests/basics/int_big_and3.py
@@ -1,4 +1,4 @@
-# test - +
+# test - +
print( -97989513389222316022151446562729620153292831887555425160965597396
& 23716683549865351578586448630079789776107310103486834795830390982)
@@ -24,7 +24,7 @@ print( -283894311
print( -40019818573920230246248826511203818792007462193311949166285967147
& 9487909752)
-# test + -
+# test + -
print( 97989513389222316022151446562729620153292831887555425160965597396
& -23716683549865351578586448630079789776107310103486834795830390982)
diff --git a/tests/basics/int_big_error.py b/tests/basics/int_big_error.py
index e036525d1..79809aef1 100644
--- a/tests/basics/int_big_error.py
+++ b/tests/basics/int_big_error.py
@@ -17,9 +17,9 @@ try:
except TypeError:
print("TypeError")
-# overflow because rhs of >> is being converted to machine int
+# overflow because arg of bytearray is being converted to machine int
try:
- 1 >> i
+ bytearray(i)
except OverflowError:
print('OverflowError')
diff --git a/tests/basics/int_big_or.py b/tests/basics/int_big_or.py
index 17d993526..ccded3778 100644
--- a/tests/basics/int_big_or.py
+++ b/tests/basics/int_big_or.py
@@ -3,7 +3,7 @@ print(0 | (1 << 80))
a = 0xfffffffffffffffffffffffffffff
print(a | (1 << 200))
-# test + +
+# test + +
print(0 | (1 << 80))
print((1 << 80) | (1 << 80))
@@ -15,7 +15,7 @@ print(a | (1 << 200))
print(a | a == 0)
print(bool(a | a))
-# test - +
+# test - +
print((-1 << 80) | (1 << 80))
print((-1 << 80) | 0)
@@ -25,7 +25,7 @@ print((-a) | (1 << 200))
print((-a) | a == 0)
print(bool((-a) | a))
-# test + -
+# test + -
print(0 | (-1 << 80))
print((1 << 80) | (-1 << 80))
@@ -35,7 +35,7 @@ print(a | (-1 << 200))
print(a | (-a) == 0)
print(bool(a | (-a)))
-# test - -
+# test - -
print((-1 << 80) | (-1 << 80))
diff --git a/tests/basics/int_big_or2.py b/tests/basics/int_big_or2.py
index 255495150..92d76c770 100644
--- a/tests/basics/int_big_or2.py
+++ b/tests/basics/int_big_or2.py
@@ -1,4 +1,4 @@
-# test + +
+# test + +
print( 97989513389222316022151446562729620153292831887555425160965597396
| 23716683549865351578586448630079789776107310103486834795830390982)
@@ -23,7 +23,7 @@ print( 283894311
print( 40019818573920230246248826511203818792007462193311949166285967147
| 9487909752)
-# test - -
+# test - -
print( -97989513389222316022151446562729620153292831887555425160965597396
| -23716683549865351578586448630079789776107310103486834795830390982)
diff --git a/tests/basics/int_big_or3.py b/tests/basics/int_big_or3.py
index 07edaea2d..212b3da8a 100644
--- a/tests/basics/int_big_or3.py
+++ b/tests/basics/int_big_or3.py
@@ -1,4 +1,4 @@
-# test - +
+# test - +
print( -97989513389222316022151446562729620153292831887555425160965597396
| 23716683549865351578586448630079789776107310103486834795830390982)
@@ -24,7 +24,7 @@ print( -283894311
print( -40019818573920230246248826511203818792007462193311949166285967147
| 9487909752)
-# test + -
+# test + -
print( 97989513389222316022151446562729620153292831887555425160965597396
| -23716683549865351578586448630079789776107310103486834795830390982)
diff --git a/tests/basics/int_big_xor.py b/tests/basics/int_big_xor.py
index cd1d9ae97..28b191d3d 100644
--- a/tests/basics/int_big_xor.py
+++ b/tests/basics/int_big_xor.py
@@ -1,4 +1,4 @@
-# test + +
+# test + +
print(0 ^ (1 << 80))
print((1 << 80) ^ (1 << 80))
@@ -10,7 +10,7 @@ print(a ^ (1 << 200))
print(a ^ a == 0)
print(bool(a ^ a))
-# test - +
+# test - +
print((-1 << 80) ^ (1 << 80))
print((-1 << 80) ^ 0)
@@ -22,7 +22,7 @@ print(bool((-a) ^ a))
i = -1
print(i ^ 0xffffffffffffffff) # carry overflows to higher digit
-# test + -
+# test + -
print(0 ^ (-1 << 80))
print((1 << 80) ^ (-1 << 80))
@@ -32,7 +32,7 @@ print(a ^ (-1 << 200))
print(a ^ (-a) == 0)
print(bool(a ^ (-a)))
-# test - -
+# test - -
print((-1 << 80) ^ (-1 << 80))
diff --git a/tests/basics/int_big_xor2.py b/tests/basics/int_big_xor2.py
index b5b3db60c..21ef842f8 100644
--- a/tests/basics/int_big_xor2.py
+++ b/tests/basics/int_big_xor2.py
@@ -1,4 +1,4 @@
-# test + +
+# test + +
print( 97989513389222316022151446562729620153292831887555425160965597396
^ 23716683549865351578586448630079789776107310103486834795830390982)
@@ -24,7 +24,7 @@ print( 283894311
print( 40019818573920230246248826511203818792007462193311949166285967147
^ 9487909752)
-# test - -
+# test - -
print( -97989513389222316022151446562729620153292831887555425160965597396
^ -23716683549865351578586448630079789776107310103486834795830390982)
diff --git a/tests/basics/int_big_xor3.py b/tests/basics/int_big_xor3.py
index 00881e374..ff5e9aeff 100644
--- a/tests/basics/int_big_xor3.py
+++ b/tests/basics/int_big_xor3.py
@@ -1,4 +1,4 @@
-# test - +
+# test - +
print( -97989513389222316022151446562729620153292831887555425160965597396
^ 23716683549865351578586448630079789776107310103486834795830390982)
@@ -24,7 +24,7 @@ print( -283894311
print( -40019818573920230246248826511203818792007462193311949166285967147
^ 9487909752)
-# test + -
+# test + -
print( 97989513389222316022151446562729620153292831887555425160965597396
^ -23716683549865351578586448630079789776107310103486834795830390982)
diff --git a/tests/basics/int_bytes.py b/tests/basics/int_bytes.py
index 059c16d3f..d42afac1f 100644
--- a/tests/basics/int_bytes.py
+++ b/tests/basics/int_bytes.py
@@ -1,6 +1,11 @@
print((10).to_bytes(1, "little"))
+print((-10).to_bytes(1, "little", signed=True))
+# Test fitting in length that's not a power of two.
+print((0x10000).to_bytes(3, 'little'))
print((111111).to_bytes(4, "little"))
+print((-111111).to_bytes(4, "little", signed=True))
print((100).to_bytes(10, "little"))
+print((-100).to_bytes(10, "little", signed=True))
# check that extra zero bytes don't change the internal int value
print(int.from_bytes(bytes(20), "little") == 0)
@@ -8,7 +13,9 @@ print(int.from_bytes(b"\x01" + bytes(20), "little") == 1)
# big-endian conversion
print((10).to_bytes(1, "big"))
+print((-10).to_bytes(1, "big", signed=True))
print((100).to_bytes(10, "big"))
+print((-100).to_bytes(10, "big", signed=True))
print(int.from_bytes(b"\0\0\0\0\0\0\0\0\0\x01", "big"))
print(int.from_bytes(b"\x01\0", "big"))
@@ -17,3 +24,20 @@ try:
(1).to_bytes(-1, "little")
except ValueError:
print("ValueError")
+
+# too small buffer should raise an error
+try:
+ (256).to_bytes(1, "little")
+except OverflowError:
+ print("OverflowError")
+
+# negative numbers should raise an error if signed=False
+try:
+ (-256).to_bytes(2, "little")
+except OverflowError:
+ print("OverflowError")
+
+try:
+ (-256).to_bytes(2, "little", signed=False)
+except OverflowError:
+ print("OverflowError")
diff --git a/tests/basics/int_bytes_intbig.py b/tests/basics/int_bytes_intbig.py
index ce6fec40a..a9f069902 100644
--- a/tests/basics/int_bytes_intbig.py
+++ b/tests/basics/int_bytes_intbig.py
@@ -2,7 +2,9 @@ import skip_if
skip_if.no_bigint()
print((2**64).to_bytes(9, "little"))
+print((-2**64).to_bytes(9, "little", signed=True))
print((2**64).to_bytes(9, "big"))
+print((-2**64).to_bytes(9, "big", signed=True))
b = bytes(range(20))
@@ -15,3 +17,19 @@ print(ib.to_bytes(20, "big"))
# check that extra zero bytes don't change the internal int value
print(int.from_bytes(b + bytes(10), "little") == int.from_bytes(b, "little"))
+
+# too small buffer should raise an error
+try:
+ (2**64).to_bytes(8, "little")
+except OverflowError:
+ print("OverflowError")
+
+# negative numbers should raise an error if signed=False
+try:
+ (-2**64).to_bytes(9, "little")
+except OverflowError:
+ print("OverflowError")
+try:
+ (-2**64).to_bytes(9, "little", signed=False)
+except OverflowError:
+ print("OverflowError")
diff --git a/tests/basics/int_longint_bytes.py b/tests/basics/int_longint_bytes.py
index 42e445f53..90cbff2f8 100644
--- a/tests/basics/int_longint_bytes.py
+++ b/tests/basics/int_longint_bytes.py
@@ -3,6 +3,7 @@ import skip_if
skip_if.no_bigint()
print((2**64).to_bytes(9, "little"))
+print((-2**64).to_bytes(9, "little", signed=True))
print(int.from_bytes(b"\x00\x01\0\0\0\0\0\0", "little"))
print(int.from_bytes(b"\x01\0\0\0\0\0\0\0", "little"))
print(int.from_bytes(b"\x00\x01\0\0\0\0\0\0", "little"))
diff --git a/tests/basics/parser.py.exp b/tests/basics/parser.py.exp
new file mode 100644
index 000000000..4d9886a09
--- /dev/null
+++ b/tests/basics/parser.py.exp
@@ -0,0 +1,3 @@
+SyntaxError
+SyntaxError
+SyntaxError
diff --git a/tests/basics/python34.py b/tests/basics/python34.py
index 36531f11c..4030db143 100644
--- a/tests/basics/python34.py
+++ b/tests/basics/python34.py
@@ -1,4 +1,4 @@
-# tests that differ when running under Python 3.4 vs 3.5/3.6
+# tests that differ when running under Python 3.4 vs 3.5/3.6/3.7
try:
exec
@@ -36,3 +36,7 @@ test_syntax("del ()") # can't delete empty tuple (in 3.6 we can)
import sys
print(sys.version[:3])
print(sys.version_info[0], sys.version_info[1])
+
+# from basics/exception1.py
+# in 3.7 no comma is printed if there is only 1 arg (in 3.4-3.6 one is printed)
+print(repr(IndexError("foo")))
diff --git a/tests/basics/python34.py.exp b/tests/basics/python34.py.exp
index 590fc364f..848017130 100644
--- a/tests/basics/python34.py.exp
+++ b/tests/basics/python34.py.exp
@@ -11,3 +11,4 @@ SyntaxError
SyntaxError
3.4
3 4
+IndexError('foo',)
diff --git a/tests/basics/set_iter.py b/tests/basics/set_iter.py
index 296017730..e7da28e1b 100644
--- a/tests/basics/set_iter.py
+++ b/tests/basics/set_iter.py
@@ -2,4 +2,3 @@ s = {1, 2, 3, 4}
l = list(s)
l.sort()
print(l)
-
diff --git a/tests/basics/set_pop.py b/tests/basics/set_pop.py
index 5e1196c9f..e951ca593 100644
--- a/tests/basics/set_pop.py
+++ b/tests/basics/set_pop.py
@@ -15,4 +15,4 @@ while s:
print(s.pop()) # last pop() should trigger the optimisation
for i in range(N):
s.add(i) # check that we can add the numbers back to the set
-print(list(s))
+print(sorted(s))
diff --git a/tests/basics/smallint_array_overflow.py b/tests/basics/smallint_array_overflow.py
new file mode 100644
index 000000000..25b457cca
--- /dev/null
+++ b/tests/basics/smallint_array_overflow.py
@@ -0,0 +1,52 @@
+try:
+ from array import array
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+def test_array_overflow(typecode, val):
+ try:
+ print(array(typecode, [val]))
+ except OverflowError:
+ print('OverflowError')
+
+def test_bytearray_overflow(val):
+ try:
+ print(bytearray([val]))
+ except (OverflowError, ValueError):
+ # CircuitPython always does OverflowError
+ print('(OverflowError, ValueError)')
+
+
+# small int -1
+test_array_overflow('Q', -1)
+test_array_overflow('L', -1)
+test_array_overflow('I', -1)
+test_array_overflow('H', -1)
+test_array_overflow('B', -1)
+
+# 0 ok
+test_array_overflow('Q', 0)
+test_array_overflow('L', 0)
+test_array_overflow('I', 0)
+test_array_overflow('H', 0)
+test_array_overflow('B', 0)
+
+# 1 ok
+test_array_overflow('Q', 1)
+test_array_overflow('L', 1)
+test_array_overflow('I', 1)
+test_array_overflow('H', 1)
+test_array_overflow('B', 1)
+
+# truth value conversions
+test_array_overflow('b', True)
+test_array_overflow('b', False)
+
+# similar tests for bytearrays
+test_bytearray_overflow(0)
+test_bytearray_overflow(1)
+test_bytearray_overflow(-1)
+test_bytearray_overflow(256)
+test_bytearray_overflow(True)
+test_bytearray_overflow(False)
diff --git a/tests/basics/string_cr_conversion.py b/tests/basics/string_cr_conversion.py
index 0c3ba16b8..b8ec7e825 100644
--- a/tests/basics/string_cr_conversion.py
+++ b/tests/basics/string_cr_conversion.py
@@ -1 +1 @@
-# this file has CR line endings to test lexer's conversion of them to LF # in triple quoted strings print(repr("""abc def""")) \ No newline at end of file
+# this file has CR line endings to test lexer's conversion of them to LF # in triple quoted strings print(repr("""abc def"""))
diff --git a/tests/basics/string_pep498_fstring.py b/tests/basics/string_pep498_fstring.py
new file mode 100644
index 000000000..c645a730c
--- /dev/null
+++ b/tests/basics/string_pep498_fstring.py
@@ -0,0 +1,113 @@
+# Tests against https://www.python.org/dev/peps/pep-0498/
+
+assert f'no interpolation' == 'no interpolation'
+assert f"no interpolation" == 'no interpolation'
+
+# Quoth the PEP:
+# Backslashes may not appear anywhere within expressions. Comments, using the
+# '#' character, are not allowed inside an expression
+#
+# CPython (3.7.4 on Linux) raises a SyntaxError here:
+# >>> f'{#}'
+# File "<stdin>", line 1
+# SyntaxError: f-string expression part cannot include '#'
+# >>> f'{\}'
+# File "<stdin>", line 1
+# SyntaxError: f-string expression part cannot include a backslash
+# >>> f'{\\}'
+# File "<stdin>", line 1
+# SyntaxError: f-string expression part cannot include a backslash
+# >>> f'{\#}'
+# File "<stdin>", line 1
+# SyntaxError: f-string expression part cannot include a backslash
+
+# Backslashes and comments allowed outside expression
+assert f"\\" == "\\"
+assert f'#' == '#'
+
+## But not inside
+try:
+ eval("f'{\}'")
+except SyntaxError:
+ pass
+else:
+ raise AssertionError('f-string with backslash in expression did not raise SyntaxError')
+
+try:
+ eval("f'{#}'")
+except SyntaxError:
+ pass
+else:
+ raise AssertionError('f-string with \'#\' in expression did not raise SyntaxError')
+
+# Quoth the PEP:
+# While scanning the string for expressions, any doubled braces '{{' or '}}'
+# inside literal portions of an f-string are replaced by the corresponding
+# single brace. Doubled literal opening braces do not signify the start of an
+# expression. A single closing curly brace '}' in the literal portion of a
+# string is an error: literal closing curly braces must be doubled '}}' in
+# order to represent a single closing brace.
+#
+# CPython (3.7.4 on Linux) raises a SyntaxError for the last case:
+# >>> f'{{}'
+# File "<stdin>", line 1
+# SyntaxError: f-string: single '}' is not allowed
+
+assert f'{{}}' == '{}'
+
+try:
+ eval("f'{{}'")
+except ValueError:
+ pass
+else:
+ raise RuntimeError('Expected ValueError for invalid f-string literal bracing')
+
+x = 1
+assert f'{x}' == '1'
+
+# Quoth the PEP:
+# The expressions that are extracted from the string are evaluated in the
+# context where the f-string appeared. This means the expression has full
+# access to local and global variables. Any valid Python expression can be
+# used, including function and method calls. Because the f-strings are
+# evaluated where the string appears in the source code, there is no additional
+# expressiveness available with f-strings. There are also no additional
+# security concerns: you could have also just written the same expression, not
+# inside of an f-string:
+
+def foo():
+ return 20
+
+assert f'result={foo()}' == 'result=20'
+assert f'result={foo()}' == 'result={}'.format(foo())
+assert f'result={foo()}' == 'result={result}'.format(result=foo())
+
+
+# Quoth the PEP:
+# Adjacent f-strings and regular strings are concatenated. Regular strings are
+# concatenated at compile time, and f-strings are concatenated at run time. For
+# example, the expression:
+#
+# >>> x = 10
+# >>> y = 'hi'
+# >>> 'a' 'b' f'{x}' '{c}' f'str<{y:^4}>' 'd' 'e'
+#
+# yields the value: 'ab10{c}str< hi >de'
+#
+# Because strings are concatenated at lexer time rather than parser time in
+# MicroPython for mostly RAM efficiency reasons (see
+# https://github.com/micropython/micropython/commit/534b7c368dc2af7720f3aaed0c936ef46d773957),
+# and because f-strings here are implemented as a syntax translation
+# (f'{something}' => '{}'.format(something)), this particular functionality is unimplemented,
+# and in the above example, the '{c}' portion will trigger a KeyError on String.format()
+
+x = 10
+y = 'hi'
+assert (f'h' f'i') == 'hi'
+#assert (f'h' 'i') == 'hi'
+#assert ('h' f'i') == 'hi'
+assert f'{x:^4}' == ' 10 '
+#assert ('a' 'b' f'{x}' f'str<{y:^4}>' 'd' 'e') == 'ab10str< hi >de'
+
+# Other tests
+assert f'{{{4*10}}}' == '{40}'
diff --git a/tests/basics/string_pep498_fstring.py.exp b/tests/basics/string_pep498_fstring.py.exp
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/tests/basics/string_pep498_fstring.py.exp
diff --git a/tests/basics/struct_overflow.py b/tests/basics/struct_overflow.py
new file mode 100644
index 000000000..aee0c6b9d
--- /dev/null
+++ b/tests/basics/struct_overflow.py
@@ -0,0 +1,47 @@
+import skip_if
+skip_if.no_bigint()
+
+try:
+ import ustruct as struct
+except:
+ try:
+ import struct
+ except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+def test_struct_overflow(typecode, val):
+ try:
+ print(struct.pack(typecode, val))
+ except OverflowError:
+ print('OverflowError')
+ except struct.error:
+ print('OverflowError')
+
+# small int -1
+test_struct_overflow('>Q', -1)
+test_struct_overflow('>L', -1)
+test_struct_overflow('>I', -1)
+test_struct_overflow('>H', -1)
+test_struct_overflow('>B', -1)
+
+# big int -1
+test_struct_overflow('>Q', -2**64 // 2**64)
+test_struct_overflow('>L', -2**64 // 2**64)
+test_struct_overflow('>I', -2**64 // 2**64)
+test_struct_overflow('>H', -2**64 // 2**64)
+test_struct_overflow('>B', -2**64 // 2**64)
+
+# possibly small ints
+test_struct_overflow('>q', 2**63)
+test_struct_overflow('>l', 2**31)
+test_struct_overflow('>i', 2**31)
+test_struct_overflow('>h', 2**15)
+test_struct_overflow('>b', 2**7)
+
+# definitely big ints
+test_struct_overflow('>q', 2**64 // 2**1)
+test_struct_overflow('>l', 2**64 // 2**33)
+test_struct_overflow('>i', 2**64 // 2**33)
+test_struct_overflow('>h', 2**64 // 2**49)
+test_struct_overflow('>b', 2**64 // 2**57)
diff --git a/tests/basics/subclass_native3.py b/tests/basics/subclass_native3.py
index bd99ab0d6..6745b77bb 100644
--- a/tests/basics/subclass_native3.py
+++ b/tests/basics/subclass_native3.py
@@ -7,12 +7,12 @@ print(repr(e))
print(e.args)
try:
- raise MyExc("Some error")
+ raise MyExc("Some error", 1)
except MyExc as e:
print("Caught exception:", repr(e))
try:
- raise MyExc("Some error2")
+ raise MyExc("Some error2", 2)
except Exception as e:
print("Caught exception:", repr(e))
diff --git a/tests/basics/subscr_tuple.py b/tests/basics/subscr_tuple.py
new file mode 100644
index 000000000..0210e24df
--- /dev/null
+++ b/tests/basics/subscr_tuple.py
@@ -0,0 +1,6 @@
+# subscripting a subclassed tuple
+class Foo(tuple):
+ pass
+
+foo = Foo((1,2))
+foo[0]
diff --git a/tests/basics/try_as_var.py b/tests/basics/try_as_var.py
index 0a92f1cae..4f02f9c10 100644
--- a/tests/basics/try_as_var.py
+++ b/tests/basics/try_as_var.py
@@ -1,7 +1,7 @@
try:
raise ValueError(534)
except ValueError as e:
- print(repr(e))
+ print(type(e), e.args)
# Var bound in except block is automatically deleted
try: