]> gerrit.simantics Code Review - simantics/fmil.git/blob - org.simantics.fmil.core/native/FMILibrary/Test/FMI2/fmi2_xml_parsing_test.c
Add FMILibrary-2.0.3 to org.simantics.fmil.core\native.
[simantics/fmil.git] / org.simantics.fmil.core / native / FMILibrary / Test / FMI2 / fmi2_xml_parsing_test.c
1 #include <stdlib.h>
2 #include <fmilib.h>
3 #include <stdio.h>
4 #include "config_test.h"
5
6 static const int SHOULD_NOT_LOG_EXPECTED_MSG = 0;
7 static const int SHOULD_LOG_EXPECTED_MSG = 1;
8
9 static int did_not_log_expected_msg;
10 static char *expected_message = "Invalid structured ScalarVariable name";
11 static char *name_check_test_directory;
12
13 char *concat(char *s1, char *s2)
14 {
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));
19     if (result == NULL) {
20         exit(CTEST_RETURN_FAIL);
21     }
22     memcpy(result, s1, len1);
23     memcpy(result + len1, s2, len2 + 1); /* +1 to copy the null-terminator */
24     return result;
25 }
26
27 void importlogger(jm_callbacks* c, jm_string module,
28         jm_log_level_enu_t log_level, jm_string message)
29 {
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;
33     }
34 }
35
36 void test_parser(char *xml_dir, int should_not_log_expected_msg, int configuration)
37 {
38     jm_callbacks *callbacks;
39     fmi_import_context_t *context;
40     fmi2_import_t *fmu;
41     char *full_path;
42
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);
54     }
55
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);
59
60     free(full_path);
61     fmi_import_free_context(context);
62     if (fmu == NULL) {
63         exit(CTEST_RETURN_FAIL);
64     }
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);
68     }
69 }
70
71 void fail_name_check(char *xml_dir)
72 {
73     test_parser(xml_dir, SHOULD_NOT_LOG_EXPECTED_MSG, FMI_IMPORT_NAME_CHECK);
74     test_parser(xml_dir, SHOULD_LOG_EXPECTED_MSG, 0);
75 }
76
77 void pass_name_check(char *xml_dir)
78 {
79     test_parser(xml_dir, SHOULD_LOG_EXPECTED_MSG, FMI_IMPORT_NAME_CHECK);
80 }
81
82 void parser_log_expected_message(char *xml_dir)
83 {
84     test_parser(xml_dir, SHOULD_NOT_LOG_EXPECTED_MSG, 0);
85 }
86
87 void test_variable_naming_conventions(void)
88 {
89     /* Test scalar variable names
90      *
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
94      * modelDescriptions.
95      */
96
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");
101
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");
108
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");
116
117     /* q-name tests */
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 */
124
125     /* der() tests */
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");
135
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");
151
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");
157
158     /* flat hierarchy test */
159     fail_name_check("naming_conventions_xmls/flat/acad");
160     pass_name_check("naming_conventions_xmls/flat/q-char-nonescaped");
161 }
162
163 int main(int argc, char *argv[])
164 {
165     if (argc == 2) {
166         name_check_test_directory = argv[1];
167     } else {
168         printf("Usage: %s <path to folder naming_conventions_xmls>\n", argv[0]);
169         exit(CTEST_RETURN_FAIL);
170     }
171
172     test_variable_naming_conventions();
173
174     return 0;
175 }