diff --git a/cmake/checkissuereferencerules.cmake b/cmake/checkissuereferencerules.cmake new file mode 100644 index 000000000..530d3d183 --- /dev/null +++ b/cmake/checkissuereferencerules.cmake @@ -0,0 +1,77 @@ +# Copyright libCellML Contributors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Check that ruleToInformation (in issue.cpp) has one entry for each +# Issue::ReferenceRule value (in issue.h), in declaration order, and that the +# name of each entry matches its rule. +# Usage: cmake -P checkissuereferencerules.cmake + +set(_ISSUE_HEADER_FILE ${CMAKE_ARGV3}) +set(_ISSUE_SOURCE_FILE ${CMAKE_ARGV4}) + +# Retrieve the Issue::ReferenceRule values. + +file(READ ${_ISSUE_HEADER_FILE} _CONTENT) +string(REGEX MATCH "enum class ReferenceRule[^{]*{([^}]*)}" _MATCH "${_CONTENT}") + +if(NOT _MATCH) + message(FATAL_ERROR "Could not find the Issue::ReferenceRule enum in '${_ISSUE_HEADER_FILE}'.") +endif() + +string(REGEX REPLACE "//[^\n]*" "" _ENUM_BODY "${CMAKE_MATCH_1}") +string(REGEX MATCHALL "[A-Z0-9_]+" _RULES "${_ENUM_BODY}") + +# Retrieve the ruleToInformation entries. + +file(READ ${_ISSUE_SOURCE_FILE} _CONTENT) +string(REGEX MATCH "ruleToInformation\\[\\] = {(.*)\n};" _MATCH "${_CONTENT}") + +if(NOT _MATCH) + message(FATAL_ERROR "Could not find the ruleToInformation table in '${_ISSUE_SOURCE_FILE}'.") +endif() + +string(REGEX MATCHALL "{Issue::ReferenceRule::[A-Z0-9_]+, \"[A-Z0-9_]*\"" _ENTRIES "${CMAKE_MATCH_1}") + +# Compare the two. + +list(LENGTH _RULES _RULES_COUNT) +list(LENGTH _ENTRIES _ENTRIES_COUNT) + +if(NOT _RULES_COUNT EQUAL _ENTRIES_COUNT) + message(FATAL_ERROR "Issue::ReferenceRule has ${_RULES_COUNT} values, but ruleToInformation has ${_ENTRIES_COUNT} entries.") +endif() + +math(EXPR _LAST_INDEX "${_RULES_COUNT} - 1") + +foreach(_INDEX RANGE ${_LAST_INDEX}) + list(GET _RULES ${_INDEX} _RULE) + list(GET _ENTRIES ${_INDEX} _ENTRY) + string(REGEX MATCH "{Issue::ReferenceRule::([A-Z0-9_]+), \"([A-Z0-9_]*)\"" _ENTRY_MATCH "${_ENTRY}") + set(_ENTRY_RULE "${CMAKE_MATCH_1}") + set(_ENTRY_NAME "${CMAKE_MATCH_2}") + + if(NOT _ENTRY_RULE STREQUAL _RULE) + message(FATAL_ERROR "ruleToInformation entry #${_INDEX} is for '${_ENTRY_RULE}', but Issue::ReferenceRule value #${_INDEX} is '${_RULE}'.") + endif() + + if(_RULE STREQUAL "UNDEFINED" OR _RULE STREQUAL "UNSPECIFIED") + set(_EXPECTED_NAME "") + else() + set(_EXPECTED_NAME ${_RULE}) + endif() + + if(NOT _ENTRY_NAME STREQUAL _EXPECTED_NAME) + message(FATAL_ERROR "ruleToInformation entry for '${_RULE}' has name '${_ENTRY_NAME}', but '${_EXPECTED_NAME}' was expected.") + endif() +endforeach() diff --git a/src/internaltypes.h b/src/internaltypes.h index 77d278877..4562baa05 100644 --- a/src/internaltypes.h +++ b/src/internaltypes.h @@ -27,7 +27,7 @@ limitations under the License. namespace libcellml { -const std::string ORIGIN_MODEL_REF = ":this:"; +inline const std::string ORIGIN_MODEL_REF = ":this:"; using ComponentNameMap = std::map; /**< Type definition for map of component name to component pointer. */ diff --git a/src/issue.cpp b/src/issue.cpp index da64bd978..eb458e67b 100644 --- a/src/issue.cpp +++ b/src/issue.cpp @@ -16,6 +16,8 @@ limitations under the License. #include "libcellml/issue.h" +#include + #include "issue_p.h" #include "utilities.h" @@ -76,169 +78,200 @@ AnyCellmlElementPtr Issue::item() const * * An internal map used to convert a Issue::ReferenceRule into its heading string. */ -static const std::map> ruleToInformation = { - {Issue::ReferenceRule::UNDEFINED, {"", "", "", ""}}, +struct RuleInformation +{ + Issue::ReferenceRule rule; + const char *name; + const char *heading; + const char *baseUrl; + const char *page; +}; + +static constexpr RuleInformation ruleToInformation[] = { + {Issue::ReferenceRule::UNDEFINED, "", "", "", ""}, // Validation errors related to the CellML Specification: - {Issue::ReferenceRule::XML, {"XML", "1.2.1.1", baseSpecificationUrl, "specA02"}}, - {Issue::ReferenceRule::XML_UNEXPECTED_ELEMENT, {"XML_UNEXPECTED_ELEMENT", "1.2.2.2", baseSpecificationUrl, "specA02"}}, - {Issue::ReferenceRule::XML_UNEXPECTED_CHARACTER, {"XML_UNEXPECTED_CHARACTER", "1.2.3.2", baseSpecificationUrl, "specA02"}}, - {Issue::ReferenceRule::XML_UNEXPECTED_NAMESPACE, {"XML_UNEXPECTED_NAMESPACE", "1.2.4.1", baseSpecificationUrl, "specA02"}}, - {Issue::ReferenceRule::XML_ATTRIBUTE_HAS_NAMESPACE, {"XML_ATTRIBUTE_HAS_NAMESPACE", "1.2.4.2", baseSpecificationUrl, "specA02"}}, - {Issue::ReferenceRule::XML_ID_ATTRIBUTE, {"XML_ID_ATTRIBUTE", "1.2.5.1.1", baseSpecificationUrl, "specA02"}}, - {Issue::ReferenceRule::MODEL_ELEMENT, {"MODEL_ELEMENT", "2.1", baseSpecificationUrl, "specB01"}}, - {Issue::ReferenceRule::MODEL_NAME, {"MODEL_NAME", "2.1.1", baseSpecificationUrl, "specB01"}}, - {Issue::ReferenceRule::MODEL_NAME_VALUE, {"MODEL_NAME_VALUE", "2.1.1.1", baseSpecificationUrl, "specB01"}}, - {Issue::ReferenceRule::MODEL_CHILD, {"MODEL_CHILD", "2.1.2", baseSpecificationUrl, "specB01"}}, - {Issue::ReferenceRule::MODEL_MORE_THAN_ONE_ENCAPSULATION, {"MODEL_MORE_THAN_ONE_ENCAPSULATION", "2.1.3", baseSpecificationUrl, "specB01"}}, - {Issue::ReferenceRule::IMPORT_ELEMENT, {"IMPORT_ELEMENT", "2.2", baseSpecificationUrl, "specB02"}}, - {Issue::ReferenceRule::IMPORT_HREF, {"IMPORT_HREF", "2.2.1", baseSpecificationUrl, "specB02"}}, - {Issue::ReferenceRule::IMPORT_HREF_LOCATOR, {"IMPORT_HREF_LOCATOR", "2.2.1.1", baseSpecificationUrl, "specB02"}}, - {Issue::ReferenceRule::IMPORT_CHILD, {"IMPORT_CHILD", "2.2.2", baseSpecificationUrl, "specB02"}}, - {Issue::ReferenceRule::IMPORT_EQUIVALENT_INFOSET, {"IMPORT_EQUIVALENT_INFOSET", "2.2.3", baseSpecificationUrl, "specB02"}}, - {Issue::ReferenceRule::IMPORT_UNITS_ELEMENT, {"IMPORT_UNITS_ELEMENT", "2.3", baseSpecificationUrl, "specB03"}}, - {Issue::ReferenceRule::IMPORT_UNITS_NAME, {"IMPORT_UNITS_NAME", "2.3.1", baseSpecificationUrl, "specB03"}}, - {Issue::ReferenceRule::IMPORT_UNITS_NAME_VALUE, {"IMPORT_UNITS_NAME_VALUE", "2.3.1.1", baseSpecificationUrl, "specB03"}}, - {Issue::ReferenceRule::IMPORT_UNITS_NAME_UNIQUE, {"IMPORT_UNITS_NAME_UNIQUE", "2.3.1.2", baseSpecificationUrl, "specB03"}}, - {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE, {"IMPORT_UNITS_UNITS_REFERENCE", "2.3.2", baseSpecificationUrl, "specB03"}}, - {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE_VALUE, {"IMPORT_UNITS_UNITS_REFERENCE_VALUE", "2.3.2.1", baseSpecificationUrl, "specB03"}}, - {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE_VALUE_TARGET, {"IMPORT_UNITS_UNITS_REFERENCE_VALUE_TARGET", "2.3.2.2", baseSpecificationUrl, "specB03"}}, - {Issue::ReferenceRule::IMPORT_COMPONENT_ELEMENT, {"IMPORT_COMPONENT_ELEMENT", "2.4", baseSpecificationUrl, "specB04"}}, - {Issue::ReferenceRule::IMPORT_COMPONENT_NAME, {"IMPORT_COMPONENT_NAME", "2.4.1", baseSpecificationUrl, "specB04"}}, - {Issue::ReferenceRule::IMPORT_COMPONENT_NAME_VALUE, {"IMPORT_COMPONENT_NAME_VALUE", "2.4.1.1", baseSpecificationUrl, "specB04"}}, - {Issue::ReferenceRule::IMPORT_COMPONENT_NAME_UNIQUE, {"IMPORT_COMPONENT_NAME_UNIQUE", "2.4.1.2", baseSpecificationUrl, "specB04"}}, - {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE, {"IMPORT_COMPONENT_COMPONENT_REFERENCE", "2.4.2", baseSpecificationUrl, "specB04"}}, - {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE_VALUE, {"IMPORT_COMPONENT_COMPONENT_REFERENCE_VALUE", "2.4.2.1", baseSpecificationUrl, "specB04"}}, - {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE_TARGET, {"IMPORT_COMPONENT_COMPONENT_REFERENCE_TARGET", "2.4.2.2", baseSpecificationUrl, "specB04"}}, - {Issue::ReferenceRule::UNITS_ELEMENT, {"UNITS_ELEMENT", "2.5", baseSpecificationUrl, "specB05"}}, - {Issue::ReferenceRule::UNITS_NAME, {"UNITS_NAME", "2.5.1", baseSpecificationUrl, "specB05"}}, - {Issue::ReferenceRule::UNITS_NAME_VALUE, {"UNITS_NAME_VALUE", "2.5.1.1", baseSpecificationUrl, "specB05"}}, - {Issue::ReferenceRule::UNITS_NAME_UNIQUE, {"UNITS_NAME_UNIQUE", "2.5.1.2", baseSpecificationUrl, "specB05"}}, - {Issue::ReferenceRule::UNITS_STANDARD, {"UNITS_STANDARD", "2.5.2", baseSpecificationUrl, "specB05"}}, - {Issue::ReferenceRule::UNITS_CHILD, {"UNITS_CHILD", "2.5.3", baseSpecificationUrl, "specB05"}}, - {Issue::ReferenceRule::UNIT_ELEMENT, {"UNIT_ELEMENT", "2.6", baseSpecificationUrl, "specB06"}}, - {Issue::ReferenceRule::UNIT_UNITS, {"UNIT_UNITS", "2.6.1", baseSpecificationUrl, "specB06"}}, - {Issue::ReferenceRule::UNIT_UNITS_REFERENCE, {"UNIT_UNITS_REFERENCE", "2.6.1.1", baseSpecificationUrl, "specB06"}}, - {Issue::ReferenceRule::UNIT_UNITS_CIRCULAR_REFERENCE, {"UNIT_UNITS_CIRCULAR_REFERENCE", "2.6.1.3", baseSpecificationUrl, "specB06"}}, - {Issue::ReferenceRule::UNIT_ATTRIBUTE_OPTIONAL, {"UNIT_ATTRIBUTE_OPTIONAL", "2.6.2", baseSpecificationUrl, "specB06"}}, - {Issue::ReferenceRule::UNIT_ATTRIBUTE_PREFIX_VALUE, {"UNIT_ATTRIBUTE_PREFIX_VALUE", "2.6.2.1.1", baseSpecificationUrl, "specB06"}}, - {Issue::ReferenceRule::UNIT_ATTRIBUTE_MULTIPLIER_VALUE, {"UNIT_ATTRIBUTE_MULTIPLIER_VALUE", "2.6.2.2.1", baseSpecificationUrl, "specB06"}}, - {Issue::ReferenceRule::UNIT_ATTRIBUTE_EXPONENT_VALUE, {"UNIT_ATTRIBUTE_EXPONENT_VALUE", "2.6.2.3.1", baseSpecificationUrl, "specB06"}}, - {Issue::ReferenceRule::COMPONENT_ELEMENT, {"COMPONENT_ELEMENT", "2.7", baseSpecificationUrl, "specB07"}}, - {Issue::ReferenceRule::COMPONENT_NAME, {"COMPONENT_NAME", "2.7.1", baseSpecificationUrl, "specB07"}}, - {Issue::ReferenceRule::COMPONENT_NAME_VALUE, {"COMPONENT_NAME_VALUE", "2.7.1.1", baseSpecificationUrl, "specB07"}}, - {Issue::ReferenceRule::COMPONENT_NAME_UNIQUE, {"COMPONENT_NAME_UNIQUE", "2.7.1.2", baseSpecificationUrl, "specB07"}}, - {Issue::ReferenceRule::COMPONENT_CHILD, {"COMPONENT_CHILD", "2.7.2", baseSpecificationUrl, "specB07"}}, - {Issue::ReferenceRule::VARIABLE_ELEMENT, {"VARIABLE_ELEMENT", "2.8", baseSpecificationUrl, "specB08"}}, - {Issue::ReferenceRule::VARIABLE_ATTRIBUTE_REQUIRED, {"VARIABLE_ATTRIBUTE_REQUIRED", "2.8.1", baseSpecificationUrl, "specB08"}}, - {Issue::ReferenceRule::VARIABLE_NAME_VALUE, {"VARIABLE_NAME_VALUE", "2.8.1.1.1", baseSpecificationUrl, "specB08"}}, - {Issue::ReferenceRule::VARIABLE_NAME_UNIQUE, {"VARIABLE_NAME_UNIQUE", "2.8.1.1.2", baseSpecificationUrl, "specB08"}}, - {Issue::ReferenceRule::VARIABLE_UNITS_VALUE, {"VARIABLE_UNITS_VALUE", "2.8.1.2.1", baseSpecificationUrl, "specB08"}}, - {Issue::ReferenceRule::VARIABLE_ATTRIBUTE_OPTIONAL, {"VARIABLE_ATTRIBUTE_OPTIONAL", "2.8.2", baseSpecificationUrl, "specB08"}}, - {Issue::ReferenceRule::VARIABLE_INTERFACE_VALUE, {"VARIABLE_INTERFACE_VALUE", "2.8.2.1.1", baseSpecificationUrl, "specB08"}}, - {Issue::ReferenceRule::VARIABLE_INITIAL_VALUE_VALUE, {"VARIABLE_INITIAL_VALUE_VALUE", "2.8.2.2.1", baseSpecificationUrl, "specB08"}}, - {Issue::ReferenceRule::RESET_ELEMENT, {"RESET_ELEMENT", "2.9", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::RESET_ATTRIBUTE_REQUIRED, {"RESET_ATTRIBUTE_REQUIRED", "2.9.1", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::RESET_VARIABLE_REFERENCE, {"RESET_VARIABLE_REFERENCE", "2.9.1.1.1", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::RESET_TEST_VARIABLE_REFERENCE, {"RESET_TEST_VARIABLE_REFERENCE", "2.9.1.2.1", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::RESET_ORDER_VALUE, {"RESET_ORDER_VALUE", "2.9.1.3.1", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::RESET_ORDER_UNIQUE, {"RESET_ORDER_UNIQUE", "2.9.1.3.2", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::RESET_CHILD, {"RESET_CHILD", "2.9.2", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::RESET_RESET_VALUE_CHILD, {"RESET_RESET_VALUE_CHILD", "2.9.2.1", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::RESET_TEST_VALUE_CHILD, {"RESET_TEST_VALUE_CHILD", "2.9.2.2", baseSpecificationUrl, "specB09"}}, - {Issue::ReferenceRule::TEST_VALUE_ELEMENT, {"TEST_VALUE_ELEMENT", "2.10", baseSpecificationUrl, "specB10"}}, - {Issue::ReferenceRule::TEST_VALUE_CHILD, {"TEST_VALUE_CHILD", "2.10.1", baseSpecificationUrl, "specB10"}}, - {Issue::ReferenceRule::RESET_VALUE_ELEMENT, {"RESET_VALUE_ELEMENT", "2.11", baseSpecificationUrl, "specB11"}}, - {Issue::ReferenceRule::RESET_VALUE_CHILD, {"RESET_VALUE_CHILD", "2.11.1", baseSpecificationUrl, "specB11"}}, - {Issue::ReferenceRule::MATH_ELEMENT, {"MATH_ELEMENT", "2.12", baseSpecificationUrl, "specB12"}}, - {Issue::ReferenceRule::MATH_MATHML, {"MATH_MATHML", "2.12.1", baseSpecificationUrl, "specB12"}}, - {Issue::ReferenceRule::MATH_CHILD, {"MATH_CHILD", "2.12.2", baseSpecificationUrl, "specB12"}}, - {Issue::ReferenceRule::MATH_CI_VARIABLE_REFERENCE, {"MATH_CI_VARIABLE_REFERENCE", "2.12.3", baseSpecificationUrl, "specB12"}}, - {Issue::ReferenceRule::MATH_CN_UNITS_ATTRIBUTE, {"MATH_CN_UNITS_ATTRIBUTE", "2.12.4", baseSpecificationUrl, "specB12"}}, - {Issue::ReferenceRule::MATH_CN_UNITS_ATTRIBUTE_REFERENCE, {"MATH_CN_UNITS_ATTRIBUTE_REFERENCE", "2.12.4.1", baseSpecificationUrl, "specB12"}}, - {Issue::ReferenceRule::MATH_CN_BASE10, {"MATH_CN_BASE10", "2.12.5", baseSpecificationUrl, "specB12"}}, - {Issue::ReferenceRule::MATH_CN_FORMAT, {"MATH_CN_FORMAT", "2.12.5.1", baseSpecificationUrl, "specB12"}}, - {Issue::ReferenceRule::ENCAPSULATION_ELEMENT, {"ENCAPSULATION_ELEMENT", "2.13", baseSpecificationUrl, "specB13"}}, - {Issue::ReferenceRule::ENCAPSULATION_CHILD, {"ENCAPSULATION_CHILD", "2.13.1", baseSpecificationUrl, "specB13"}}, - {Issue::ReferenceRule::COMPONENT_REF_ELEMENT, {"COMPONENT_REF_ELEMENT", "2.14", baseSpecificationUrl, "specB14"}}, - {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE, {"COMPONENT_REF_COMPONENT_ATTRIBUTE", "2.14.1", baseSpecificationUrl, "specB14"}}, - {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE_REFERENCE, {"COMPONENT_REF_COMPONENT_ATTRIBUTE_REFERENCE", "2.14.1.1", baseSpecificationUrl, "specB14"}}, - {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE_UNIQUE, {"COMPONENT_REF_COMPONENT_ATTRIBUTE_UNIQUE", "2.14.1.2", baseSpecificationUrl, "specB14"}}, - {Issue::ReferenceRule::COMPONENT_REF_CHILD, {"COMPONENT_REF_CHILD", "2.14.2", baseSpecificationUrl, "specB14"}}, - {Issue::ReferenceRule::CONNECTION_ELEMENT, {"CONNECTION_ELEMENT", "2.15", baseSpecificationUrl, "specB14"}}, - {Issue::ReferenceRule::CONNECTION_COMPONENT1_ATTRIBUTE, {"CONNECTION_COMPONENT1_ATTRIBUTE", "2.15.1", baseSpecificationUrl, "specB15"}}, - {Issue::ReferenceRule::CONNECTION_COMPONENT1_ATTRIBUTE_REFERENCE, {"CONNECTION_COMPONENT1_ATTRIBUTE_REFERENCE", "2.15.1.1", baseSpecificationUrl, "specB15"}}, - {Issue::ReferenceRule::CONNECTION_COMPONENT2_ATTRIBUTE, {"CONNECTION_COMPONENT2_ATTRIBUTE", "2.15.2", baseSpecificationUrl, "specB15"}}, - {Issue::ReferenceRule::CONNECTION_COMPONENT2_ATTRIBUTE_REFERENCE, {"CONNECTION_COMPONENT2_ATTRIBUTE_REFERENCE", "2.15.2.1", baseSpecificationUrl, "specB15"}}, - {Issue::ReferenceRule::CONNECTION_EXCLUDE_SELF, {"CONNECTION_EXCLUDE_SELF", "2.15.3", baseSpecificationUrl, "specB15"}}, - {Issue::ReferenceRule::CONNECTION_UNIQUE, {"CONNECTION_UNIQUE", "2.15.4", baseSpecificationUrl, "specB15"}}, - {Issue::ReferenceRule::CONNECTION_CHILD, {"CONNECTION_CHILD", "2.15.5", baseSpecificationUrl, "specB15"}}, - {Issue::ReferenceRule::MAP_VARIABLES_ELEMENT, {"MAP_VARIABLES_ELEMENT", "2.16", baseSpecificationUrl, "specB16"}}, - {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE1_ATTRIBUTE, {"MAP_VARIABLES_VARIABLE1_ATTRIBUTE", "2.16.1", baseSpecificationUrl, "specB16"}}, - {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE1_ATTRIBUTE_REFERENCE, {"MAP_VARIABLES_VARIABLE1_ATTRIBUTE_REFERENCE", "2.16.1.1", baseSpecificationUrl, "specB16"}}, - {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE2_ATTRIBUTE, {"MAP_VARIABLES_VARIABLE2", "2.16.2", baseSpecificationUrl, "specB16"}}, - {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE2_ATTRIBUTE_REFERENCE, {"MAP_VARIABLES_VARIABLE2_ATTRIBUTE_REFERENCE", "2.16.2.1", baseSpecificationUrl, "specB16"}}, - {Issue::ReferenceRule::MAP_VARIABLES_UNIQUE, {"MAP_VARIABLES_UNIQUE", "2.16.3", baseSpecificationUrl, "specB16"}}, + {Issue::ReferenceRule::XML, "XML", "1.2.1.1", baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::XML_UNEXPECTED_ELEMENT, "XML_UNEXPECTED_ELEMENT", "1.2.2.2", baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::XML_UNEXPECTED_CHARACTER, "XML_UNEXPECTED_CHARACTER", "1.2.3.2", baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::XML_UNEXPECTED_NAMESPACE, "XML_UNEXPECTED_NAMESPACE", "1.2.4.1", baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::XML_ATTRIBUTE_HAS_NAMESPACE, "XML_ATTRIBUTE_HAS_NAMESPACE", "1.2.4.2", baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::XML_ID_ATTRIBUTE, "XML_ID_ATTRIBUTE", "1.2.5.1.1", baseSpecificationUrl, "specA02"}, + {Issue::ReferenceRule::MODEL_ELEMENT, "MODEL_ELEMENT", "2.1", baseSpecificationUrl, "specB01"}, + {Issue::ReferenceRule::MODEL_NAME, "MODEL_NAME", "2.1.1", baseSpecificationUrl, "specB01"}, + {Issue::ReferenceRule::MODEL_NAME_VALUE, "MODEL_NAME_VALUE", "2.1.1.1", baseSpecificationUrl, "specB01"}, + {Issue::ReferenceRule::MODEL_CHILD, "MODEL_CHILD", "2.1.2", baseSpecificationUrl, "specB01"}, + {Issue::ReferenceRule::MODEL_MORE_THAN_ONE_ENCAPSULATION, "MODEL_MORE_THAN_ONE_ENCAPSULATION", "2.1.3", baseSpecificationUrl, "specB01"}, + {Issue::ReferenceRule::IMPORT_ELEMENT, "IMPORT_ELEMENT", "2.2", baseSpecificationUrl, "specB02"}, + {Issue::ReferenceRule::IMPORT_HREF, "IMPORT_HREF", "2.2.1", baseSpecificationUrl, "specB02"}, + {Issue::ReferenceRule::IMPORT_HREF_LOCATOR, "IMPORT_HREF_LOCATOR", "2.2.1.1", baseSpecificationUrl, "specB02"}, + {Issue::ReferenceRule::IMPORT_CHILD, "IMPORT_CHILD", "2.2.2", baseSpecificationUrl, "specB02"}, + {Issue::ReferenceRule::IMPORT_EQUIVALENT_INFOSET, "IMPORT_EQUIVALENT_INFOSET", "2.2.3", baseSpecificationUrl, "specB02"}, + {Issue::ReferenceRule::IMPORT_UNITS_ELEMENT, "IMPORT_UNITS_ELEMENT", "2.3", baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_NAME, "IMPORT_UNITS_NAME", "2.3.1", baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_NAME_VALUE, "IMPORT_UNITS_NAME_VALUE", "2.3.1.1", baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_NAME_UNIQUE, "IMPORT_UNITS_NAME_UNIQUE", "2.3.1.2", baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE, "IMPORT_UNITS_UNITS_REFERENCE", "2.3.2", baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE_VALUE, "IMPORT_UNITS_UNITS_REFERENCE_VALUE", "2.3.2.1", baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_UNITS_UNITS_REFERENCE_VALUE_TARGET, "IMPORT_UNITS_UNITS_REFERENCE_VALUE_TARGET", "2.3.2.2", baseSpecificationUrl, "specB03"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_ELEMENT, "IMPORT_COMPONENT_ELEMENT", "2.4", baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_NAME, "IMPORT_COMPONENT_NAME", "2.4.1", baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_NAME_VALUE, "IMPORT_COMPONENT_NAME_VALUE", "2.4.1.1", baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_NAME_UNIQUE, "IMPORT_COMPONENT_NAME_UNIQUE", "2.4.1.2", baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE, "IMPORT_COMPONENT_COMPONENT_REFERENCE", "2.4.2", baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE_VALUE, "IMPORT_COMPONENT_COMPONENT_REFERENCE_VALUE", "2.4.2.1", baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::IMPORT_COMPONENT_COMPONENT_REFERENCE_TARGET, "IMPORT_COMPONENT_COMPONENT_REFERENCE_TARGET", "2.4.2.2", baseSpecificationUrl, "specB04"}, + {Issue::ReferenceRule::UNITS_ELEMENT, "UNITS_ELEMENT", "2.5", baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNITS_NAME, "UNITS_NAME", "2.5.1", baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNITS_NAME_VALUE, "UNITS_NAME_VALUE", "2.5.1.1", baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNITS_NAME_UNIQUE, "UNITS_NAME_UNIQUE", "2.5.1.2", baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNITS_STANDARD, "UNITS_STANDARD", "2.5.2", baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNITS_CHILD, "UNITS_CHILD", "2.5.3", baseSpecificationUrl, "specB05"}, + {Issue::ReferenceRule::UNIT_ELEMENT, "UNIT_ELEMENT", "2.6", baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_UNITS, "UNIT_UNITS", "2.6.1", baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_UNITS_REFERENCE, "UNIT_UNITS_REFERENCE", "2.6.1.1", baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_UNITS_CIRCULAR_REFERENCE, "UNIT_UNITS_CIRCULAR_REFERENCE", "2.6.1.3", baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_ATTRIBUTE_OPTIONAL, "UNIT_ATTRIBUTE_OPTIONAL", "2.6.2", baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_ATTRIBUTE_PREFIX_VALUE, "UNIT_ATTRIBUTE_PREFIX_VALUE", "2.6.2.1.1", baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_ATTRIBUTE_MULTIPLIER_VALUE, "UNIT_ATTRIBUTE_MULTIPLIER_VALUE", "2.6.2.2.1", baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::UNIT_ATTRIBUTE_EXPONENT_VALUE, "UNIT_ATTRIBUTE_EXPONENT_VALUE", "2.6.2.3.1", baseSpecificationUrl, "specB06"}, + {Issue::ReferenceRule::COMPONENT_ELEMENT, "COMPONENT_ELEMENT", "2.7", baseSpecificationUrl, "specB07"}, + {Issue::ReferenceRule::COMPONENT_NAME, "COMPONENT_NAME", "2.7.1", baseSpecificationUrl, "specB07"}, + {Issue::ReferenceRule::COMPONENT_NAME_VALUE, "COMPONENT_NAME_VALUE", "2.7.1.1", baseSpecificationUrl, "specB07"}, + {Issue::ReferenceRule::COMPONENT_NAME_UNIQUE, "COMPONENT_NAME_UNIQUE", "2.7.1.2", baseSpecificationUrl, "specB07"}, + {Issue::ReferenceRule::COMPONENT_CHILD, "COMPONENT_CHILD", "2.7.2", baseSpecificationUrl, "specB07"}, + {Issue::ReferenceRule::VARIABLE_ELEMENT, "VARIABLE_ELEMENT", "2.8", baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_ATTRIBUTE_REQUIRED, "VARIABLE_ATTRIBUTE_REQUIRED", "2.8.1", baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_NAME_VALUE, "VARIABLE_NAME_VALUE", "2.8.1.1.1", baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_NAME_UNIQUE, "VARIABLE_NAME_UNIQUE", "2.8.1.1.2", baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_UNITS_VALUE, "VARIABLE_UNITS_VALUE", "2.8.1.2.1", baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_ATTRIBUTE_OPTIONAL, "VARIABLE_ATTRIBUTE_OPTIONAL", "2.8.2", baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_INTERFACE_VALUE, "VARIABLE_INTERFACE_VALUE", "2.8.2.1.1", baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::VARIABLE_INITIAL_VALUE_VALUE, "VARIABLE_INITIAL_VALUE_VALUE", "2.8.2.2.1", baseSpecificationUrl, "specB08"}, + {Issue::ReferenceRule::RESET_ELEMENT, "RESET_ELEMENT", "2.9", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_ATTRIBUTE_REQUIRED, "RESET_ATTRIBUTE_REQUIRED", "2.9.1", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_VARIABLE_REFERENCE, "RESET_VARIABLE_REFERENCE", "2.9.1.1.1", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_TEST_VARIABLE_REFERENCE, "RESET_TEST_VARIABLE_REFERENCE", "2.9.1.2.1", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_ORDER_VALUE, "RESET_ORDER_VALUE", "2.9.1.3.1", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_ORDER_UNIQUE, "RESET_ORDER_UNIQUE", "2.9.1.3.2", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_CHILD, "RESET_CHILD", "2.9.2", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_RESET_VALUE_CHILD, "RESET_RESET_VALUE_CHILD", "2.9.2.1", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::RESET_TEST_VALUE_CHILD, "RESET_TEST_VALUE_CHILD", "2.9.2.2", baseSpecificationUrl, "specB09"}, + {Issue::ReferenceRule::TEST_VALUE_ELEMENT, "TEST_VALUE_ELEMENT", "2.10", baseSpecificationUrl, "specB10"}, + {Issue::ReferenceRule::TEST_VALUE_CHILD, "TEST_VALUE_CHILD", "2.10.1", baseSpecificationUrl, "specB10"}, + {Issue::ReferenceRule::RESET_VALUE_ELEMENT, "RESET_VALUE_ELEMENT", "2.11", baseSpecificationUrl, "specB11"}, + {Issue::ReferenceRule::RESET_VALUE_CHILD, "RESET_VALUE_CHILD", "2.11.1", baseSpecificationUrl, "specB11"}, + {Issue::ReferenceRule::MATH_ELEMENT, "MATH_ELEMENT", "2.12", baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_MATHML, "MATH_MATHML", "2.12.1", baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CHILD, "MATH_CHILD", "2.12.2", baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CI_VARIABLE_REFERENCE, "MATH_CI_VARIABLE_REFERENCE", "2.12.3", baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CN_UNITS_ATTRIBUTE, "MATH_CN_UNITS_ATTRIBUTE", "2.12.4", baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CN_UNITS_ATTRIBUTE_REFERENCE, "MATH_CN_UNITS_ATTRIBUTE_REFERENCE", "2.12.4.1", baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CN_BASE10, "MATH_CN_BASE10", "2.12.5", baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::MATH_CN_FORMAT, "MATH_CN_FORMAT", "2.12.5.1", baseSpecificationUrl, "specB12"}, + {Issue::ReferenceRule::ENCAPSULATION_ELEMENT, "ENCAPSULATION_ELEMENT", "2.13", baseSpecificationUrl, "specB13"}, + {Issue::ReferenceRule::ENCAPSULATION_CHILD, "ENCAPSULATION_CHILD", "2.13.1", baseSpecificationUrl, "specB13"}, + {Issue::ReferenceRule::COMPONENT_REF_ELEMENT, "COMPONENT_REF_ELEMENT", "2.14", baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE, "COMPONENT_REF_COMPONENT_ATTRIBUTE", "2.14.1", baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE_REFERENCE, "COMPONENT_REF_COMPONENT_ATTRIBUTE_REFERENCE", "2.14.1.1", baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::COMPONENT_REF_COMPONENT_ATTRIBUTE_UNIQUE, "COMPONENT_REF_COMPONENT_ATTRIBUTE_UNIQUE", "2.14.1.2", baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::COMPONENT_REF_CHILD, "COMPONENT_REF_CHILD", "2.14.2", baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::CONNECTION_ELEMENT, "CONNECTION_ELEMENT", "2.15", baseSpecificationUrl, "specB14"}, + {Issue::ReferenceRule::CONNECTION_COMPONENT1_ATTRIBUTE, "CONNECTION_COMPONENT1_ATTRIBUTE", "2.15.1", baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_COMPONENT1_ATTRIBUTE_REFERENCE, "CONNECTION_COMPONENT1_ATTRIBUTE_REFERENCE", "2.15.1.1", baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_COMPONENT2_ATTRIBUTE, "CONNECTION_COMPONENT2_ATTRIBUTE", "2.15.2", baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_COMPONENT2_ATTRIBUTE_REFERENCE, "CONNECTION_COMPONENT2_ATTRIBUTE_REFERENCE", "2.15.2.1", baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_EXCLUDE_SELF, "CONNECTION_EXCLUDE_SELF", "2.15.3", baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_UNIQUE, "CONNECTION_UNIQUE", "2.15.4", baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::CONNECTION_CHILD, "CONNECTION_CHILD", "2.15.5", baseSpecificationUrl, "specB15"}, + {Issue::ReferenceRule::MAP_VARIABLES_ELEMENT, "MAP_VARIABLES_ELEMENT", "2.16", baseSpecificationUrl, "specB16"}, + {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE1_ATTRIBUTE, "MAP_VARIABLES_VARIABLE1_ATTRIBUTE", "2.16.1", baseSpecificationUrl, "specB16"}, + {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE1_ATTRIBUTE_REFERENCE, "MAP_VARIABLES_VARIABLE1_ATTRIBUTE_REFERENCE", "2.16.1.1", baseSpecificationUrl, "specB16"}, + {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE2_ATTRIBUTE, "MAP_VARIABLES_VARIABLE2_ATTRIBUTE", "2.16.2", baseSpecificationUrl, "specB16"}, + {Issue::ReferenceRule::MAP_VARIABLES_VARIABLE2_ATTRIBUTE_REFERENCE, "MAP_VARIABLES_VARIABLE2_ATTRIBUTE_REFERENCE", "2.16.2.1", baseSpecificationUrl, "specB16"}, + {Issue::ReferenceRule::MAP_VARIABLES_UNIQUE, "MAP_VARIABLES_UNIQUE", "2.16.3", baseSpecificationUrl, "specB16"}, // Secondary specification rules: - {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_AT_LEAST_ONE_ALPHANUM, {"DATA_REPR_IDENTIFIER_AT_LEAST_ONE_ALPHANUM", "1.3.1.1", baseSpecificationUrl, "specA03"}}, - {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_BEGIN_EURO_NUM, {"DATA_REPR_IDENTIFIER_BEGIN_EURO_NUM", "1.3.1.1", baseSpecificationUrl, "specA03"}}, - {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_LATIN_ALPHANUM, {"DATA_REPR_IDENTIFIER_LATIN_ALPHANUM", "1.3.1.1", baseSpecificationUrl, "specA03"}}, + {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_AT_LEAST_ONE_ALPHANUM, "DATA_REPR_IDENTIFIER_AT_LEAST_ONE_ALPHANUM", "1.3.1.1", baseSpecificationUrl, "specA03"}, + {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_BEGIN_EURO_NUM, "DATA_REPR_IDENTIFIER_BEGIN_EURO_NUM", "1.3.1.1", baseSpecificationUrl, "specA03"}, + {Issue::ReferenceRule::DATA_REPR_IDENTIFIER_LATIN_ALPHANUM, "DATA_REPR_IDENTIFIER_LATIN_ALPHANUM", "1.3.1.1", baseSpecificationUrl, "specA03"}, // Not in normative specification: - {Issue::ReferenceRule::INVALID_ARGUMENT, {"INVALID_ARGUMENT", "", docsUrl, ""}}, + {Issue::ReferenceRule::INVALID_ARGUMENT, "INVALID_ARGUMENT", "", docsUrl, ""}, // Importer class issues: - {Issue::ReferenceRule::IMPORTER_ERROR_IMPORTING_UNITS, {"IMPORTER_ERROR_IMPORTING_UNITS", "", docsUrl, ""}}, - {Issue::ReferenceRule::IMPORTER_MISSING_FILE, {"IMPORTER_MISSING_FILE", "", docsUrl, ""}}, - {Issue::ReferenceRule::IMPORTER_MISSING_COMPONENT, {"IMPORTER_MISSING_COMPONENT", "", docsUrl, ""}}, - {Issue::ReferenceRule::IMPORTER_MISSING_UNITS, {"IMPORTER_MISSING_UNITS", "", docsUrl, ""}}, - {Issue::ReferenceRule::IMPORTER_NULL_MODEL, {"IMPORTER_NULL_MODEL", "", docsUrl, ""}}, - {Issue::ReferenceRule::IMPORTER_UNDEFINED_MODEL, {"IMPORTER_UNDEFINED_MODEL", "", docsUrl, ""}}, - {Issue::ReferenceRule::IMPORTER_UNRESOLVED_IMPORTS, {"IMPORTER_UNRESOLVED_IMPORTS", "", docsUrl, ""}}, + {Issue::ReferenceRule::IMPORTER_ERROR_IMPORTING_UNITS, "IMPORTER_ERROR_IMPORTING_UNITS", "", docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_MISSING_FILE, "IMPORTER_MISSING_FILE", "", docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_MISSING_COMPONENT, "IMPORTER_MISSING_COMPONENT", "", docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_MISSING_UNITS, "IMPORTER_MISSING_UNITS", "", docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_NULL_MODEL, "IMPORTER_NULL_MODEL", "", docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_UNDEFINED_MODEL, "IMPORTER_UNDEFINED_MODEL", "", docsUrl, ""}, + {Issue::ReferenceRule::IMPORTER_UNRESOLVED_IMPORTS, "IMPORTER_UNRESOLVED_IMPORTS", "", docsUrl, ""}, // Analyser issues: - {Issue::ReferenceRule::ANALYSER_EQUATION_NOT_EQUALITY_STATEMENT, {"ANALYSER_EQUATION_NOT_EQUALITY_STATEMENT", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_UNITS, {"ANALYSER_UNITS", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_UNLINKED_UNITS, {"ANALYSER_UNLINKED_UNITS", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_MORE_THAN_ONCE, {"ANALYSER_VARIABLE_INITIALISED_MORE_THAN_ONCE", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_USING_ALGEBRAIC_VARIABLE, {"ANALYSER_VARIABLE_INITIALISED_USING_ALGEBRAIC_VARIABLE", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_USING_VARIABLE_WITH_DIFFERENT_UNITS, {"ANALYSER_VARIABLE_INITIALISED_USING_VARIABLE_WITH_DIFFERENT_UNITS", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_VOI_INITIALISED, {"ANALYSER_VOI_INITIALISED", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_VOI_SEVERAL, {"ANALYSER_VOI_SEVERAL", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_ODE_NOT_FIRST_ORDER, {"ANALYSER_ODE_NOT_FIRST_ORDER", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_UNUSED, {"ANALYSER_VARIABLE_UNUSED", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_STATE_NOT_INITIALISED, {"ANALYSER_STATE_NOT_INITIALISED", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_STATE_RATE_AS_ALGEBRAIC_VARIABLE, {"ANALYSER_STATE_RATE_AS_ALGEBRAIC_VARIABLE", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_UNDERCONSTRAINED, {"ANALYSER_VARIABLE_UNDERCONSTRAINED", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_VARIABLE_OVERCONSTRAINED, {"ANALYSER_VARIABLE_OVERCONSTRAINED", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_DIFFERENT_MODEL, {"ANALYSER_EXTERNAL_VARIABLE_DIFFERENT_MODEL", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_VOI, {"ANALYSER_EXTERNAL_VARIABLE_VOI", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_USE_PRIMARY_VARIABLE, {"ANALYSER_EXTERNAL_VARIABLE_USE_PRIMARY_VARIABLE", "", docsUrl, ""}}, + {Issue::ReferenceRule::ANALYSER_EQUATION_NOT_EQUALITY_STATEMENT, "ANALYSER_EQUATION_NOT_EQUALITY_STATEMENT", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_UNITS, "ANALYSER_UNITS", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_UNLINKED_UNITS, "ANALYSER_UNLINKED_UNITS", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_MORE_THAN_ONCE, "ANALYSER_VARIABLE_INITIALISED_MORE_THAN_ONCE", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_USING_ALGEBRAIC_VARIABLE, "ANALYSER_VARIABLE_INITIALISED_USING_ALGEBRAIC_VARIABLE", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_INITIALISED_USING_VARIABLE_WITH_DIFFERENT_UNITS, "ANALYSER_VARIABLE_INITIALISED_USING_VARIABLE_WITH_DIFFERENT_UNITS", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VOI_INITIALISED, "ANALYSER_VOI_INITIALISED", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VOI_SEVERAL, "ANALYSER_VOI_SEVERAL", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_ODE_NOT_FIRST_ORDER, "ANALYSER_ODE_NOT_FIRST_ORDER", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_UNUSED, "ANALYSER_VARIABLE_UNUSED", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_STATE_NOT_INITIALISED, "ANALYSER_STATE_NOT_INITIALISED", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_STATE_RATE_AS_ALGEBRAIC_VARIABLE, "ANALYSER_STATE_RATE_AS_ALGEBRAIC_VARIABLE", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_UNDERCONSTRAINED, "ANALYSER_VARIABLE_UNDERCONSTRAINED", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_VARIABLE_OVERCONSTRAINED, "ANALYSER_VARIABLE_OVERCONSTRAINED", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_DIFFERENT_MODEL, "ANALYSER_EXTERNAL_VARIABLE_DIFFERENT_MODEL", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_VOI, "ANALYSER_EXTERNAL_VARIABLE_VOI", "", docsUrl, ""}, + {Issue::ReferenceRule::ANALYSER_EXTERNAL_VARIABLE_USE_PRIMARY_VARIABLE, "ANALYSER_EXTERNAL_VARIABLE_USE_PRIMARY_VARIABLE", "", docsUrl, ""}, // Annotator issues: - {Issue::ReferenceRule::ANNOTATOR_ID_NOT_FOUND, {"ANNOTATOR_ID_NOT_FOUND", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANNOTATOR_ID_NOT_UNIQUE, {"ANNOTATOR_ID_NOT_UNIQUE", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANNOTATOR_NO_MODEL, {"ANNOTATOR_NO_MODEL", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANNOTATOR_INCONSISTENT_TYPE, {"ANNOTATOR_INCONSISTENT_TYPE", "", docsUrl, ""}}, - {Issue::ReferenceRule::ANNOTATOR_NULL_MODEL, {"ANNOTATOR_NULL_MODEL", "", docsUrl, ""}}, + {Issue::ReferenceRule::ANNOTATOR_ID_NOT_FOUND, "ANNOTATOR_ID_NOT_FOUND", "", docsUrl, ""}, + {Issue::ReferenceRule::ANNOTATOR_ID_NOT_UNIQUE, "ANNOTATOR_ID_NOT_UNIQUE", "", docsUrl, ""}, + {Issue::ReferenceRule::ANNOTATOR_NO_MODEL, "ANNOTATOR_NO_MODEL", "", docsUrl, ""}, + {Issue::ReferenceRule::ANNOTATOR_INCONSISTENT_TYPE, "ANNOTATOR_INCONSISTENT_TYPE", "", docsUrl, ""}, + {Issue::ReferenceRule::ANNOTATOR_NULL_MODEL, "ANNOTATOR_NULL_MODEL", "", docsUrl, ""}, + // Generator issues: + {Issue::ReferenceRule::GENERATOR_NULL_MODEL, "GENERATOR_NULL_MODEL", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_NULL_VARIABLE, "GENERATOR_NULL_VARIABLE", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_VOI_VARIABLE_ALWAYS_TRACKED, "GENERATOR_VOI_VARIABLE_ALWAYS_TRACKED", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_VOI_VARIABLE_NOT_UNTRACKABLE, "GENERATOR_VOI_VARIABLE_NOT_UNTRACKABLE", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_STATE_VARIABLE_ALWAYS_TRACKED, "GENERATOR_STATE_VARIABLE_ALWAYS_TRACKED", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_STATE_VARIABLE_NOT_UNTRACKABLE, "GENERATOR_STATE_VARIABLE_NOT_UNTRACKABLE", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_EXTERNAL_VARIABLE_ALWAYS_TRACKED, "GENERATOR_EXTERNAL_VARIABLE_ALWAYS_TRACKED", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_EXTERNAL_VARIABLE_NOT_UNTRACKABLE, "GENERATOR_EXTERNAL_VARIABLE_NOT_UNTRACKABLE", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_NLA_BASED_VARIABLE_ALWAYS_TRACKED, "GENERATOR_NLA_BASED_VARIABLE_ALWAYS_TRACKED", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_NLA_BASED_VARIABLE_NOT_UNTRACKABLE, "GENERATOR_NLA_BASED_VARIABLE_NOT_UNTRACKABLE", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_EXTERNALLY_NEEDED_VARIABLE_ALWAYS_TRACKED, "GENERATOR_EXTERNALLY_NEEDED_VARIABLE_ALWAYS_TRACKED", "", docsUrl, ""}, + {Issue::ReferenceRule::GENERATOR_EXTERNALLY_NEEDED_VARIABLE_NOT_UNTRACKABLE, "GENERATOR_EXTERNALLY_NEEDED_VARIABLE_NOT_UNTRACKABLE", "", docsUrl, ""}, + + // Placeholder for further references: + {Issue::ReferenceRule::UNSPECIFIED, "", "", "", ""}, }; +static const RuleInformation &ruleInformation(Issue::ReferenceRule rule) +{ + return ruleToInformation[static_cast(rule)]; +} + std::string Issue::referenceHeading() const { - return ruleToInformation.at(referenceRule())[1]; + return ruleInformation(referenceRule()).heading; } std::string Issue::url() const { - auto search = ruleToInformation.at(referenceRule()); + const auto &information = ruleInformation(referenceRule()); + std::string baseUrl = information.baseUrl; - if (search[1].empty()) { - return search[2] + "?issue=" + search[0]; + if (*information.heading == '\0') { + return baseUrl + "?issue=" + information.name; } - return search[2] + search[3] + ".html?issue=" + search[0]; + return baseUrl + information.page + ".html?issue=" + information.name; } } // namespace libcellml diff --git a/src/utilities.h b/src/utilities.h index 888447f1f..53cc56f11 100644 --- a/src/utilities.h +++ b/src/utilities.h @@ -34,15 +34,15 @@ namespace libcellml { /** * Base URLs of sites from which Issue::url() strings will be constructed. */ -static const std::string baseSpecificationUrl = "https://cellml-specification.readthedocs.io/en/latest/reference/formal_and_informative/"; -static const std::string docsUrl = "https://libcellml.org/documentation/guides/latest/runtime_codes/index"; +inline constexpr const char *baseSpecificationUrl = "https://cellml-specification.readthedocs.io/en/latest/reference/formal_and_informative/"; +inline constexpr const char *docsUrl = "https://libcellml.org/documentation/guides/latest/runtime_codes/index"; static const size_t MAX_SIZE_T = std::numeric_limits::max(); /** * Vector of base units. */ -static const NameList baseUnitsList = { +inline const NameList baseUnitsList = { "ampere", "candela", "dimensionless", @@ -55,7 +55,7 @@ static const NameList baseUnitsList = { /** * Map connecting standard built-in units to their base unit components and their exponents. */ -static const std::map> standardUnitsList = { +inline const std::map> standardUnitsList = { {"ampere", {{"ampere", 1.0}}}, {"becquerel", {{"second", -1.0}}}, {"candela", {{"candela", 1.0}}}, @@ -91,7 +91,7 @@ static const std::map> standardUnitsL /** * Map connecting standard built-in units to the multiplier exponent of their base unit components. */ -static const std::map standardMultiplierList = { +inline const std::map standardMultiplierList = { {"ampere", 0.0}, {"becquerel", 0.0}, {"candela", 0.0}, @@ -127,7 +127,7 @@ static const std::map standardMultiplierList = { /** * List of MathML elements supported by CellML. */ -static const NameList supportedMathMLElements = { +inline const NameList supportedMathMLElements = { "ci", "cn", "sep", "apply", "piecewise", "piece", "otherwise", "eq", "neq", "gt", "lt", "geq", "leq", "and", "or", "xor", "not", "plus", "minus", "times", "divide", "power", "root", "abs", "exp", "ln", "log", "floor", "ceiling", "min", "max", "rem", "diff", "bvar", "logbase", "degree", "sin", "cos", "tan", "sec", "csc", @@ -140,7 +140,7 @@ static const NameList supportedMathMLElements = { * * An internal map used to convert a Variable InterfaceType enum class member into its string form. */ -static const std::map interfaceTypeToString = { +inline const std::map interfaceTypeToString = { {Variable::InterfaceType::NONE, "none"}, {Variable::InterfaceType::PRIVATE, "private"}, {Variable::InterfaceType::PUBLIC, "public"}, diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index b2b96add1..190e53f47 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -126,6 +126,7 @@ endforeach() set(ALL_LIBRARY_SOURCE_FILES ${SOURCE_FILES} ${API_HEADER_FILES} ${MODULE_HEADER_FILES} ${GENERATED_HEADER_FILES} ${HEADER_FILES}) add_test(NAME are_debug_utilities_used COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/cmake/checkfordebugheaderusage.cmake ${ALL_LIBRARY_SOURCE_FILES}) +add_test(NAME are_issue_reference_rules_consistent COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/cmake/checkissuereferencerules.cmake ${CMAKE_SOURCE_DIR}/src/api/libcellml/issue.h ${CMAKE_SOURCE_DIR}/src/issue.cpp) # Generate tests for header files. include(api_headers/tests.cmake) diff --git a/tests/generator/generatorvariabletracker.cpp b/tests/generator/generatorvariabletracker.cpp index b7ac79f25..ebca6bd8d 100644 --- a/tests/generator/generatorvariabletracker.cpp +++ b/tests/generator/generatorvariabletracker.cpp @@ -40,6 +40,9 @@ TEST(GeneratorVariableTracker, noModelOrVariable) generatorVariableTracker->trackVariable(nullptr); EXPECT_EQ_ISSUES_LEVELS_REFERENCERULES(nullVariableIssue, errorLevel, nullVariableReferenceRule, generatorVariableTracker); + EXPECT_EQ_ISSUES_SPECIFICATION_HEADINGS_URLS(nullVariableIssue, std::vector({""}), + std::vector({"https://libcellml.org/documentation/guides/latest/runtime_codes/index?issue=GENERATOR_NULL_VARIABLE"}), + generatorVariableTracker); generatorVariableTracker->untrackVariable(nullptr); EXPECT_EQ_ISSUES_LEVELS_REFERENCERULES(nullVariableIssue, errorLevel, nullVariableReferenceRule, generatorVariableTracker);