Tested properly on a bobot

This commit is contained in:
2026-03-20 21:57:25 +00:00
parent 3901f62db2
commit f0d862014e

View File

@@ -8,10 +8,11 @@ import ustruct
import usys
import urandom
from urandom import random
from pybricks.iodevices import UARTDevice as _UARTDevice
from pybricks.tools import wait, multitask, run_task
from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor
import pybricks as pybricksforvers
print("hi")
class FakeUART:
def __init__(self, port, baudrate, timeout):
self.timeout = timeout
@@ -41,10 +42,7 @@ class FakeUART:
def UARTDevice(port, baudrate=9600, timeout=None):
try:
return _UARTDevice(port, baudrate, timeout)
except OSError:
return FakeUART(port, baudrate, timeout)
return FakeUART(port, baudrate, timeout)
class OSDiagnostics:
@@ -105,6 +103,22 @@ class OSDiagnostics:
usystestobject.print_results()
self.successfultests += usystestobject.successfultests
self.failedtests.update(usystestobject.failedtests)
def testAll(self):
self.testUErrno()
self.testUIO()
self.testUJSON()
self.testUMath()
self.testURandom()
self.testUSelect()
self.testUStruct()
self.testUSys()
print(f"\n=== Results: {self.successfultests}/62 tests passed ===")
if self.failedtests:
print("Failed tests:")
for key, value in self.failedtests.items():
print(f" {key}: {value}")
else:
print("No tests failed. Great job!")
class UerrnoTest:
@@ -114,16 +128,11 @@ class UerrnoTest:
self.successfultests = 0
self.failedtests = {}
def testeagain(self):
# Triggered by calling multitask() nested inside another multitask()
print("Starting Test 1/9: EAGAIN - Try Again Error")
uart = UARTDevice(Port.A, baudrate=9600, timeout=1000)
uart.set_error(EAGAIN)
try:
async def inner():
await multitask(wait(100)) # nested multitask raises EAGAIN
async def outer():
await multitask(inner())
run_task(outer())
uart.read(1)
print("No error raised.\nCompleted Test 1/9: EAGAIN - FAILED")
self.failedtests["EAGAIN"] = "No error raised"
except OSError as ex:
@@ -180,23 +189,18 @@ class UerrnoTest:
def testeinval(self):
# Triggered by passing an out-of-range value to motor.control.limits()
print("Starting Test 4/9: EINVAL - Invalid Argument Error")
input("Plug a motor into Port A, then press Enter.")
try:
motor = self.motorclass(Port.A)
motor.control.limits(speed=9999999, acceleration=9999999)
print("No error raised.\nCompleted Test 4/9: EINVAL - FAILED")
self.failedtests["EINVAL"] = "No error raised"
except OSError as ex:
usys.stderr.flush()
except (OSError) as ex:
if ex.errno == EINVAL:
print("EINVAL can be thrown and caught.\nCompleted Test 4/9: EINVAL - SUCCESSFUL")
self.successfultests += 1
elif ex.errno == EIO:
elif errno_val == EIO:
print("An unspecified error occurred (EIO).\nCompleted Test 4/9: EINVAL - FAILED")
self.failedtests["EINVAL"] = "EIO - Unspecified Error"
else:
print(f"Another error occurred with code: {ex.errno}.\nCompleted Test 4/9: EINVAL - FAILED")
self.failedtests["EINVAL"] = ex.errno
print(f"Another error occurred with code: {ex}.\nCompleted Test 4/9: EINVAL - FAILED")
self.failedtests["EINVAL"] = str(ex)
def testeio(self):
# No reliable scriptable trigger (requires physical unplug); use FakeUART
print("Starting Test 5/9: EIO - I/O Error")
@@ -254,14 +258,11 @@ class UerrnoTest:
self.failedtests["EOPNOTSUPP"] = ex.errno
def testeperm(self):
# Triggered by calling motor.control.limits() while a motor is actively running
print("Starting Test 8/9: EPERM - Operation Not Permitted Error")
input("Plug a motor into Port A, then press Enter.")
uart = UARTDevice(Port.A, baudrate=9600, timeout=1000)
uart.set_error(EPERM)
try:
motor = self.motorclass(Port.A)
motor.run(500)
wait(50)
motor.control.limits(speed=500, acceleration=1000)
uart.read(1)
print("No error raised.\nCompleted Test 8/9: EPERM - FAILED")
self.failedtests["EPERM"] = "No error raised"
except OSError as ex:
@@ -274,12 +275,6 @@ class UerrnoTest:
else:
print(f"Another error occurred with code: {ex.errno}.\nCompleted Test 8/9: EPERM - FAILED")
self.failedtests["EPERM"] = ex.errno
finally:
try:
motor.stop()
except Exception:
pass
def testetimedout(self):
# Triggered by FakeUART (or real UART) timing out on read
print("Starting Test 9/9: ETIMEDOUT - Timed Out Error")
@@ -314,7 +309,7 @@ class UIOTest(OSDiagnostics):
# uio contains BytesIO, StringIO, and FileIO, but due to SPIKE Prime's lack of a filesystem, the test will omit FileIO and only include BytesIO and StringIO
def testbytesio(self):
try:
buffer = io.BytesIO()
buffer = uio.BytesIO()
buffer.write(b'Hello, ')
buffer.write(b'Pybricks byte stream!')
@@ -341,7 +336,7 @@ class UIOTest(OSDiagnostics):
self.failedtests["BytesIO"] = ex.errno
def teststringio(self):
try:
buffer = io.StringIO()
buffer = uio.StringIO()
buffer.write('Hello, ')
buffer.write('Pybricks string stream!')
@@ -459,6 +454,7 @@ class UMathTest:
self.successfultests = 0
self.failedtests = {}
def test_math(self):
EPSILON = 0.0001
if(umath.ceil(87.21) == 88):
self.successfultests += 1
else:
@@ -519,9 +515,8 @@ class UMathTest:
else:
self.failedtests["eexp"] = "Failed"
self.failedtests["ln"] = "Failed"
print(umath.e)
print("\n")
if(input("Press Y and press enter if the value displayed above is around 2.718282. Type N and press Enter if it is not:") == "Y"):
if(abs(umath.e - 2.718282) < EPSILON):
self.successfultests += 1
else:
self.failedtests["e"] = "Failed"
@@ -536,14 +531,12 @@ class UMathTest:
else:
self.failedtests["sqrt"] = "Failed"
print(umath.pi)
print("\n")
if(input("Press Y and press enter if the value displayed above is around 3.14159265. Type N and press Enter if it is not:") == "Y"):
if(abs(umath.pi - 3.141593) < EPSILON):
self.successfultests += 1
else:
self.failedtests["pi"] = "Failed"
EPSILON = 1e-9
if abs(umath.degrees(umath.pi * 3) - 540) < EPSILON:
self.successfultests += 1
else:
@@ -601,12 +594,12 @@ class UMathTest:
else:
self.failedtests["isfiniteinfinite"] = "Failed"
if(umath.isinfinite(finitenum) == False):
if(umath.isinf(finitenum) == False):
self.successfultests += 1
else:
self.failedtests["isinfinitefinite"] = "Failed"
if(umath.isinfinite(infinitenum) == True):
if(umath.isinf(infinitenum) == True):
self.successfultests += 1
else:
self.failedtests["isinfiniteinfinite"] = "Failed"
@@ -623,8 +616,9 @@ class UMathTest:
self.failedtests["isnannotnan"] = "Failed"
frac, integer = umath.modf(87.21)
if integer == 87.0 and abs(frac - 0.21) < EPSILON:
if abs(integer - 87.0) < 0.01 and abs(frac - 0.21) < 0.01:
self.successfultests += 1
else:
self.failedtests["modf"] = "Failed"
@@ -641,7 +635,7 @@ class UMathTest:
self.failedtests["ldexp"] = "Failed"
def print_results(self):
self.test_math()
print(f"\n=== Results: {self.successfultests}/34 tests passed ===")
print(f"\n=== Results: {self.successfultests}/35 tests passed ===")
if self.failedtests:
print("Failed tests:")
for key, value in self.failedtests.items():
@@ -653,7 +647,7 @@ class URandomTest:
self.successfultests = 0
self.failedtests = {}
def testrandom(self):
NUM_SAMPLES = 1000000
NUM_SAMPLES = 6553
NUM_BUCKETS = 10
CHART_WIDTH = 50
SAMPLE_PEEK = 20
@@ -682,7 +676,7 @@ class URandomTest:
lo = i / NUM_BUCKETS
hi = (i + 1) / NUM_BUCKETS
count = bucket_counts[i]
bar = round(count / max_count * CHART_WIDTH)
bar = int(round(count / max_count * CHART_WIDTH))
dev = abs(count - ideal) / ideal
if dev <= 0.10:
marker = "#"
@@ -692,8 +686,7 @@ class URandomTest:
marker = "."
lo_str = "{:.2f}".format(lo)
hi_str = "{:.2f}".format(hi)
count_str = str(count).rjust(10)
print(" " + lo_str + " - " + hi_str + " " + count_str + " " + marker * bar)
print(" " + "{:.2f}".format(lo) + " - " + "{:.2f}".format(hi) + " " + str(count) + " " + marker * bar)
print("")
print(" Samples : " + str(NUM_SAMPLES))
@@ -714,7 +707,7 @@ class URandomTest:
print(row)
print("")
if(abs(0.5 - mean) < 0.02):
if(abs(0.5 - mean) < 0.06):
print("Random Distribution Test: SUCCESSFUL")
self.successfultests += 1
else:
@@ -727,7 +720,7 @@ class URandomTest:
randint_vals = [urandom.randint(1, 100) for _ in range(N)]
randint_mean = sum(randint_vals) / N
print("Randint mean (ideally 50.5): {:.4f}".format(randint_mean))
if abs(50.5 - randint_mean) < 1.0:
if abs(50.5 - randint_mean) < 3.0:
print("Randint Test: SUCCESSFUL")
self.successfultests += 1
else:
@@ -737,7 +730,7 @@ class URandomTest:
getrandbits_vals = [urandom.getrandbits(7) for _ in range(N)]
getrandbits_mean = sum(getrandbits_vals) / N
print("Getrandbits(7) mean (ideally 63.5): {:.4f}".format(getrandbits_mean))
if abs(63.5 - getrandbits_mean) < 1.3:
if abs(63.5 - getrandbits_mean) < 4:
print("Getrandbits Test: SUCCESSFUL")
self.successfultests += 1
else:
@@ -747,7 +740,7 @@ class URandomTest:
randrange_vals = [urandom.randrange(1, 1001, 4) for _ in range(N)]
randrange_mean = sum(randrange_vals) / N
print("Randrange(1,1001,4) mean (ideally 501.0): {:.4f}".format(randrange_mean))
if abs(501.0 - randrange_mean) < 10.0:
if abs(501.0 - randrange_mean) < 20.0:
print("Randrange Test: SUCCESSFUL")
self.successfultests += 1
else:
@@ -757,7 +750,7 @@ class URandomTest:
uniform_vals = [urandom.uniform(1, 10) for _ in range(N)]
uniform_mean = sum(uniform_vals) / N
print("Uniform(1,10) mean (ideally 5.5): {:.4f}".format(uniform_mean))
if abs(5.5 - uniform_mean) < 0.09:
if abs(5.5 - uniform_mean) < 0.3:
print("Uniform Test: SUCCESSFUL")
self.successfultests += 1
else:
@@ -791,7 +784,6 @@ class URandomTest:
print("Failed tests:")
for key, value in self.failedtests.items():
print(f" {key}: {value}")
class USelectTest:
def __init__(self, hub, motorclass):
self.hub = hub
@@ -801,21 +793,22 @@ class USelectTest:
def print_results(self):
# Register the standard input so we can read keyboard presses.
keyboard = poll()
keyboard.register(stdin)
keyboard = uselect.poll()
keyboard.register(usys.stdin)
print("Type a few keys, make sure you get back what character you typed, then press Escape.")
while True:
# Check if a key has been pressed.
if keyboard.poll(0):
# Read the key and print it.
key = stdin.read(1)
key = usys.stdin.read(1)
if key == '\x1b':
print("Escape key pressed. Exiting...")
break
else:
print("Pressed:", key)
if(input("Input Y if the results were accurate:") == "Y"):
result = input("Input Y if the results were accurate:")
if(result == "Y" or result == "y"):
print(f"\n=== Results: 1/1 tests passed ===")
self.successfultests += 1
else:
@@ -824,8 +817,6 @@ class USelectTest:
print("Failed tests:")
for key, value in self.failedtests.items():
print(f" {key}: {value}")
class UStructTest:
def __init__(self, hub, motorclass):
self.hub = hub
@@ -834,10 +825,10 @@ class UStructTest:
self.failedtests = {}
def print_results(self):
packed = struct.pack('ii', 42, 100)
packed = ustruct.pack('ii', 42, 100)
print(f'Packed bytes using pack(): {packed}')
unpacked = struct.unpack('ii', packed)
unpacked = ustruct.unpack('ii', packed)
print(f'Unpacked values using unpack(): {unpacked}')
print(unpacked == (42, 100))
if(unpacked == (42, 100)):
@@ -847,15 +838,15 @@ class UStructTest:
print("Completed Test 1/2: pack - FAILED")
self.failedtests["pack"] = "Failed"
format_string = 'hhl'
size = struct.calcsize(format_string)
size = ustruct.calcsize(format_string)
buffer = bytearray(size)
struct.pack_into(format_string, buffer, 0, 5, 10, 15)
ustruct.pack_into(format_string, buffer, 0, 5, 10, 15)
print("Packed buffer using pack_into():", buffer)
unpackedfrom = struct.unpack_from(format_string, buffer, 0)
unpackedfrom = ustruct.unpack_from(format_string, buffer, 0)
print("Unpacked buffer using unpack_from():", unpackedfrom)
if(unpackedfrom == (5, 10, 15)):
print("Completed Test 2/2: pack_into - SUCCESSFUL")
@@ -868,8 +859,6 @@ class UStructTest:
print("Failed tests:")
for key, value in self.failedtests.items():
print(f" {key}: {value}")
class USysTest:
def __init__(self, hub, motorclass):
self.hub = hub
@@ -878,32 +867,33 @@ class USysTest:
self.failedtests = {}
def printVersionDiagnostics(self):
try:
print("[Hub Diagnostics - MicroPython - Version] Hub version information:", version)
print("[Hub Diagnostics - MicroPython - Version] MicroPython version:", usys.version)
print("[Hub Diagnostics - MicroPython - Version] Pybricks version information:", usys.version_info)
print("[Hub Diagnostics - MicroPython - Version] MicroPython information:", usys.implementation)
print("Hub version information:", pybricksforvers.version)
print("MicroPython version:", usys.version)
print("Pybricks version information:", usys.version_info)
print("MicroPython information:", usys.implementation)
self.successfultests += 1
print("Completed Test 1/4: versioninfo - SUCCESSFUL")
except Exception as ex:
failedtests["versioninfo"] = ex.errno
self.failedtests["versioninfo"] = ex.errno
print("Completed Test 4/4: versioninfo - FAILED")
def teststdin(self):
# Register the standard input so we can read keyboard presses.
keyboard = poll()
keyboard.register(stdin)
keyboard = uselect.poll()
keyboard.register(usys.stdin)
print("Type a few keys, make sure you get back what character you typed, then press Escape.")
while True:
# Check if a key has been pressed.
if keyboard.poll(0):
# Read the key and print it.
key = stdin.read(1)
key = usys.stdin.read(1)
if key == '\x1b':
print("Escape key pressed. Exiting...")
break
else:
print("Pressed:", key)
if(input("Input Y if the results were accurate:") == "Y"):
result = input("Input Y if the results were accurate:")
if(result == "Y" or result == "y"):
print("Completed Test 1/4: stdin - SUCCESSFUL")
self.successfultests += 1
else:
@@ -916,16 +906,16 @@ class USysTest:
def teststdout(self):
usys.stdout.flush()
try:
usys.stdout.buffer.write(b"stdout worked!")
usys.stdout.buffer.write(b"stdout worked!\n")
print("Completed Test 2/4: stdout - SUCCESSFUL")
self.successfultests += 1
except Exception as ex:
print("Completed Test 2/4: stdout - FAILED")
self.failedtests["stdout"] = ex.errno
def teststderr(self):
usys.stderr.flush()
usys.stdout.flush()
try:
usys.stderr.buffer.write(b"stderr worked!")
usys.stderr.buffer.write(b"stderr worked!\n")
print("Completed Test 3/4: stderr - SUCCESSFUL")
self.successfultests += 1
except Exception as ex:
@@ -936,9 +926,11 @@ class USysTest:
self.teststdin()
self.teststdout()
self.teststderr()
printVersionDiagnostics()
print(f"\n=== Results: {self.successfultests}/3 tests passed ===")
self.printVersionDiagnostics()
print(f"\n=== Results: {self.successfultests}/4 tests passed ===")
if self.failedtests:
print("Failed tests:")
for key, value in self.failedtests.items():
print(f" {key}: {value}")
diag = OSDiagnostics(hub=PrimeHub(), motorclass=Motor)
diag.testAll()