4 #include "config_test.h"
6 static const int SHOULD_NOT_LOG_EXPECTED_MSG = 0;
7 static const int SHOULD_LOG_EXPECTED_MSG = 1;
9 static int did_not_log_expected_msg;
10 static char *expected_message = "Invalid structured ScalarVariable name";
11 static char *name_check_test_directory;
13 char *concat(char *s1, char *s2)
15 size_t len1 = strlen(s1);
16 size_t len2 = strlen(s2);
17 /* +1 for the zero-terminator */
18 char *result = (char *) malloc((len1 + len2 + 1) * sizeof(char));
20 exit(CTEST_RETURN_FAIL);
22 memcpy(result, s1, len1);
23 memcpy(result + len1, s2, len2 + 1); /* +1 to copy the null-terminator */
27 void importlogger(jm_callbacks* c, jm_string module,
28 jm_log_level_enu_t log_level, jm_string message)
30 printf("module = %s, log level = %d: %s\n", module, log_level, message);
31 if (!strncmp(expected_message, message, strlen(expected_message))) {
32 did_not_log_expected_msg = 0;
36 void test_parser(char *xml_dir, int should_not_log_expected_msg, int configuration)
38 jm_callbacks *callbacks;
39 fmi_import_context_t *context;
43 callbacks = (jm_callbacks *) malloc(sizeof(jm_callbacks));
44 callbacks->malloc = malloc;
45 callbacks->calloc = calloc;
46 callbacks->realloc = realloc;
47 callbacks->free = free;
48 callbacks->logger = importlogger;
49 callbacks->log_level = jm_log_level_all;
50 callbacks->context = 0;
51 context = fmi_import_allocate_context(callbacks);
52 if (configuration != 0) {
53 fmi_import_set_configuration(context, configuration);
56 did_not_log_expected_msg = 1;
57 full_path = concat(name_check_test_directory, xml_dir);
58 fmu = fmi2_import_parse_xml(context, full_path, NULL);
61 fmi_import_free_context(context);
63 exit(CTEST_RETURN_FAIL);
65 if (!should_not_log_expected_msg && did_not_log_expected_msg ||
66 did_not_log_expected_msg && !should_not_log_expected_msg) {
67 exit(CTEST_RETURN_FAIL);
71 void fail_name_check(char *xml_dir)
73 test_parser(xml_dir, SHOULD_NOT_LOG_EXPECTED_MSG, FMI_IMPORT_NAME_CHECK);
74 test_parser(xml_dir, SHOULD_LOG_EXPECTED_MSG, 0);
77 void pass_name_check(char *xml_dir)
79 test_parser(xml_dir, SHOULD_LOG_EXPECTED_MSG, FMI_IMPORT_NAME_CHECK);
82 void parser_log_expected_message(char *xml_dir)
84 test_parser(xml_dir, SHOULD_NOT_LOG_EXPECTED_MSG, 0);
87 void test_variable_naming_conventions(void)
89 /* Test scalar variable names
91 * Every test below has a corresponding modelDescription in
92 * Test/FMI2/naming_conventions_xmls/
93 * What is passed to these macros are names of directories containing
97 /* Test examples mentioned */
98 fail_name_check("naming_conventions_xmls/examples/foo");
99 fail_name_check("naming_conventions_xmls/examples/derderx");
100 pass_name_check("naming_conventions_xmls/examples/derx2");
102 /* FMI 2.0 standard examples from the documentaiton */
103 pass_name_check("naming_conventions_xmls/standard/vehicle.engine.speed");
104 pass_name_check("naming_conventions_xmls/standard/resistor12.u");
105 pass_name_check("naming_conventions_xmls/standard/v_min");
106 pass_name_check("naming_conventions_xmls/standard/robot.axis.motor234");
107 pass_name_check("naming_conventions_xmls/standard/derpipe34.T142");
109 /* Implementation test examples */
110 fail_name_check("naming_conventions_xmls/implementation/empty");
111 fail_name_check("naming_conventions_xmls/implementation/-0");
112 pass_name_check("naming_conventions_xmls/implementation/_0");
113 pass_name_check("naming_conventions_xmls/implementation/a0");
114 fail_name_check("naming_conventions_xmls/implementation/0a");
115 fail_name_check("naming_conventions_xmls/implementation/0");
118 fail_name_check("naming_conventions_xmls/q-name/empty");
119 pass_name_check("naming_conventions_xmls/q-name/space");
120 fail_name_check("naming_conventions_xmls/q-name/backslash");
121 pass_name_check("naming_conventions_xmls/q-name/q-char");
122 pass_name_check("naming_conventions_xmls/q-name/escape");
123 fail_name_check("naming_conventions_xmls/q-name/chinese"); /* this should pass in FMI 1.0 */
126 fail_name_check("naming_conventions_xmls/der/dera32"); /* this should pass in FMI 1.0 */
127 fail_name_check("naming_conventions_xmls/der/dera12");
128 pass_name_check("naming_conventions_xmls/der/dera32-no-space");
129 pass_name_check("naming_conventions_xmls/der/dera");
130 fail_name_check("naming_conventions_xmls/der/dera-no-closing-parenthesis");
131 pass_name_check("naming_conventions_xmls/der/somederthing");
132 pass_name_check("naming_conventions_xmls/der/der0");
133 fail_name_check("naming_conventions_xmls/der/der2");
134 fail_name_check("naming_conventions_xmls/der/adera");
136 /* array and hierarchy tests */
137 pass_name_check("naming_conventions_xmls/array/n0");
138 fail_name_check("naming_conventions_xmls/array/a1comma");
139 pass_name_check("naming_conventions_xmls/array/a12345678");
140 fail_name_check("naming_conventions_xmls/array/a12345678space"); /* this should pass in FMI 1.0 */
141 pass_name_check("naming_conventions_xmls/array/a1.a3");
142 pass_name_check("naming_conventions_xmls/array/a.a123");
143 fail_name_check("naming_conventions_xmls/array/aspace1");
144 fail_name_check("naming_conventions_xmls/array/a1space");
145 fail_name_check("naming_conventions_xmls/array/a1space1"); /* this should pass in FMI 1.0 */
146 fail_name_check("naming_conventions_xmls/array/aspacebracket1");
147 fail_name_check("naming_conventions_xmls/array/a-1");
148 pass_name_check("naming_conventions_xmls/array/a1");
149 pass_name_check("naming_conventions_xmls/array/a.a");
150 pass_name_check("naming_conventions_xmls/array/a");
152 /* list of variables */
153 fail_name_check("naming_conventions_xmls/list/aemptyc");
154 expected_message = "Two variables with the same name";
155 pass_name_check("naming_conventions_xmls/list/cba");
156 fail_name_check("naming_conventions_xmls/list/acad");
158 /* flat hierarchy test */
159 fail_name_check("naming_conventions_xmls/flat/acad");
160 pass_name_check("naming_conventions_xmls/flat/q-char-nonescaped");
163 int main(int argc, char *argv[])
166 name_check_test_directory = argv[1];
168 printf("Usage: %s <path to folder naming_conventions_xmls>\n", argv[0]);
169 exit(CTEST_RETURN_FAIL);
172 test_variable_naming_conventions();