diff --git a/.github/workflows/lint-tests.yml b/.github/workflows/lint-tests.yml new file mode 100644 index 0000000..3005211 --- /dev/null +++ b/.github/workflows/lint-tests.yml @@ -0,0 +1,25 @@ +name: Lint the test files + +on: + push: + paths: + - "tests/**" + pull_request: + paths: + - "tests/**" + workflow_dispatch: {} + +jobs: + lint: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.10' + - name: Verify failing tests and orphaned tests + run: | + cd tests/test_cases + python ../../.github/workflows/lint-tests/lint.py \ No newline at end of file diff --git a/.github/workflows/lint-tests/lint.py b/.github/workflows/lint-tests/lint.py new file mode 100644 index 0000000..d23f6dc --- /dev/null +++ b/.github/workflows/lint-tests/lint.py @@ -0,0 +1,35 @@ +from __future__ import annotations + +import os +import sys +import typing + +def findTestFiles(path) -> typing.Generator[str, None, None]: + for root, _, filenames in os.walk(path): + for filename in filenames: + yield os.path.join(root, filename) + +# strip the leading folder name, so they can be directly compared +inputFiles = set(x[len("input")+1:] for x in findTestFiles("input")) +validFiles = set(x[len("expected_kdl")+1:] for x in findTestFiles("expected_kdl")) + +invalidFiles = inputFiles - validFiles +orphanedFiles = validFiles - inputFiles + +SUCCESS = True + +if orphanedFiles: + SUCCESS = False + print("ERROR: There are outputs in /expected_kdl without corresponding tests in /input:\n" + "\n".join([" "+x for x in orphanedFiles])) + +misnamedFiles: list[str] = [] +for filepath in invalidFiles: + basepath, ext = os.path.splitext(filepath) + if not basepath.endswith("_fail"): + misnamedFiles.append(filepath) +if misnamedFiles: + SUCCESS = False + print("ERROR: There are tests in /input without corresponding outputs in /expected_kdl, but they don't have a _fail suffix:\n" + "\n".join([" "+x for x in misnamedFiles])) + +if not SUCCESS: + sys.exit(1) \ No newline at end of file diff --git a/tests/README.md b/tests/README.md index 0ddfea0..848aeb0 100644 --- a/tests/README.md +++ b/tests/README.md @@ -2,9 +2,11 @@ The `input` folder contains test cases for KDL parsers. The `expected_kdl` folder contains files with the same name as those in `input` with the expected -output after being run through the parser and printed out again. If there's no -file in `expected_kdl` with a name corresponding to one in `input` it -indicates that parsing for that case should fail. +output after being run through the parser and printed out again. + +If a testcase is intended to fail parsing, +the `input` file _MUST_ have a `_fail` suffix, +and there must be no corresponding file in `expected_kdl`. ## Translation Rules diff --git a/tests/test_cases/input/bare_ident_numeric_dot.kdl b/tests/test_cases/input/bare_ident_numeric_dot_fail.kdl similarity index 100% rename from tests/test_cases/input/bare_ident_numeric_dot.kdl rename to tests/test_cases/input/bare_ident_numeric_dot_fail.kdl diff --git a/tests/test_cases/input/bare_ident_numeric.kdl b/tests/test_cases/input/bare_ident_numeric_fail.kdl similarity index 100% rename from tests/test_cases/input/bare_ident_numeric.kdl rename to tests/test_cases/input/bare_ident_numeric_fail.kdl diff --git a/tests/test_cases/input/bare_ident_numeric_sign.kdl b/tests/test_cases/input/bare_ident_numeric_sign_fail.kdl similarity index 100% rename from tests/test_cases/input/bare_ident_numeric_sign.kdl rename to tests/test_cases/input/bare_ident_numeric_sign_fail.kdl diff --git a/tests/test_cases/input/bom_later.kdl b/tests/test_cases/input/bom_later_fail.kdl similarity index 100% rename from tests/test_cases/input/bom_later.kdl rename to tests/test_cases/input/bom_later_fail.kdl diff --git a/tests/test_cases/input/brackets_in_bare_id.kdl b/tests/test_cases/input/brackets_in_bare_id_fail.kdl similarity index 100% rename from tests/test_cases/input/brackets_in_bare_id.kdl rename to tests/test_cases/input/brackets_in_bare_id_fail.kdl diff --git a/tests/test_cases/input/dot_but_no_fraction_before_exponent.kdl b/tests/test_cases/input/dot_but_no_fraction_before_exponent_fail.kdl similarity index 100% rename from tests/test_cases/input/dot_but_no_fraction_before_exponent.kdl rename to tests/test_cases/input/dot_but_no_fraction_before_exponent_fail.kdl diff --git a/tests/test_cases/input/dot_but_no_fraction.kdl b/tests/test_cases/input/dot_but_no_fraction_fail.kdl similarity index 100% rename from tests/test_cases/input/dot_but_no_fraction.kdl rename to tests/test_cases/input/dot_but_no_fraction_fail.kdl diff --git a/tests/test_cases/input/dot_in_exponent.kdl b/tests/test_cases/input/dot_in_exponent_fail.kdl similarity index 100% rename from tests/test_cases/input/dot_in_exponent.kdl rename to tests/test_cases/input/dot_in_exponent_fail.kdl diff --git a/tests/test_cases/input/dot_zero.kdl b/tests/test_cases/input/dot_zero_fail.kdl similarity index 100% rename from tests/test_cases/input/dot_zero.kdl rename to tests/test_cases/input/dot_zero_fail.kdl diff --git a/tests/test_cases/input/empty_arg_type.kdl b/tests/test_cases/input/empty_arg_type_fail.kdl similarity index 100% rename from tests/test_cases/input/empty_arg_type.kdl rename to tests/test_cases/input/empty_arg_type_fail.kdl diff --git a/tests/test_cases/input/empty_node_type.kdl b/tests/test_cases/input/empty_node_type_fail.kdl similarity index 100% rename from tests/test_cases/input/empty_node_type.kdl rename to tests/test_cases/input/empty_node_type_fail.kdl diff --git a/tests/test_cases/input/empty_prop_type.kdl b/tests/test_cases/input/empty_prop_type_fail.kdl similarity index 100% rename from tests/test_cases/input/empty_prop_type.kdl rename to tests/test_cases/input/empty_prop_type_fail.kdl diff --git a/tests/test_cases/input/err_backslash_in_bare_id.kdl b/tests/test_cases/input/err_backslash_in_bare_id_fail.kdl similarity index 100% rename from tests/test_cases/input/err_backslash_in_bare_id.kdl rename to tests/test_cases/input/err_backslash_in_bare_id_fail.kdl diff --git a/tests/test_cases/input/false_prop_key.kdl b/tests/test_cases/input/false_prop_key_fail.kdl similarity index 100% rename from tests/test_cases/input/false_prop_key.kdl rename to tests/test_cases/input/false_prop_key_fail.kdl diff --git a/tests/test_cases/input/floating_point_keyword_identifier_strings_error.kdl.kdl b/tests/test_cases/input/floating_point_keyword_identifier_strings_error.kdl_fail.kdl similarity index 100% rename from tests/test_cases/input/floating_point_keyword_identifier_strings_error.kdl.kdl rename to tests/test_cases/input/floating_point_keyword_identifier_strings_error.kdl_fail.kdl diff --git a/tests/test_cases/input/hash_in_id.kdl b/tests/test_cases/input/hash_in_id_fail.kdl similarity index 100% rename from tests/test_cases/input/hash_in_id.kdl rename to tests/test_cases/input/hash_in_id_fail.kdl diff --git a/tests/test_cases/input/illegal_char_in_binary.kdl b/tests/test_cases/input/illegal_char_in_binary_fail.kdl similarity index 100% rename from tests/test_cases/input/illegal_char_in_binary.kdl rename to tests/test_cases/input/illegal_char_in_binary_fail.kdl diff --git a/tests/test_cases/input/illegal_char_in_hex.kdl b/tests/test_cases/input/illegal_char_in_hex_fail.kdl similarity index 100% rename from tests/test_cases/input/illegal_char_in_hex.kdl rename to tests/test_cases/input/illegal_char_in_hex_fail.kdl diff --git a/tests/test_cases/input/illegal_char_in_octal.kdl b/tests/test_cases/input/illegal_char_in_octal_fail.kdl similarity index 100% rename from tests/test_cases/input/illegal_char_in_octal.kdl rename to tests/test_cases/input/illegal_char_in_octal_fail.kdl diff --git a/tests/test_cases/input/just_space_in_arg_type.kdl b/tests/test_cases/input/just_space_in_arg_type_fail.kdl similarity index 100% rename from tests/test_cases/input/just_space_in_arg_type.kdl rename to tests/test_cases/input/just_space_in_arg_type_fail.kdl diff --git a/tests/test_cases/input/just_space_in_node_type.kdl b/tests/test_cases/input/just_space_in_node_type_fail.kdl similarity index 100% rename from tests/test_cases/input/just_space_in_node_type.kdl rename to tests/test_cases/input/just_space_in_node_type_fail.kdl diff --git a/tests/test_cases/input/just_space_in_prop_type.kdl b/tests/test_cases/input/just_space_in_prop_type_fail.kdl similarity index 100% rename from tests/test_cases/input/just_space_in_prop_type.kdl rename to tests/test_cases/input/just_space_in_prop_type_fail.kdl diff --git a/tests/test_cases/input/just_type_no_arg.kdl b/tests/test_cases/input/just_type_no_arg_fail.kdl similarity index 100% rename from tests/test_cases/input/just_type_no_arg.kdl rename to tests/test_cases/input/just_type_no_arg_fail.kdl diff --git a/tests/test_cases/input/just_type_no_node_id.kdl b/tests/test_cases/input/just_type_no_node_id_fail.kdl similarity index 100% rename from tests/test_cases/input/just_type_no_node_id.kdl rename to tests/test_cases/input/just_type_no_node_id_fail.kdl diff --git a/tests/test_cases/input/just_type_no_prop.kdl b/tests/test_cases/input/just_type_no_prop_fail.kdl similarity index 100% rename from tests/test_cases/input/just_type_no_prop.kdl rename to tests/test_cases/input/just_type_no_prop_fail.kdl diff --git a/tests/test_cases/input/multiline_raw_string_non_matching_prefix_character_error.kdl b/tests/test_cases/input/multiline_raw_string_non_matching_prefix_character_error_fail.kdl similarity index 100% rename from tests/test_cases/input/multiline_raw_string_non_matching_prefix_character_error.kdl rename to tests/test_cases/input/multiline_raw_string_non_matching_prefix_character_error_fail.kdl diff --git a/tests/test_cases/input/multiline_raw_string_non_matching_prefix_count_error.kdl b/tests/test_cases/input/multiline_raw_string_non_matching_prefix_count_error_fail.kdl similarity index 100% rename from tests/test_cases/input/multiline_raw_string_non_matching_prefix_count_error.kdl rename to tests/test_cases/input/multiline_raw_string_non_matching_prefix_count_error_fail.kdl diff --git a/tests/test_cases/input/multiline_raw_string_single_line_err.kdl b/tests/test_cases/input/multiline_raw_string_single_line_err_fail.kdl similarity index 100% rename from tests/test_cases/input/multiline_raw_string_single_line_err.kdl rename to tests/test_cases/input/multiline_raw_string_single_line_err_fail.kdl diff --git a/tests/test_cases/input/multiline_raw_string_single_quote_err.kdl b/tests/test_cases/input/multiline_raw_string_single_quote_err_fail.kdl similarity index 100% rename from tests/test_cases/input/multiline_raw_string_single_quote_err.kdl rename to tests/test_cases/input/multiline_raw_string_single_quote_err_fail.kdl diff --git a/tests/test_cases/input/multiline_string_non_matching_prefix_character_error.kdl b/tests/test_cases/input/multiline_string_non_matching_prefix_character_error_fail.kdl similarity index 100% rename from tests/test_cases/input/multiline_string_non_matching_prefix_character_error.kdl rename to tests/test_cases/input/multiline_string_non_matching_prefix_character_error_fail.kdl diff --git a/tests/test_cases/input/multiline_string_non_matching_prefix_count_error.kdl b/tests/test_cases/input/multiline_string_non_matching_prefix_count_error_fail.kdl similarity index 100% rename from tests/test_cases/input/multiline_string_non_matching_prefix_count_error.kdl rename to tests/test_cases/input/multiline_string_non_matching_prefix_count_error_fail.kdl diff --git a/tests/test_cases/input/multiline_string_single_line_err.kdl b/tests/test_cases/input/multiline_string_single_line_err_fail.kdl similarity index 100% rename from tests/test_cases/input/multiline_string_single_line_err.kdl rename to tests/test_cases/input/multiline_string_single_line_err_fail.kdl diff --git a/tests/test_cases/input/multiline_string_single_quote_err.kdl b/tests/test_cases/input/multiline_string_single_quote_err_fail.kdl similarity index 100% rename from tests/test_cases/input/multiline_string_single_quote_err.kdl rename to tests/test_cases/input/multiline_string_single_quote_err_fail.kdl diff --git a/tests/test_cases/input/multiple_dots_in_float_before_exponent.kdl b/tests/test_cases/input/multiple_dots_in_float_before_exponent_fail.kdl similarity index 100% rename from tests/test_cases/input/multiple_dots_in_float_before_exponent.kdl rename to tests/test_cases/input/multiple_dots_in_float_before_exponent_fail.kdl diff --git a/tests/test_cases/input/multiple_dots_in_float.kdl b/tests/test_cases/input/multiple_dots_in_float_fail.kdl similarity index 100% rename from tests/test_cases/input/multiple_dots_in_float.kdl rename to tests/test_cases/input/multiple_dots_in_float_fail.kdl diff --git a/tests/test_cases/input/multiple_es_in_float.kdl b/tests/test_cases/input/multiple_es_in_float_fail.kdl similarity index 100% rename from tests/test_cases/input/multiple_es_in_float.kdl rename to tests/test_cases/input/multiple_es_in_float_fail.kdl diff --git a/tests/test_cases/input/multiple_x_in_hex.kdl b/tests/test_cases/input/multiple_x_in_hex_fail.kdl similarity index 100% rename from tests/test_cases/input/multiple_x_in_hex.kdl rename to tests/test_cases/input/multiple_x_in_hex_fail.kdl diff --git a/tests/test_cases/input/no_digits_in_hex.kdl b/tests/test_cases/input/no_digits_in_hex_fail.kdl similarity index 100% rename from tests/test_cases/input/no_digits_in_hex.kdl rename to tests/test_cases/input/no_digits_in_hex_fail.kdl diff --git a/tests/test_cases/input/no_integer_digit.kdl b/tests/test_cases/input/no_integer_digit_fail.kdl similarity index 100% rename from tests/test_cases/input/no_integer_digit.kdl rename to tests/test_cases/input/no_integer_digit_fail.kdl diff --git a/tests/test_cases/input/no_solidus_escape.kdl b/tests/test_cases/input/no_solidus_escape_fail.kdl similarity index 100% rename from tests/test_cases/input/no_solidus_escape.kdl rename to tests/test_cases/input/no_solidus_escape_fail.kdl diff --git a/tests/test_cases/input/null_prop_key.kdl b/tests/test_cases/input/null_prop_key_fail.kdl similarity index 100% rename from tests/test_cases/input/null_prop_key.kdl rename to tests/test_cases/input/null_prop_key_fail.kdl diff --git a/tests/test_cases/input/parens_in_bare_id.kdl b/tests/test_cases/input/parens_in_bare_id_fail.kdl similarity index 100% rename from tests/test_cases/input/parens_in_bare_id.kdl rename to tests/test_cases/input/parens_in_bare_id_fail.kdl diff --git a/tests/test_cases/input/quote_in_bare_id.kdl b/tests/test_cases/input/quote_in_bare_id_fail.kdl similarity index 100% rename from tests/test_cases/input/quote_in_bare_id.kdl rename to tests/test_cases/input/quote_in_bare_id_fail.kdl diff --git a/tests/test_cases/input/slash_in_bare_id.kdl b/tests/test_cases/input/slash_in_bare_id_fail.kdl similarity index 100% rename from tests/test_cases/input/slash_in_bare_id.kdl rename to tests/test_cases/input/slash_in_bare_id_fail.kdl diff --git a/tests/test_cases/input/slashdash_child_block_before_entry_err.kdl b/tests/test_cases/input/slashdash_child_block_before_entry_err_fail.kdl similarity index 100% rename from tests/test_cases/input/slashdash_child_block_before_entry_err.kdl rename to tests/test_cases/input/slashdash_child_block_before_entry_err_fail.kdl diff --git a/tests/test_cases/input/square_bracket_in_bare_id.kdl b/tests/test_cases/input/square_bracket_in_bare_id_fail.kdl similarity index 100% rename from tests/test_cases/input/square_bracket_in_bare_id.kdl rename to tests/test_cases/input/square_bracket_in_bare_id_fail.kdl diff --git a/tests/test_cases/input/true_prop_key.kdl b/tests/test_cases/input/true_prop_key_fail.kdl similarity index 100% rename from tests/test_cases/input/true_prop_key.kdl rename to tests/test_cases/input/true_prop_key_fail.kdl diff --git a/tests/test_cases/input/type_before_prop_key.kdl b/tests/test_cases/input/type_before_prop_key_fail.kdl similarity index 100% rename from tests/test_cases/input/type_before_prop_key.kdl rename to tests/test_cases/input/type_before_prop_key_fail.kdl diff --git a/tests/test_cases/input/unbalanced_raw_hashes.kdl b/tests/test_cases/input/unbalanced_raw_hashes_fail.kdl similarity index 100% rename from tests/test_cases/input/unbalanced_raw_hashes.kdl rename to tests/test_cases/input/unbalanced_raw_hashes_fail.kdl diff --git a/tests/test_cases/input/underscore_at_start_of_fraction.kdl b/tests/test_cases/input/underscore_at_start_of_fraction_fail.kdl similarity index 100% rename from tests/test_cases/input/underscore_at_start_of_fraction.kdl rename to tests/test_cases/input/underscore_at_start_of_fraction_fail.kdl diff --git a/tests/test_cases/input/underscore_at_start_of_hex.kdl b/tests/test_cases/input/underscore_at_start_of_hex_fail.kdl similarity index 100% rename from tests/test_cases/input/underscore_at_start_of_hex.kdl rename to tests/test_cases/input/underscore_at_start_of_hex_fail.kdl diff --git a/tests/test_cases/input/unicode_delete.kdl b/tests/test_cases/input/unicode_delete_fail.kdl similarity index 100% rename from tests/test_cases/input/unicode_delete.kdl rename to tests/test_cases/input/unicode_delete_fail.kdl diff --git a/tests/test_cases/input/unicode_fsi.kdl b/tests/test_cases/input/unicode_fsi_fail.kdl similarity index 100% rename from tests/test_cases/input/unicode_fsi.kdl rename to tests/test_cases/input/unicode_fsi_fail.kdl diff --git a/tests/test_cases/input/unicode_lre.kdl b/tests/test_cases/input/unicode_lre_fail.kdl similarity index 100% rename from tests/test_cases/input/unicode_lre.kdl rename to tests/test_cases/input/unicode_lre_fail.kdl diff --git a/tests/test_cases/input/unicode_lri.kdl b/tests/test_cases/input/unicode_lri_fail.kdl similarity index 100% rename from tests/test_cases/input/unicode_lri.kdl rename to tests/test_cases/input/unicode_lri_fail.kdl diff --git a/tests/test_cases/input/unicode_lrm.kdl b/tests/test_cases/input/unicode_lrm_fail.kdl similarity index 100% rename from tests/test_cases/input/unicode_lrm.kdl rename to tests/test_cases/input/unicode_lrm_fail.kdl diff --git a/tests/test_cases/input/unicode_lro.kdl b/tests/test_cases/input/unicode_lro_fail.kdl similarity index 100% rename from tests/test_cases/input/unicode_lro.kdl rename to tests/test_cases/input/unicode_lro_fail.kdl diff --git a/tests/test_cases/input/unicode_pdf.kdl b/tests/test_cases/input/unicode_pdf_fail.kdl similarity index 100% rename from tests/test_cases/input/unicode_pdf.kdl rename to tests/test_cases/input/unicode_pdf_fail.kdl diff --git a/tests/test_cases/input/unicode_pdi.kdl b/tests/test_cases/input/unicode_pdi_fail.kdl similarity index 100% rename from tests/test_cases/input/unicode_pdi.kdl rename to tests/test_cases/input/unicode_pdi_fail.kdl diff --git a/tests/test_cases/input/unicode_rle.kdl b/tests/test_cases/input/unicode_rle_fail.kdl similarity index 100% rename from tests/test_cases/input/unicode_rle.kdl rename to tests/test_cases/input/unicode_rle_fail.kdl diff --git a/tests/test_cases/input/unicode_rli.kdl b/tests/test_cases/input/unicode_rli_fail.kdl similarity index 100% rename from tests/test_cases/input/unicode_rli.kdl rename to tests/test_cases/input/unicode_rli_fail.kdl diff --git a/tests/test_cases/input/unicode_rlm.kdl b/tests/test_cases/input/unicode_rlm_fail.kdl similarity index 100% rename from tests/test_cases/input/unicode_rlm.kdl rename to tests/test_cases/input/unicode_rlm_fail.kdl diff --git a/tests/test_cases/input/unicode_rlo.kdl b/tests/test_cases/input/unicode_rlo_fail.kdl similarity index 100% rename from tests/test_cases/input/unicode_rlo.kdl rename to tests/test_cases/input/unicode_rlo_fail.kdl diff --git a/tests/test_cases/input/unicode_under_0x20.kdl b/tests/test_cases/input/unicode_under_0x20_fail.kdl similarity index 100% rename from tests/test_cases/input/unicode_under_0x20.kdl rename to tests/test_cases/input/unicode_under_0x20_fail.kdl diff --git a/tests/test_cases/input/unterminated_empty_node.kdl b/tests/test_cases/input/unterminated_empty_node_fail.kdl similarity index 100% rename from tests/test_cases/input/unterminated_empty_node.kdl rename to tests/test_cases/input/unterminated_empty_node_fail.kdl