diff --git a/doc/source/dev/tool_state_state_classes.plantuml.svg b/doc/source/dev/tool_state_state_classes.plantuml.svg index b0c086bf18b0..de86dbcd3787 100644 --- a/doc/source/dev/tool_state_state_classes.plantuml.svg +++ b/doc/source/dev/tool_state_state_classes.plantuml.svg @@ -1,14 +1,21 @@ -galaxy.tool_util.parameters.stateToolStatestate_representation: strinput_state: Dict[str, Any]validate(input_models: ToolParameterBundle)_to_base_model(input_models: ToolParameterBundle): Optional[Type[BaseModel]]RequestToolStatestate_representation = "request"_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]Object references of the form{src: "hda", id: <encoded_id>}.Allow mapping/reduce constructs.RequestInternalToolStatestate_representation = "request_internal"_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]Object references of the form{src: "hda", id: <decoded_id>}.Allow mapping/reduce constructs.JobInternalToolStatestate_representation = "job_internal"_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]Object references of the form{src: "hda", id: <decoded_id>}.Mapping constructs expanded out.(Defaults are inserted?)decodeexpandgalaxy.tool_util.parameters.stateToolStatestate_representation: strinput_state: Dict[str, Any]validate(input_models: ToolParameterBundle)_to_base_model(input_models: ToolParameterBundle): Optional[Type[BaseModel]]RequestToolStatestate_representation = "request"_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]Object references of the form{src: "hda", id: <encoded_id>}.Allow mapping/reduce constructs.RequestInternalToolStatestate_representation = "request_internal"_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]Object references of the form{src: "hda", id: <decoded_id>}.Allow mapping/reduce constructs.JobInternalToolStatestate_representation = "job_internal"_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]Object references of the form{src: "hda", id: <decoded_id>}.Mapping constructs expanded out.(Defaults are inserted?)TestCaseToolStatestate_representation = "test_case"_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]Object references of the form file name and URIs.Mapping constructs not allowed. WorkflowStepToolStatestate_representation = "workflow_step"_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]Nearly everything optional except conditional discriminators. WorkflowStepLinkedToolStatestate_representation = "workflow_step_linked"_to_base_model(input_models: ToolParameterBundle): Type[BaseModel]Expect pre-process ``in`` dictionaries and bring in representationof links and defaults and validate them in model. decodeexpandpreprocess_links_and_defaults + +echo '$p1.p1val' > '$out_file1' && +echo $booltest >> '$out_file1' && +echo $inttest >> '$out_file1' && +echo $floattest >> '$out_file1' && +echo $radio_select >> '$out_file1' && +echo $check_select >> '$out_file1' && +echo $drop_select >> '$out_file1' && +#if len($files) > 0 + cat '$files[0].file' >> '$out_file1' +#end if + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/functional/tools/section_24_2.xml b/test/functional/tools/section_24_2.xml new file mode 100644 index 000000000000..ec62f0fd8ee9 --- /dev/null +++ b/test/functional/tools/section_24_2.xml @@ -0,0 +1,43 @@ + + +echo $int.inttest > '$out_file1' && +echo $float.floattest >> '$out_file1' + + +
+ +
+
+ +
+
+ + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+
+
diff --git a/test/unit/tool_util/parameter_specification.yml b/test/unit/tool_util/parameter_specification.yml index d67587a50cbb..da3671057075 100644 --- a/test/unit/tool_util/parameter_specification.yml +++ b/test/unit/tool_util/parameter_specification.yml @@ -14,6 +14,7 @@ # Things to verify: # - non optional, multi-selects require a selection (see TODO below...) +# - https://github.com/galaxyproject/galaxy/issues/18541 gx_int: request_valid: - parameter: 5 @@ -25,12 +26,27 @@ gx_int: - parameter: "null" - parameter: "None" - parameter: { 5 } - test_case_valid: + - parameter: {__class__: 'ConnectedValue'} + test_case_xml_valid: - parameter: 5 - {} - test_case_invalid: + test_case_xml_invalid: - parameter: null - parameter: "5" + workflow_step_valid: + - parameter: 5 + - {} + workflow_step_invalid: + - parameterx: 5 + - parameter: 'foobar' + workflow_step_linked_valid: + - parameter: 5 + - parameter: {__class__: 'ConnectedValue'} + workflow_step_linked_invalid: + - parameter: null + - parameter: 'foobar' + - parameter: {__class__: 'ConnectedValue2'} + gx_boolean: request_valid: @@ -44,6 +60,21 @@ gx_boolean: # Marius and John were on fence here. - parameter: "mytrue" - parameter: null + - parameter: {__class__: 'ConnectedValue'} + workflow_step_valid: + - parameter: True + - {} + workflow_step_invalid: + - parameter: "true" + - parameter: mytrue + - parameter: null + workflow_step_linked_valid: + - parameter: True + - {} + - parameter: {__class__: 'ConnectedValue'} + workflow_step_linked_invalid: + - parameter: "true" + - parameter: {__class__: 'ConnectedValue3'} gx_int_optional: request_valid: @@ -55,6 +86,21 @@ gx_int_optional: - parameter: "None" - parameter: "null" - parameter: [5] + - parameter: {__class__: 'ConnectedValue'} + workflow_step_valid: + - parameter: 5 + - parameter: null + - {} + workflow_step_invalid: + - parameter: "5" + - parameter: "None" + - parameter: "null" + - parameter: [5] + workflow_step_linked_valid: + - parameter: 5 + - parameter: null + - {} + - parameter: {__class__: 'ConnectedValue'} gx_int_required: &gx_int_required request_valid: @@ -76,11 +122,36 @@ gx_text: - parameter: moocow - parameter: 'some spaces' - parameter: '' + - {} request_invalid: - parameter: 5 - parameter: null - parameter: {} - parameter: { "moo": "cow" } + - parameter: {__class__: 'ConnectedValue'} + workflow_step_valid: + - parameter: moocow + - parameter: 'some spaces' + - parameter: '' + - {} + workflow_step_invalid: + - parameter: 5 + - parameter: null + - parameter: {} + - parameter: { "moo": "cow" } + - parameter: {__class__: 'ConnectedValue'} + workflow_step_linked_valid: + - parameter: moocow + - parameter: 'some spaces' + - parameter: '' + - {} + - parameter: {__class__: 'ConnectedValue'} + workflow_step_linked_invalid: + - parameter: 5 + - parameter: null + - parameter: {} + - parameter: { "moo": "cow" } + - parameter: {"class": 'ConnectedValue'} gx_text_optional: request_valid: @@ -92,6 +163,26 @@ gx_text_optional: - parameter: 5 - parameter: {} - parameter: { "moo": "cow" } + workflow_step_valid: + - parameter: moocow + - parameter: 'some spaces' + - parameter: '' + - parameter: null + workflow_step_invalid: + - parameter: 5 + - parameter: {} + - parameter: { "moo": "cow" } + - parameter: {__class__: 'ConnectedValue'} + workflow_step_linked_valid: + - parameter: moocow + - parameter: 'some spaces' + - parameter: '' + - parameter: null + - parameter: {__class__: 'ConnectedValue'} + workflow_step_linked_invalid: + - parameter: 5 + - parameter: {} + - parameter: { "moo": "cow" } gx_select: request_valid: @@ -113,13 +204,26 @@ gx_select: - parameter: "ex2" request_internal_invalid: - parameter: {} - test_case_valid: + test_case_xml_valid: - parameter: 'ex2' - parameter: '--ex1' - {} - test_case_invalid: + test_case_xml_invalid: - parameter: {} - parameter: null + workflow_step_valid: + - parameter: "--ex1" + - {} + workflow_step_invalid: + - parameter: 'foobar' + - parameter: {__class__: 'ConnectedValue'} + workflow_step_linked_valid: + - parameter: "--ex1" + - parameter: {__class__: 'ConnectedValue'} + - {} + workflow_step_linked_invalid: + - parameter: 'foobar' + - parameter: null gx_select_optional: request_valid: @@ -135,6 +239,28 @@ gx_select_optional: - parameter: ["ex2"] - parameter: {} - parameter: 5 + workflow_step_valid: + - parameter: "--ex1" + - parameter: "ex2" + - parameter: null + - {} + workflow_step_invalid: + - parameter: "Ex1" + - parameter: ["ex2"] + - parameter: {} + - parameter: 5 + - parameter: {__class__: 'ConnectedValue'} + workflow_step_linked_valid: + - parameter: "--ex1" + - parameter: "ex2" + - parameter: null + - {} + - parameter: {__class__: 'ConnectedValue'} + workflow_step_linked_invalid: + - parameter: "Ex1" + - parameter: ["ex2"] + - parameter: {} + - parameter: 5 gx_select_multiple: request_valid: @@ -147,6 +273,32 @@ gx_select_multiple: - parameter: {} - parameter: 5 - {} + workflow_step_valid: + - parameter: ["--ex1"] + - parameter: ["ex2"] + - {} # could come in linked... + # ... hmmm? this should maybe be invalid right? + - parameter: null + workflow_step_invalid: + - parameter: ["Ex1"] + - parameter: {} + - parameter: 5 + - parameter: {__class__: 'ConnectedValue'} + - parameter: [{__class__: 'ConnectedValue'}] + workflow_step_linked_valid: + - parameter: ["--ex1"] + - parameter: ["ex2"] + - parameter: [{__class__: 'ConnectedValue'}] + workflow_step_linked_invalid: + - parameter: ["Ex1"] + - parameter: {} + - parameter: 5 + - {} + # might be wrong? I guess we would expect the semantic of this to do like a map-over + # but as far as I am aware that is not implemented https://github.com/galaxyproject/galaxy/issues/18541 + - parameter: {__class__: 'ConnectedValue'} + # they are non-optinoal right? + - parameter: null gx_select_multiple_optional: request_valid: @@ -209,6 +361,19 @@ gx_hidden: - parameter: 5 - parameter: {} - parameter: { "moo": "cow" } + workflow_step_valid: + - parameter: moocow + - {} + workflow_step_invalid: + - parmaeter: 5 + - parameter: {} + - parameter: { "moo": "cow" } + workflow_step_linked_valid: + - parameter: moocow + - parameter: {__class__: 'ConnectedValue'} + workflow_step_linked_invalid: + - parameter: 5 + - parameter: null gx_hidden_optional: request_valid: @@ -220,7 +385,21 @@ gx_hidden_optional: - parameter: 5 - parameter: {} - parameter: { "moo": "cow" } - + workflow_step_valid: + - parameter: moocow + - {} + - parameter: null + workflow_step_invalid: + - parmaeter: 5 + - parameter: {} + - parameter: { "moo": "cow" } + workflow_step_linked_valid: + - parameter: moocow + - parameter: {__class__: 'ConnectedValue'} + - parameter: null + workflow_step_linked_invalid: + - parameter: 5 + gx_float: request_valid: - parameter: 5 @@ -233,6 +412,30 @@ gx_float: - parameter: "5" - parameter: "5.0" - parameter: { "moo": "cow" } + test_case_xml_valid: + - parameter: 5 + - parameter: 5.0 + - {} + test_case_xml_invalid: + - parameter: null + - parameter: "5.0" + - parameter: "5.1" + workflow_step_valid: + - parameter: 5 + - parameter: 5.0 + - {} + workflow_step_invalid: + - parameterx: 5 + - parameter: 'foobar' + workflow_step_linked_valid: + - parameter: 5 + - parameter: 5.4 + - parameter: {__class__: 'ConnectedValue'} + workflow_step_linked_invalid: + - parameter: null + - parameter: 'foobar' + - parameter: {__class__: 'ConnectedValue2'} + gx_float_optional: request_valid: @@ -246,6 +449,29 @@ gx_float_optional: - parameter: "5.0" - parameter: {} - parameter: { "moo": "cow" } + test_case_xml_valid: + - parameter: 5 + - parameter: 5.0 + - {} + - parameter: null + test_case_xml_invalid: + - parameter: "5.0" + - parameter: "5.1" + workflow_step_valid: + - parameter: 5 + - parameter: 5.0 + - {} + workflow_step_invalid: + - parameterx: 5 + - parameter: 'foobar' + workflow_step_linked_valid: + - parameter: 5 + - parameter: 5.4 + - parameter: {__class__: 'ConnectedValue'} + - parameter: null + workflow_step_linked_invalid: + - parameter: 'foobar' + - parameter: {__class__: 'ConnectedValue2'} gx_color: request_valid: @@ -255,6 +481,22 @@ gx_color: - parameter: null - parameter: {} - parameter: '#abcd' + workflow_step_valid: + - parameter: '#aabbcc' + - parameter: '#000000' + - {} + workflow_step_invalid: + - parameterx: '#aabbcc' + - parameter: 'foobar' + - parameter: 5 + workflow_step_linked_valid: + - parameter: '#aabbcc' + - parameter: {__class__: 'ConnectedValue'} + workflow_step_linked_invalid: + - parameter: null + - parameter: 'foobar' + - parameter: 5 + - parameter: {__class__: 'ConnectedValue2'} gx_data: request_valid: @@ -291,6 +533,21 @@ gx_data: # expanded out. - parameter: {__class__: "Batch", values: [{src: hdca, id: 5}]} - parameter: {src: hda, id: abcdabcd} + workflow_step_valid: + - {} + workflow_step_invalid: + - {src: hda, id: abcdabcd} + - {src: hda, id: 7} + - parameter: {__class__: "Batch", values: [{src: hdca, id: 5}]} + - parameter: {__class__: 'ConnectedValue'} + workflow_step_linked_valid: + - parameter: {__class__: 'ConnectedValue'} + workflow_step_linked_invalid: + - {} + - {src: hda, id: abcdabcd} + - {src: hda, id: 7} + - parameter: {__class__: "Batch", values: [{src: hdca, id: 5}]} + - parameter: {__class__: 'ConnectedValueX'} gx_data_optional: @@ -320,6 +577,21 @@ gx_data_optional: - parameter: true - parameter: 5 - parameter: "5" + workflow_step_valid: + - {} + workflow_step_invalid: + - {src: hda, id: abcdabcd} + - {src: hda, id: 7} + - parameter: {__class__: "Batch", values: [{src: hdca, id: 5}]} + - parameter: {__class__: 'ConnectedValue'} + workflow_step_linked_valid: + - {} + - parameter: {__class__: 'ConnectedValue'} + workflow_step_linked_invalid: + - {src: hda, id: abcdabcd} + - {src: hda, id: 7} + - parameter: {__class__: "Batch", values: [{src: hdca, id: 5}]} + - parameter: {__class__: 'ConnectedValueX'} gx_data_multiple: request_valid: @@ -408,6 +680,16 @@ gx_data_collection: - parameter: true - parameter: 5 - parameter: "5" + workflow_step_valid: + - {} + workflow_step_invalid: + - parameter: {src: hdca, id: abcdabcd} + - parameter: 5 + - parameter: {} + workflow_step_linked_valid: + - parameter: {__class__: 'ConnectedValue'} + workflow_step_linked_invalid: + - {} gx_data_collection_optional: request_valid: @@ -712,6 +994,12 @@ gx_data_column: - { ref_parameter: {src: hda, id: 123}, parameter: 0 } request_internal_invalid: - { ref_parameter: {src: hda, id: 123}, parameter: "0" } + test_case_xml_valid: + - { ref_parameter: "1.bed", parameter: 3 } + test_case_xml_invalid: + - { ref_parameter: "1.bed", parameter: "3" } + test_case_xml_invalid: + - { ref_parameter: "1.bed", parameter: "c2: With name" } gx_data_column_optional: request_valid: diff --git a/test/unit/tool_util/test_parameter_specification.py b/test/unit/tool_util/test_parameter_specification.py index 556a6f89d76e..6a54d78cfabf 100644 --- a/test/unit/tool_util/test_parameter_specification.py +++ b/test/unit/tool_util/test_parameter_specification.py @@ -20,6 +20,8 @@ validate_internal_request, validate_request, validate_test_case, + validate_workflow_step, + validate_workflow_step_linked, ) from galaxy.tool_util.parameters.json import to_json_schema_string from galaxy.tool_util.unittest_utils.parameters import ( @@ -91,8 +93,12 @@ def _test_file(file: str, specification=None, parameter_bundle: Optional[ToolPar "request_internal_invalid": _assert_internal_requests_invalid, "job_internal_valid": _assert_internal_jobs_validate, "job_internal_invalid": _assert_internal_jobs_invalid, - "test_case_valid": _assert_test_cases_validate, - "test_case_invalid": _assert_test_cases_invalid, + "test_case_xml_valid": _assert_test_cases_validate, + "test_case_xml_invalid": _assert_test_cases_invalid, + "workflow_step_valid": _assert_workflow_steps_validate, + "workflow_step_invalid": _assert_workflow_steps_invalid, + "workflow_step_linked_valid": _assert_workflow_steps_linked_validate, + "workflow_step_linked_invalid": _assert_workflow_steps_linked_invalid, } for valid_or_invalid, tests in combos.items(): @@ -183,6 +189,48 @@ def _assert_test_case_invalid(parameters: ToolParameterBundleModel, test_case: R ), f"Parameters {parameters} didn't result in validation error on test_case {test_case} as expected." +def _assert_workflow_step_validates(parameters: ToolParameterBundleModel, workflow_step: RawStateDict) -> None: + try: + validate_workflow_step(parameters, workflow_step) + except RequestParameterInvalidException as e: + raise AssertionError(f"Parameters {parameters} failed to validate workflow step {workflow_step}. {e}") + + +def _assert_workflow_step_invalid(parameters: ToolParameterBundleModel, workflow_step: RawStateDict) -> None: + exc = None + try: + validate_workflow_step(parameters, workflow_step) + except RequestParameterInvalidException as e: + exc = e + assert ( + exc is not None + ), f"Parameters {parameters} didn't result in validation error on workflow step {workflow_step} as expected." + + +def _assert_workflow_step_linked_validates( + parameters: ToolParameterBundleModel, workflow_step_linked: RawStateDict +) -> None: + try: + validate_workflow_step_linked(parameters, workflow_step_linked) + except RequestParameterInvalidException as e: + raise AssertionError( + f"Parameters {parameters} failed to validate linked workflow step {workflow_step_linked}. {e}" + ) + + +def _assert_workflow_step_linked_invalid( + parameters: ToolParameterBundleModel, workflow_step_linked: RawStateDict +) -> None: + exc = None + try: + validate_workflow_step_linked(parameters, workflow_step_linked) + except RequestParameterInvalidException as e: + exc = e + assert ( + exc is not None + ), f"Parameters {parameters} didn't result in validation error on linked workflow step {workflow_step_linked} as expected." + + _assert_requests_validate = partial(_for_each, _assert_request_validates) _assert_requests_invalid = partial(_for_each, _assert_request_invalid) _assert_internal_requests_validate = partial(_for_each, _assert_internal_request_validates) @@ -191,6 +239,10 @@ def _assert_test_case_invalid(parameters: ToolParameterBundleModel, test_case: R _assert_internal_jobs_invalid = partial(_for_each, _assert_internal_job_invalid) _assert_test_cases_validate = partial(_for_each, _assert_test_case_validates) _assert_test_cases_invalid = partial(_for_each, _assert_test_case_invalid) +_assert_workflow_steps_validate = partial(_for_each, _assert_workflow_step_validates) +_assert_workflow_steps_invalid = partial(_for_each, _assert_workflow_step_invalid) +_assert_workflow_steps_linked_validate = partial(_for_each, _assert_workflow_step_linked_validates) +_assert_workflow_steps_linked_invalid = partial(_for_each, _assert_workflow_step_linked_invalid) def decode_val(val: str) -> int: diff --git a/test/unit/tool_util/test_parameter_test_cases.py b/test/unit/tool_util/test_parameter_test_cases.py new file mode 100644 index 000000000000..aa5db0319259 --- /dev/null +++ b/test/unit/tool_util/test_parameter_test_cases.py @@ -0,0 +1,136 @@ +import os +import re +import sys +from typing import List + +import pytest + +from galaxy.tool_util.models import parse_tool +from galaxy.tool_util.parameters.case import ( + test_case_state as case_state, + TestCaseStateValidationResult, + validate_test_cases_for_tool_source, +) +from galaxy.tool_util.parser.factory import get_tool_source +from galaxy.tool_util.parser.interface import ToolSourceTest +from galaxy.tool_util.unittest_utils import functional_test_tool_directory +from galaxy.tool_util.verify.parse import parse_tool_test_descriptions + +# legacy tools allows specifying parameter and repeat parameters without +# qualification. This was problematic and could result in ambigious specifications. +TOOLS_THAT_USE_UNQUALIFIED_PARAMETER_ACCESS = [ + "boolean_conditional.xml", + "simple_constructs.xml", + "section.xml", + "collection_paired_conditional_structured_like.xml", + "output_action_change_format.xml", + "top_level_data.xml", + "disambiguate_cond.xml", + "multi_repeats.xml", + "implicit_default_conds.xml", + "min_repeat.xml", +] + +# tools that use truevalue/falsevalue in parameter setting, I think we're going to +# forbid this for a future tool profile version. Potential ambigouity could result. +TOOLS_THAT_USE_TRUE_FALSE_VALUE_BOOLEAN_SPECIFICATION = [ + "inputs_as_json_profile.xml", + "inputs_as_json_with_paths.xml", + "inputs_as_json.xml", +] + +TOOLS_THAT_USE_SELECT_BY_VALUE = [ + "multi_select.xml", +] + + +TEST_TOOL_THAT_DO_NOT_VALIDATE = ( + TOOLS_THAT_USE_UNQUALIFIED_PARAMETER_ACCESS + + TOOLS_THAT_USE_TRUE_FALSE_VALUE_BOOLEAN_SPECIFICATION + + TOOLS_THAT_USE_SELECT_BY_VALUE + + [ + # will never handle upload_dataset + "upload.xml", + ] +) + + +if sys.version_info < (3, 8): # noqa: UP036 + pytest.skip(reason="Pydantic tool parameter models require python3.8 or higher", allow_module_level=True) + + +def test_parameter_test_cases_validate(): + validation_result = validate_test_cases_for("column_param") + assert len(validation_result[0].warnings) == 0 + assert len(validation_result[1].warnings) == 0 + assert len(validation_result[2].warnings) == 1 + + validation_result = validate_test_cases_for("column_param", use_latest_profile=True) + assert validation_result[2].validation_error + + +def test_legacy_features_fail_validation_with_24_2(tmp_path): + for filename in TOOLS_THAT_USE_UNQUALIFIED_PARAMETER_ACCESS + TOOLS_THAT_USE_TRUE_FALSE_VALUE_BOOLEAN_SPECIFICATION: + _assert_tool_test_parsing_only_fails_with_newer_profile(tmp_path, filename) + + # column parameters need to be indexes + _assert_tool_test_parsing_only_fails_with_newer_profile(tmp_path, "column_param.xml", index=2) + + # selection by value only + _assert_tool_test_parsing_only_fails_with_newer_profile(tmp_path, "multi_select.xml", index=1) + + +def _assert_tool_test_parsing_only_fails_with_newer_profile(tmp_path, filename: str, index: int = 0): + test_tool_directory = functional_test_tool_directory() + original_path = os.path.join(test_tool_directory, filename) + new_path = tmp_path / filename + with open(original_path) as rf: + tool_contents = rf.read() + tool_contents = re.sub(r'profile="[\d\.]*"', r"", tool_contents) + new_profile_contents = tool_contents.replace(" List[TestCaseStateValidationResult]: + test_tool_directory = functional_test_tool_directory() + tool_path = os.path.join(test_tool_directory, f"{tool_name}.xml") + tool_source = get_tool_source(tool_path) + return validate_test_cases_for_tool_source(tool_source, **kwd) diff --git a/test/unit/tool_util/test_test_definition_parsing.py b/test/unit/tool_util/test_test_definition_parsing.py index 39d9e9041b29..f7c2c3bd28b9 100644 --- a/test/unit/tool_util/test_test_definition_parsing.py +++ b/test/unit/tool_util/test_test_definition_parsing.py @@ -97,6 +97,12 @@ def test_collection_type_source_parsing(self): test_dicts = self._parse_tests() self._verify_each(test_dicts[0].to_dict(), COLLECTION_TYPE_SOURCE_EXPECTATIONS) + def test_unqualified_access_disabled_in_24_2(self): + self._init_tool_for_path(functional_test_tool_path("deprecated/simple_constructs_24_2.xml")) + test_dicts = self._parse_tests() + test_0 = test_dicts[0].to_dict() + assert test_0["error"] is True + def test_bigwigtowig_converter(self): # defines if in_packages():