2014-04-02 15:31:39 +01:00
|
|
|
#! /usr/bin/env python3
|
2014-01-27 21:53:28 +00:00
|
|
|
|
|
|
|
import os
|
|
|
|
import subprocess
|
|
|
|
import sys
|
|
|
|
from glob import glob
|
|
|
|
|
2014-04-04 15:28:34 +01:00
|
|
|
# Tests require at least CPython 3.3. If your default python3 executable
|
|
|
|
# is of lower version, you can point MICROPY_CPYTHON3 environment var
|
|
|
|
# to the correct executable.
|
2014-01-27 21:53:28 +00:00
|
|
|
if os.name == 'nt':
|
2014-04-04 15:28:34 +01:00
|
|
|
CPYTHON3 = os.getenv('MICROPY_CPYTHON3', 'python3.exe')
|
2014-01-27 21:53:28 +00:00
|
|
|
MP_PY = '../windows/micropython.exe'
|
|
|
|
else:
|
2014-04-03 20:06:35 +01:00
|
|
|
CPYTHON3 = os.getenv('MICROPY_CPYTHON3', 'python3')
|
2014-01-27 21:53:28 +00:00
|
|
|
MP_PY = '../unix/micropython'
|
|
|
|
|
2014-03-22 23:07:30 +00:00
|
|
|
def rm_f(fname):
|
|
|
|
if os.path.exists(fname):
|
|
|
|
os.remove(fname)
|
|
|
|
|
2014-01-27 21:53:28 +00:00
|
|
|
test_count = 0
|
|
|
|
testcase_count = 0
|
|
|
|
passed_count = 0
|
|
|
|
failed_tests = []
|
|
|
|
tests = []
|
|
|
|
|
|
|
|
if not sys.argv[1:]:
|
2014-04-02 14:23:04 +01:00
|
|
|
tests = sorted(glob('basics/*.py') + glob('io/*.py') + glob('misc/*.py'))
|
2014-01-27 21:53:28 +00:00
|
|
|
else:
|
|
|
|
tests = sys.argv[1:]
|
|
|
|
|
2014-04-03 22:44:51 +01:00
|
|
|
test_on_pyboard = False
|
|
|
|
if test_on_pyboard:
|
|
|
|
import pyboard
|
|
|
|
pyb = pyboard.Pyboard('/dev/ttyACM0')
|
|
|
|
pyb.enter_raw_repl()
|
|
|
|
|
2014-01-27 21:53:28 +00:00
|
|
|
for test_file in tests:
|
|
|
|
test_name = os.path.splitext(os.path.basename(test_file))[0]
|
|
|
|
|
2014-04-03 23:51:16 +01:00
|
|
|
# run CPython
|
|
|
|
try:
|
|
|
|
output_expected = subprocess.check_output([CPYTHON3, '-B', test_file])
|
|
|
|
except subprocess.CalledProcessError:
|
|
|
|
output_expected = b'CPYTHON3 CRASH'
|
|
|
|
|
|
|
|
# run Micro Python
|
2014-01-29 22:32:23 +00:00
|
|
|
try:
|
2014-04-03 22:44:51 +01:00
|
|
|
if test_on_pyboard:
|
|
|
|
pyb.enter_raw_repl()
|
|
|
|
output_mupy = pyb.execfile(test_file).replace(b'\r\n', b'\n')
|
|
|
|
else:
|
2014-04-06 12:58:40 +01:00
|
|
|
output_mupy = subprocess.check_output([MP_PY, '-X', 'emit=bytecode', test_file])
|
2014-01-29 22:32:23 +00:00
|
|
|
except subprocess.CalledProcessError:
|
2014-03-22 23:07:30 +00:00
|
|
|
output_mupy = b'CRASH'
|
2014-01-27 21:53:28 +00:00
|
|
|
|
|
|
|
testcase_count += len(output_expected.splitlines())
|
|
|
|
|
2014-01-29 22:32:23 +00:00
|
|
|
if output_expected == output_mupy:
|
2014-01-27 21:53:28 +00:00
|
|
|
print("pass ", test_file)
|
|
|
|
passed_count += 1
|
2014-03-22 23:07:30 +00:00
|
|
|
rm_f(os.path.basename(test_file + ".exp"))
|
|
|
|
rm_f(os.path.basename(test_file + ".out"))
|
2014-01-27 21:53:28 +00:00
|
|
|
else:
|
2014-03-22 23:07:30 +00:00
|
|
|
with open(os.path.basename(test_file + ".exp"), "w") as f:
|
|
|
|
f.write(str(output_expected, "ascii"))
|
|
|
|
with open(os.path.basename(test_file + ".out"), "w") as f:
|
|
|
|
f.write(str(output_mupy, "ascii"))
|
2014-01-27 21:53:28 +00:00
|
|
|
print("FAIL ", test_file)
|
|
|
|
failed_tests.append(test_name)
|
|
|
|
|
|
|
|
test_count += 1
|
|
|
|
|
2014-01-29 22:32:23 +00:00
|
|
|
print("{} tests performed ({} individual testcases)".format(test_count, testcase_count))
|
2014-01-27 21:53:28 +00:00
|
|
|
print("{} tests passed".format(passed_count))
|
|
|
|
|
|
|
|
if len(failed_tests) > 0:
|
2014-01-29 22:32:23 +00:00
|
|
|
print("{} tests failed: {}".format(len(failed_tests), ' '.join(failed_tests)))
|
2014-01-27 21:53:28 +00:00
|
|
|
sys.exit(1)
|