summaryrefslogtreecommitdiffstatshomepage
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/basics/fun_code_colines.py81
-rw-r--r--tests/basics/fun_code_colines.py.exp20
-rw-r--r--tests/basics/fun_code_full.py47
-rw-r--r--tests/extmod/machine_uart_tx.py5
-rw-r--r--tests/extmod/select_poll_eintr.py16
-rw-r--r--tests/extmod/time_mktime.py120
-rw-r--r--tests/extmod_hardware/machine_uart_irq_rx.py11
-rw-r--r--tests/extmod_hardware/machine_uart_irq_rxidle.py40
-rw-r--r--tests/extmod_hardware/machine_uart_irq_rxidle.py.exp24
-rw-r--r--tests/ports/stm32/adc.py5
-rw-r--r--tests/ports/stm32/adcall.py16
-rw-r--r--tests/ports/stm32/extint.py3
-rw-r--r--tests/ports/stm32/i2c.py7
-rw-r--r--tests/ports/stm32/i2c_accel.py9
-rw-r--r--tests/ports/stm32/i2c_error.py3
-rw-r--r--tests/ports/stm32/irq.py5
-rw-r--r--tests/ports/stm32/modstm.py4
-rw-r--r--tests/ports/stm32/pin.py14
-rw-r--r--tests/ports/stm32/pyb1.py4
-rw-r--r--tests/ports/stm32/rtc.py14
-rw-r--r--tests/ports/stm32/servo.py6
-rw-r--r--tests/ports/stm32/timer.py11
-rw-r--r--tests/ports/stm32/timer_callback.py26
-rw-r--r--tests/ports/stm32/uart.py6
-rw-r--r--tests/ports/unix/extra_coverage.py10
-rw-r--r--tests/ports/unix/extra_coverage.py.exp8
26 files changed, 457 insertions, 58 deletions
diff --git a/tests/basics/fun_code_colines.py b/tests/basics/fun_code_colines.py
new file mode 100644
index 0000000000..a8867770ed
--- /dev/null
+++ b/tests/basics/fun_code_colines.py
@@ -0,0 +1,81 @@
+# Check that we have sensical bytecode offsets in function.__code__.co_lines
+
+def f1(x, y, obj, obj2, obj3):
+ a = x + y # line 4: bc+4 line+4
+ b = x - y # line 5: bc+4 line+1
+ # line 6
+ # line 7
+ # line 8
+ # line 9
+ # line 10
+ # line 11
+ # line 12
+ # line 13
+ # line 14
+ # line 15
+ # line 16
+ # line 17
+ # line 18
+ # line 19
+ c = a * b # line 20: bc+4 line+15
+ obj.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.fun() # line 21: bc+31 line+1; bc+27 line+0
+ # line 22
+ # line 23
+ # line 24: bc+0 line+3
+ # line 25
+ # line 26
+ # line 27: bc+0 line+3
+ # line 28
+ # line 29
+ obj2.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.fun() # line 30: bc+31 line+3; bc+27 line+0
+ # line 31
+ # line 32
+ # line 33: bc+0 line+3
+ # line 34
+ # line 35
+ # line 36
+ # line 37
+ # line 38
+ # line 39
+ # line 40
+ # line 41
+ # line 42
+ # line 43
+ # line 44
+ # line 45
+ # line 46
+ # line 47
+ # line 48
+ # line 49
+ # line 50
+ # line 51
+ # line 52
+ # line 53
+ # line 54
+ # line 55
+ # line 56
+ # line 57
+ # line 58
+ # line 59
+ return obj3.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.fun() # line 60: bc+31 line+27; bc+27 line+0
+
+def f2(x, y):
+ a = x + y # line 63
+ b = x - y # line 64
+ return a * b # line 65
+
+try:
+ f1.__code__.co_lines
+except AttributeError:
+ print("SKIP")
+ raise SystemExit
+
+print("f1")
+for start, end, line_no in f1.__code__.co_lines():
+ print("line {} start: {}".format(line_no, start))
+ print("line {} end: {}".format(line_no, end))
+
+print("f2")
+for start, end, line_no in f2.__code__.co_lines():
+ print("line {} start: {}".format(line_no, start))
+ print("line {} end: {}".format(line_no, end))
diff --git a/tests/basics/fun_code_colines.py.exp b/tests/basics/fun_code_colines.py.exp
new file mode 100644
index 0000000000..19bd4ef6e2
--- /dev/null
+++ b/tests/basics/fun_code_colines.py.exp
@@ -0,0 +1,20 @@
+f1
+line 4 start: 0
+line 4 end: 4
+line 5 start: 4
+line 5 end: 8
+line 20 start: 8
+line 20 end: 12
+line 21 start: 12
+line 21 end: 70
+line 30 start: 70
+line 30 end: 128
+line 60 start: 128
+line 60 end: 186
+f2
+line 63 start: 0
+line 63 end: 4
+line 64 start: 4
+line 64 end: 8
+line 65 start: 8
+line 65 end: 12
diff --git a/tests/basics/fun_code_full.py b/tests/basics/fun_code_full.py
new file mode 100644
index 0000000000..5eb23150df
--- /dev/null
+++ b/tests/basics/fun_code_full.py
@@ -0,0 +1,47 @@
+# Test function.__code__ attributes not available with MICROPY_PY_BUILTINS_CODE <= MICROPY_PY_BUILTINS_CODE_BASIC
+
+try:
+ (lambda: 0).__code__.co_code
+except AttributeError:
+ print("SKIP")
+ raise SystemExit
+
+try:
+ import warnings
+ warnings.simplefilter("ignore") # ignore deprecation warning about co_lnotab
+except ImportError:
+ pass
+
+def f(x, y):
+ a = x + y
+ b = x - y
+ return a * b
+
+code = f.__code__
+
+print(type(code.co_code)) # both bytes (but mpy and cpy have different instruction sets)
+print(code.co_consts) # (not necessarily the same set, but in this function they are)
+print(code.co_filename.rsplit('/')[-1]) # same terminal filename but might be different paths on other ports
+print(type(code.co_firstlineno)) # both ints (but mpy points to first line inside, cpy points to declaration)
+print(code.co_name)
+print(iter(code.co_names) is not None) # both iterable (but mpy returns dict with names as keys, cpy only the names; and not necessarily the same set)
+print(type(code.co_lnotab)) # both bytes
+
+co_lines = code.co_lines()
+
+l = list(co_lines)
+first_start = l[0][0]
+last_end = l[-1][1]
+print(first_start) # co_lines should start at the start of the bytecode
+print(len(code.co_code) - last_end) # and end at the end of the bytecode
+
+prev_end = 0
+for start, end, line_no in l:
+ if end != prev_end:
+ print("non-contiguous")
+ break # the offset ranges should be contiguous
+ prev_end = end
+else:
+ print("contiguous")
+
+
diff --git a/tests/extmod/machine_uart_tx.py b/tests/extmod/machine_uart_tx.py
index f0cc912da6..85bf7e9fb8 100644
--- a/tests/extmod/machine_uart_tx.py
+++ b/tests/extmod/machine_uart_tx.py
@@ -28,7 +28,10 @@ elif "mimxrt" in sys.platform:
initial_delay_ms = 20 # UART sends idle frame after init, so wait for that
bit_margin = 1
elif "pyboard" in sys.platform:
- uart_id = 4
+ if "STM32WB" in sys.implementation._machine:
+ uart_id = "LP1"
+ else:
+ uart_id = 4
pins = {}
initial_delay_ms = 50 # UART sends idle frame after init, so wait for that
bit_margin = 1 # first start-bit must wait to sync with the UART clock
diff --git a/tests/extmod/select_poll_eintr.py b/tests/extmod/select_poll_eintr.py
index e1cbc2aaf5..d9e9b31909 100644
--- a/tests/extmod/select_poll_eintr.py
+++ b/tests/extmod/select_poll_eintr.py
@@ -10,6 +10,18 @@ except (ImportError, AttributeError):
print("SKIP")
raise SystemExit
+# Use a new UDP socket for tests, which should be writable but not readable.
+s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+localhost_addr_info = socket.getaddrinfo("127.0.0.1", 8000)
+try:
+ s.bind(localhost_addr_info[0][-1])
+except OSError:
+ # Target can't bind to localhost.
+ # Most likely it doesn't have a NIC and the test cannot be run.
+ s.close()
+ print("SKIP")
+ raise SystemExit
+
def thread_main():
lock.acquire()
@@ -26,10 +38,6 @@ lock = _thread.allocate_lock()
lock.acquire()
_thread.start_new_thread(thread_main, ())
-# Use a new UDP socket for tests, which should be writable but not readable.
-s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-s.bind(socket.getaddrinfo("127.0.0.1", 8000)[0][-1])
-
# Create the poller object.
poller = select.poll()
poller.register(s, select.POLLIN)
diff --git a/tests/extmod/time_mktime.py b/tests/extmod/time_mktime.py
new file mode 100644
index 0000000000..7fc643dc3c
--- /dev/null
+++ b/tests/extmod/time_mktime.py
@@ -0,0 +1,120 @@
+# test conversion from date tuple to timestamp and back
+
+try:
+ import time
+
+ time.localtime
+except (ImportError, AttributeError):
+ print("SKIP")
+ raise SystemExit
+
+# Range of date expected to work on all MicroPython platforms
+MIN_YEAR = 1970
+MAX_YEAR = 2099
+# CPython properly supported date range:
+# - on Windows: year 1970 to 3000+
+# - on Unix: year 1583 to 3000+
+
+# Start test from Jan 1, 2001 13:00 (Feb 2000 might already be broken)
+SAFE_DATE = (2001, 1, 1, 13, 0, 0, 0, 0, -1)
+
+
+# mktime function that checks that the result is reversible
+def safe_mktime(date_tuple):
+ try:
+ res = time.mktime(date_tuple)
+ chk = time.localtime(res)
+ except OverflowError:
+ print("safe_mktime:", date_tuple, "overflow error")
+ return None
+ if chk[0:5] != date_tuple[0:5]:
+ print("safe_mktime:", date_tuple[0:5], " -> ", res, " -> ", chk[0:5])
+ return None
+ return res
+
+
+# localtime function that checks that the result is reversible
+def safe_localtime(timestamp):
+ try:
+ res = time.localtime(timestamp)
+ chk = time.mktime(res)
+ except OverflowError:
+ print("safe_localtime:", timestamp, "overflow error")
+ return None
+ if chk != timestamp:
+ print("safe_localtime:", timestamp, " -> ", res, " -> ", chk)
+ return None
+ return res
+
+
+# look for smallest valid timestamps by iterating backwards on tuple
+def test_bwd(date_tuple):
+ curr_stamp = safe_mktime(date_tuple)
+ year = date_tuple[0]
+ month = date_tuple[1] - 1
+ if month < 1:
+ year -= 1
+ month = 12
+ while year >= MIN_YEAR:
+ while month >= 1:
+ next_tuple = (year, month) + date_tuple[2:]
+ next_stamp = safe_mktime(next_tuple)
+ # at this stage, only test consistency and monotonicity
+ if next_stamp is None or next_stamp >= curr_stamp:
+ return date_tuple
+ date_tuple = next_tuple
+ curr_stamp = next_stamp
+ month -= 1
+ year -= 1
+ month = 12
+ return date_tuple
+
+
+# test day-by-day to ensure that every date is properly converted
+def test_fwd(start_date):
+ DAYS_PER_MONTH = (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
+ curr_stamp = safe_mktime(start_date)
+ curr_date = safe_localtime(curr_stamp)
+ while curr_date[0] <= MAX_YEAR:
+ if curr_date[2] < 15:
+ skip_days = 13
+ else:
+ skip_days = 1
+ next_stamp = curr_stamp + skip_days * 86400
+ next_date = safe_localtime(next_stamp)
+ if next_date is None:
+ return curr_date
+ if next_date[2] != curr_date[2] + skip_days:
+ # next month
+ if next_date[2] != 1:
+ print("wrong day of month:", next_date)
+ return curr_date
+ # check the number of days in previous month
+ month_days = DAYS_PER_MONTH[curr_date[1]]
+ if month_days == 28 and curr_date[0] % 4 == 0:
+ if curr_date[0] % 100 != 0 or curr_date[0] % 400 == 0:
+ month_days += 1
+ if curr_date[2] != month_days:
+ print("wrong day count in prev month:", curr_date[2], "vs", month_days)
+ return curr_date
+ if next_date[1] != curr_date[1] + 1:
+ # next year
+ if curr_date[1] != 12:
+ print("wrong month count in prev year:", curr_date[1])
+ return curr_date
+ if next_date[1] != 1:
+ print("wrong month:", next_date)
+ return curr_date
+ if next_date[0] != curr_date[0] + 1:
+ print("wrong year:", next_date)
+ return curr_date
+ curr_stamp = next_stamp
+ curr_date = next_date
+ return curr_date
+
+
+small_date = test_bwd(SAFE_DATE)
+large_date = test_fwd(small_date)
+print("tested from", small_date[0:3], "to", large_date[0:3])
+print(small_date[0:3], "wday is", small_date[6])
+print(large_date[0:3], "wday is", large_date[6])
diff --git a/tests/extmod_hardware/machine_uart_irq_rx.py b/tests/extmod_hardware/machine_uart_irq_rx.py
index ecc95e62ae..3602c260e3 100644
--- a/tests/extmod_hardware/machine_uart_irq_rx.py
+++ b/tests/extmod_hardware/machine_uart_irq_rx.py
@@ -24,9 +24,14 @@ elif "esp32" in sys.platform:
tx_pin = 4
rx_pin = 5
elif "pyboard" in sys.platform:
- uart_id = 4
- tx_pin = None # PA0
- rx_pin = None # PA1
+ if "STM32WB" in sys.implementation._machine:
+ # LPUART(1) is on PA2/PA3
+ uart_id = "LP1"
+ else:
+ # UART(4) is on PA0/PA1
+ uart_id = 4
+ tx_pin = None
+ rx_pin = None
elif "samd" in sys.platform and "ItsyBitsy M0" in sys.implementation._machine:
uart_id = 0
tx_pin = "D1"
diff --git a/tests/extmod_hardware/machine_uart_irq_rxidle.py b/tests/extmod_hardware/machine_uart_irq_rxidle.py
index af2412c75e..3c743c9e0c 100644
--- a/tests/extmod_hardware/machine_uart_irq_rxidle.py
+++ b/tests/extmod_hardware/machine_uart_irq_rxidle.py
@@ -13,6 +13,9 @@ except (ImportError, AttributeError):
import time, sys
+# Target tuning options.
+tune_wait_initial_rxidle = False
+
# Configure pins based on the target.
if "alif" in sys.platform:
uart_id = 1
@@ -26,9 +29,15 @@ elif "mimxrt" in sys.platform:
uart_id = 1
tx_pin = None
elif "pyboard" in sys.platform:
- uart_id = 4
- tx_pin = None # PA0
- rx_pin = None # PA1
+ tune_wait_initial_rxidle = True
+ if "STM32WB" in sys.implementation._machine:
+ # LPUART(1) is on PA2/PA3
+ uart_id = "LP1"
+ else:
+ # UART(4) is on PA0/PA1
+ uart_id = 4
+ tx_pin = None
+ rx_pin = None
elif "renesas-ra" in sys.platform:
uart_id = 9
tx_pin = None # P602 @ RA6M2
@@ -55,20 +64,31 @@ def irq(u):
print("IRQ_RXIDLE:", bool(u.irq().flags() & u.IRQ_RXIDLE), "data:", u.read())
-text = "12345678"
+text = ("12345678", "abcdefgh")
# Test that the IRQ is called for each set of byte received.
for bits_per_s in (2400, 9600, 115200):
+ print("========")
+ print("bits_per_s:", bits_per_s)
+
if tx_pin is None:
uart = UART(uart_id, bits_per_s)
else:
uart = UART(uart_id, bits_per_s, tx=tx_pin, rx=rx_pin)
+ # Ignore a possible initial RXIDLE condition after creating UART.
+ if tune_wait_initial_rxidle:
+ uart.irq(lambda _: None, uart.IRQ_RXIDLE)
+ time.sleep_ms(10)
+
+ # Configure desired IRQ.
uart.irq(irq, uart.IRQ_RXIDLE)
- print("write", bits_per_s)
- uart.write(text)
- uart.flush()
- print("ready")
- time.sleep_ms(100)
- print("done")
+ for i in range(2):
+ # Write data and wait for IRQ.
+ print("write")
+ uart.write(text[i])
+ uart.flush()
+ print("ready")
+ time.sleep_ms(100)
+ print("done")
diff --git a/tests/extmod_hardware/machine_uart_irq_rxidle.py.exp b/tests/extmod_hardware/machine_uart_irq_rxidle.py.exp
index ce1890a06a..f3c7497e4c 100644
--- a/tests/extmod_hardware/machine_uart_irq_rxidle.py.exp
+++ b/tests/extmod_hardware/machine_uart_irq_rxidle.py.exp
@@ -1,12 +1,30 @@
-write 2400
+========
+bits_per_s: 2400
+write
ready
IRQ_RXIDLE: True data: b'12345678'
done
-write 9600
+write
+ready
+IRQ_RXIDLE: True data: b'abcdefgh'
+done
+========
+bits_per_s: 9600
+write
ready
IRQ_RXIDLE: True data: b'12345678'
done
-write 115200
+write
+ready
+IRQ_RXIDLE: True data: b'abcdefgh'
+done
+========
+bits_per_s: 115200
+write
ready
IRQ_RXIDLE: True data: b'12345678'
done
+write
+ready
+IRQ_RXIDLE: True data: b'abcdefgh'
+done
diff --git a/tests/ports/stm32/adc.py b/tests/ports/stm32/adc.py
index 875d31d732..299a5af9c6 100644
--- a/tests/ports/stm32/adc.py
+++ b/tests/ports/stm32/adc.py
@@ -1,5 +1,10 @@
+import sys
from pyb import ADC, Timer
+if "STM32WB" in sys.implementation._machine:
+ print("SKIP")
+ raise SystemExit
+
adct = ADC(16) # Temperature 930 -> 20C
print(str(adct)[:19])
adcv = ADC(17) # Voltage 1500 -> 3.3V
diff --git a/tests/ports/stm32/adcall.py b/tests/ports/stm32/adcall.py
index cfe179a97b..18896c40cb 100644
--- a/tests/ports/stm32/adcall.py
+++ b/tests/ports/stm32/adcall.py
@@ -1,5 +1,13 @@
+import sys
from pyb import Pin, ADCAll
+if "STM32WB" in sys.implementation._machine:
+ pa0_adc_channel = 5
+ skip_temp_test = True # temperature fails on WB55
+else:
+ pa0_adc_channel = 0
+ skip_temp_test = False
+
pins = [Pin.cpu.A0, Pin.cpu.A1, Pin.cpu.A2, Pin.cpu.A3]
# set pins to IN mode, init ADCAll, then check pins are ANALOG
@@ -12,7 +20,7 @@ for p in pins:
# set pins to IN mode, init ADCAll with mask, then check some pins are ANALOG
for p in pins:
p.init(p.IN)
-adc = ADCAll(12, 0x70003)
+adc = ADCAll(12, 0x70000 | 3 << pa0_adc_channel)
for p in pins:
print(p)
@@ -25,7 +33,11 @@ for c in range(19):
print(type(adc.read_channel(c)))
# call special reading functions
-print(0 < adc.read_core_temp() < 100)
+print(skip_temp_test or 0 < adc.read_core_temp() < 100)
print(0 < adc.read_core_vbat() < 4)
print(0 < adc.read_core_vref() < 2)
print(0 < adc.read_vref() < 4)
+
+if sys.implementation._build == "NUCLEO_WB55":
+ # Restore button pin settings.
+ Pin("SW", Pin.IN, Pin.PULL_UP)
diff --git a/tests/ports/stm32/extint.py b/tests/ports/stm32/extint.py
index 5510600020..d3161f7cc7 100644
--- a/tests/ports/stm32/extint.py
+++ b/tests/ports/stm32/extint.py
@@ -1,7 +1,8 @@
import pyb
# test basic functionality
-ext = pyb.ExtInt("X5", pyb.ExtInt.IRQ_RISING, pyb.Pin.PULL_DOWN, lambda l: print("line:", l))
+pin = pyb.Pin.cpu.A4
+ext = pyb.ExtInt(pin, pyb.ExtInt.IRQ_RISING, pyb.Pin.PULL_DOWN, lambda l: print("line:", l))
ext.disable()
ext.enable()
print(ext.line())
diff --git a/tests/ports/stm32/i2c.py b/tests/ports/stm32/i2c.py
index c968843273..7e7fd25040 100644
--- a/tests/ports/stm32/i2c.py
+++ b/tests/ports/stm32/i2c.py
@@ -1,5 +1,8 @@
-import pyb
-from pyb import I2C
+try:
+ from pyb import I2C
+except ImportError:
+ print("SKIP")
+ raise SystemExit
# test we can correctly create by id
for bus in (-1, 0, 1):
diff --git a/tests/ports/stm32/i2c_accel.py b/tests/ports/stm32/i2c_accel.py
index 8b87d406d0..11ff1392ba 100644
--- a/tests/ports/stm32/i2c_accel.py
+++ b/tests/ports/stm32/i2c_accel.py
@@ -1,15 +1,14 @@
# use accelerometer to test i2c bus
-import pyb
-from pyb import I2C
-
-if not hasattr(pyb, "Accel"):
+try:
+ from pyb import Accel, I2C
+except ImportError:
print("SKIP")
raise SystemExit
accel_addr = 76
-pyb.Accel() # this will init the MMA for us
+Accel() # this will init the MMA for us
i2c = I2C(1, I2C.CONTROLLER, baudrate=400000)
diff --git a/tests/ports/stm32/i2c_error.py b/tests/ports/stm32/i2c_error.py
index 1228962f5f..de6e1ca6fe 100644
--- a/tests/ports/stm32/i2c_error.py
+++ b/tests/ports/stm32/i2c_error.py
@@ -1,12 +1,13 @@
# test I2C errors, with polling (disabled irqs) and DMA
import pyb
-from pyb import I2C
if not hasattr(pyb, "Accel"):
print("SKIP")
raise SystemExit
+from pyb import I2C
+
# init accelerometer
pyb.Accel()
diff --git a/tests/ports/stm32/irq.py b/tests/ports/stm32/irq.py
index 04e70a7b79..fd8742d3ea 100644
--- a/tests/ports/stm32/irq.py
+++ b/tests/ports/stm32/irq.py
@@ -1,3 +1,4 @@
+import time
import pyb
@@ -8,7 +9,7 @@ def test_irq():
pyb.enable_irq() # by default should enable IRQ
# check that interrupts are enabled by waiting for ticks
- pyb.delay(10)
+ time.sleep_ms(10)
# check nested disable/enable
i1 = pyb.disable_irq()
@@ -18,7 +19,7 @@ def test_irq():
pyb.enable_irq(i1)
# check that interrupts are enabled by waiting for ticks
- pyb.delay(10)
+ time.sleep_ms(10)
test_irq()
diff --git a/tests/ports/stm32/modstm.py b/tests/ports/stm32/modstm.py
index f1e147c052..1459ee2a9e 100644
--- a/tests/ports/stm32/modstm.py
+++ b/tests/ports/stm32/modstm.py
@@ -1,13 +1,13 @@
# test stm module
import stm
-import pyb
+import time
# test storing a full 32-bit number
# turn on then off the A15(=yellow) LED
BSRR = 0x18
stm.mem32[stm.GPIOA + BSRR] = 0x00008000
-pyb.delay(100)
+time.sleep_ms(100)
print(hex(stm.mem32[stm.GPIOA + stm.GPIO_ODR] & 0x00008000))
stm.mem32[stm.GPIOA + BSRR] = 0x80000000
print(hex(stm.mem32[stm.GPIOA + stm.GPIO_ODR] & 0x00008000))
diff --git a/tests/ports/stm32/pin.py b/tests/ports/stm32/pin.py
index 3d2bef97e3..cbc78e68ab 100644
--- a/tests/ports/stm32/pin.py
+++ b/tests/ports/stm32/pin.py
@@ -1,14 +1,20 @@
+import sys
from pyb import Pin
-p = Pin("X8", Pin.IN)
+if "PYB" in sys.implementation._machine:
+ test_pin = "X8"
+else:
+ test_pin = Pin.cpu.A7
+
+p = Pin(test_pin, Pin.IN)
print(p)
print(p.name())
print(p.pin())
print(p.port())
-p = Pin("X8", Pin.IN, Pin.PULL_UP)
-p = Pin("X8", Pin.IN, pull=Pin.PULL_UP)
-p = Pin("X8", mode=Pin.IN, pull=Pin.PULL_UP)
+p = Pin(test_pin, Pin.IN, Pin.PULL_UP)
+p = Pin(test_pin, Pin.IN, pull=Pin.PULL_UP)
+p = Pin(test_pin, mode=Pin.IN, pull=Pin.PULL_UP)
print(p)
print(p.value())
diff --git a/tests/ports/stm32/pyb1.py b/tests/ports/stm32/pyb1.py
index e9626ecf4e..5627946dbc 100644
--- a/tests/ports/stm32/pyb1.py
+++ b/tests/ports/stm32/pyb1.py
@@ -2,6 +2,10 @@
import pyb
+if not hasattr(pyb, "delay"):
+ print("SKIP")
+ raise SystemExit
+
# test delay
pyb.delay(-1)
diff --git a/tests/ports/stm32/rtc.py b/tests/ports/stm32/rtc.py
index 013b2f3314..03ed93adc2 100644
--- a/tests/ports/stm32/rtc.py
+++ b/tests/ports/stm32/rtc.py
@@ -1,13 +1,15 @@
-import pyb, stm
+import time, stm
from pyb import RTC
+prediv_a = stm.mem32[stm.RTC + stm.RTC_PRER] >> 16
+
rtc = RTC()
rtc.init()
print(rtc)
# make sure that 1 second passes correctly
rtc.datetime((2014, 1, 1, 1, 0, 0, 0, 0))
-pyb.delay(1002)
+time.sleep_ms(1002)
print(rtc.datetime()[:7])
@@ -38,8 +40,12 @@ cal_tmp = rtc.calibration()
def set_and_print_calib(cal):
- rtc.calibration(cal)
- print(rtc.calibration())
+ if cal > 0 and prediv_a < 3:
+ # can't set positive calibration if prediv_a<3, so just make test pass
+ print(cal)
+ else:
+ rtc.calibration(cal)
+ print(rtc.calibration())
set_and_print_calib(512)
diff --git a/tests/ports/stm32/servo.py b/tests/ports/stm32/servo.py
index d15cafe483..0784f64d33 100644
--- a/tests/ports/stm32/servo.py
+++ b/tests/ports/stm32/servo.py
@@ -1,4 +1,8 @@
-from pyb import Servo
+try:
+ from pyb import Servo
+except ImportError:
+ print("SKIP")
+ raise SystemExit
servo = Servo(1)
print(servo)
diff --git a/tests/ports/stm32/timer.py b/tests/ports/stm32/timer.py
index 251a06c081..add8c29937 100644
--- a/tests/ports/stm32/timer.py
+++ b/tests/ports/stm32/timer.py
@@ -1,10 +1,15 @@
# check basic functionality of the timer class
-import pyb
+import sys
from pyb import Timer
-tim = Timer(4)
-tim = Timer(4, prescaler=100, period=200)
+if "STM32WB" in sys.implementation._machine:
+ tim_id = 16
+else:
+ tim_id = 4
+
+tim = Timer(tim_id)
+tim = Timer(tim_id, prescaler=100, period=200)
print(tim.prescaler())
print(tim.period())
tim.prescaler(300)
diff --git a/tests/ports/stm32/timer_callback.py b/tests/ports/stm32/timer_callback.py
index 5f170ccde1..4add88ec6a 100644
--- a/tests/ports/stm32/timer_callback.py
+++ b/tests/ports/stm32/timer_callback.py
@@ -1,8 +1,14 @@
# check callback feature of the timer class
-import pyb
+import sys
+import time
from pyb import Timer
+if "STM32WB" in sys.implementation._machine:
+ tim_extra_id = 16
+else:
+ tim_extra_id = 4
+
# callback function that disables the callback when called
def cb1(t):
@@ -29,27 +35,27 @@ def cb3(x):
# create a timer with a callback, using callback(None) to stop
tim = Timer(1, freq=100, callback=cb1)
-pyb.delay(5)
+time.sleep_ms(5)
print("before cb1")
-pyb.delay(15)
+time.sleep_ms(15)
# create a timer with a callback, using deinit to stop
tim = Timer(2, freq=100, callback=cb2)
-pyb.delay(5)
+time.sleep_ms(5)
print("before cb2")
-pyb.delay(15)
+time.sleep_ms(15)
# create a timer, then set the freq, then set the callback
-tim = Timer(4)
+tim = Timer(tim_extra_id)
tim.init(freq=100)
tim.callback(cb1)
-pyb.delay(5)
+time.sleep_ms(5)
print("before cb1")
-pyb.delay(15)
+time.sleep_ms(15)
# test callback with a closure
tim.init(freq=100)
tim.callback(cb3(3))
-pyb.delay(5)
+time.sleep_ms(5)
print("before cb4")
-pyb.delay(15)
+time.sleep_ms(15)
diff --git a/tests/ports/stm32/uart.py b/tests/ports/stm32/uart.py
index 53b0ea6ade..28eb2261b7 100644
--- a/tests/ports/stm32/uart.py
+++ b/tests/ports/stm32/uart.py
@@ -1,5 +1,11 @@
+import sys
from pyb import UART
+if "STM32WB" in sys.implementation._machine:
+ # UART(1) is usually connected to the REPL on these MCUs.
+ print("SKIP")
+ raise SystemExit
+
# test we can correctly create by id
for bus in (-1, 0, 1, 2, 5, 6):
try:
diff --git a/tests/ports/unix/extra_coverage.py b/tests/ports/unix/extra_coverage.py
index ec68a55508..72f5fe56b3 100644
--- a/tests/ports/unix/extra_coverage.py
+++ b/tests/ports/unix/extra_coverage.py
@@ -6,6 +6,16 @@ except NameError:
import errno
import io
+import uctypes
+
+# create an int-like variable used for coverage of `mp_obj_get_ll`
+buf = bytearray(b"\xde\xad\xbe\xef")
+struct = uctypes.struct(
+ uctypes.addressof(buf),
+ {"f32": uctypes.UINT32 | 0},
+ uctypes.BIG_ENDIAN,
+)
+deadbeef = struct.f32
data = extra_coverage()
diff --git a/tests/ports/unix/extra_coverage.py.exp b/tests/ports/unix/extra_coverage.py.exp
index ed21ced242..00658ab3ad 100644
--- a/tests/ports/unix/extra_coverage.py.exp
+++ b/tests/ports/unix/extra_coverage.py.exp
@@ -94,6 +94,12 @@ data
1
0
0.000000
+deadbeef
+c0ffee777c0ffee
+deadbeef
+0deadbeef
+c0ffee
+000c0ffee
# runtime utils
TypeError: unsupported type for __abs__: 'str'
TypeError: unsupported types for __divmod__: 'str', 'str'
@@ -102,6 +108,8 @@ TypeError: unsupported types for __divmod__: 'str', 'str'
2
OverflowError: overflow converting long int to machine word
OverflowError: overflow converting long int to machine word
+TypeError: can't convert NoneType to int
+TypeError: can't convert NoneType to int
ValueError:
Warning: test
# format float