summaryrefslogtreecommitdiff
path: root/tests/basics/struct_micropython.py
diff options
context:
space:
mode:
authorJeff Epler <jepler@gmail.com>2020-09-12 13:57:31 -0500
committerJeff Epler <jepler@gmail.com>2020-09-12 14:07:23 -0500
commit54d97251fe2dd4939652a186bf703885e654b4d1 (patch)
treedaa39c435669778a4c1b02dbc4c47e087fd80db6 /tests/basics/struct_micropython.py
parentb24d3b886af1d4fbbe481961a3b3215fcc0ba799 (diff)
modstruct: Improve compliance with python3
While checking whether we can enable -Wimplicit-fallthrough, I encountered a diagnostic in mp_binary_set_val_array_from_int which led to discovering the following bug: ``` >>> struct.pack("xb", 3) b'\x03\x03' ``` That is, the next value (3) was used as the value of a padding byte, while standard Python always fills "x" bytes with zeros. I initially thought this had to do with the unintentional fallthrough, but it doesn't. Instead, this code would relate to an array.array with a typecode of padding ('x'), which is ALSO not desktop Python compliant: ``` >>> array.array('x', (1, 2, 3)) array('x', [1, 0, 0]) ``` Possibly this is dead code that used to be shared between struct-setting and array-setting, but it no longer is. I also discovered that the argument list length for struct.pack and struct.pack_into were not checked, and that the length of binary data passed to array.array was not checked to be a multiple of the element size. I have corrected all of these to conform more closely to standard Python and revised some tests where necessary. Some tests for micropython-specific behavior that does not conform to standard Python and is not present in CircuitPython was deleted outright.
Diffstat (limited to 'tests/basics/struct_micropython.py')
-rw-r--r--tests/basics/struct_micropython.py41
1 files changed, 0 insertions, 41 deletions
diff --git a/tests/basics/struct_micropython.py b/tests/basics/struct_micropython.py
deleted file mode 100644
index e72153071..000000000
--- a/tests/basics/struct_micropython.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# test MicroPython-specific features of struct
-
-try:
- import ustruct as struct
-except:
- try:
- import struct
- except ImportError:
- print("SKIP")
- raise SystemExit
-
-try:
- struct.pack('O', None)
-except ValueError:
- print("SKIP")
- raise SystemExit
-
-class A():
- pass
-
-# pack and unpack objects
-o = A()
-s = struct.pack("<O", o)
-o2 = struct.unpack("<O", s)
-print(o is o2[0])
-
-# pack can accept less arguments than required for the format spec
-print(struct.pack('<2I', 1))
-
-# pack and unpack pointer to a string
-# This requires uctypes to get the address of the string and instead of
-# putting this in a dedicated test that can be skipped we simply pass
-# if the import fails.
-try:
- import uctypes
- o = uctypes.addressof('abc')
- s = struct.pack("<S", o)
- o2 = struct.unpack("<S", s)
- assert o2[0] == 'abc'
-except ImportError:
- pass