|
5 | 5 | # Path to the executable |
6 | 6 | LSYS_EXE = pathlib.Path(__file__).parent.parent / "build" / "lsystems" |
7 | 7 |
|
8 | | -def collect_test_cases(folder, expect_success=True): |
| 8 | +def collect_test_cases(folder, expect_success): |
9 | 9 | input_dir = pathlib.Path(__file__).parent / folder |
10 | 10 | test_cases = [] |
11 | | - for ls_file in input_dir.glob("*.lsy"): |
| 11 | + for ls_file in input_dir.rglob("*.lsy"): |
12 | 12 | expected_file = ls_file.with_suffix(".expected") |
13 | | - test_cases.append((ls_file, expected_file, expect_success)) |
| 13 | + test_name = str(ls_file.relative_to(input_dir)) |
| 14 | + test_cases.append(pytest.param(ls_file, expected_file, expect_success, id=test_name)) |
14 | 15 | return test_cases |
15 | 16 |
|
16 | | -@pytest.mark.parametrize("ls_file, expected_file, expect_success", collect_test_cases("success", expect_success=True)) |
17 | | -def test_success_cases(ls_file, expected_file, expect_success): |
| 17 | +def run_test_case(ls_file, expected_file, expect_success): |
18 | 18 | result = subprocess.run( |
19 | | - [str(LSYS_EXE), str(pathlib.Path(ls_file))], |
| 19 | + [str(LSYS_EXE), str(ls_file)], |
20 | 20 | stdout=subprocess.PIPE, |
21 | 21 | stderr=subprocess.PIPE, |
22 | 22 | timeout=2 |
23 | 23 | ) |
24 | 24 | output = result.stdout.decode("utf-8") |
25 | | - expected = expected_file.read_text(encoding="utf-8") |
| 25 | + if expect_success: |
| 26 | + expected = expected_file.read_text(encoding="utf-8") |
| 27 | + assert result.returncode == 0, f"{ls_file} failed unexpectedly" |
| 28 | + assert output == expected, f"{ls_file} output mismatch" |
| 29 | + else: |
| 30 | + output += result.stderr.decode("utf-8") |
| 31 | + expected = expected_file.read_text(encoding="utf-8") |
| 32 | + assert result.returncode != 0, f"{ls_file} should fail but succeeded" |
| 33 | + assert expected in output, f"{ls_file} error message mismatch" |
26 | 34 |
|
27 | | - assert result.returncode == 0, f"{ls_file.name} failed unexpectedly" |
28 | | - assert output == expected, f"{ls_file.name} output mismatch" |
| 35 | +@pytest.mark.parametrize("ls_file, expected_file, expect_success", collect_test_cases("success", expect_success=True)) |
| 36 | +def test_success_cases(ls_file, expected_file, expect_success): |
| 37 | + run_test_case(ls_file, expected_file, expect_success) |
29 | 38 |
|
30 | 39 | @pytest.mark.parametrize("ls_file, expected_file, expect_success", collect_test_cases("failure", expect_success=False)) |
31 | 40 | def test_failure_cases(ls_file, expected_file, expect_success): |
32 | | - result = subprocess.run( |
33 | | - [str(LSYS_EXE), str(pathlib.Path(ls_file))], |
34 | | - stdout=subprocess.PIPE, |
35 | | - stderr=subprocess.PIPE, |
36 | | - timeout=2 |
37 | | - ) |
38 | | - output = result.stdout.decode("utf-8") + result.stderr.decode("utf-8") |
39 | | - expected = expected_file.read_text(encoding="utf-8") |
40 | | - |
41 | | - assert result.returncode != 0, f"{ls_file.name} should fail but succeeded" |
42 | | - assert expected in output, f"{ls_file.name} error message mismatch" |
| 41 | + run_test_case(ls_file, expected_file, expect_success) |
0 commit comments