FMI Library: part of JModelica.org
fmi2_xml_parsing_test.c
Go to the documentation of this file.
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 
10 static char *expected_message = "Invalid structured ScalarVariable name";
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 
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))) {
33  }
34 }
35 
36 void test_parser(char *xml_dir, int should_not_log_expected_msg, int configuration)
37 {
39  fmi_import_context_t *context;
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 
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 {
75 }
76 
77 void pass_name_check(char *xml_dir)
78 {
80 }
81 
82 void parser_log_expected_message(char *xml_dir)
83 {
85 }
86 
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 
173 
174  return 0;
175 }
int jm_diff char
Definition: jm_vector.h:369
jm_calloc_f calloc
Allocate zero initialized memory.
Definition: jm_callbacks.h:77
size_t jm_callbacks * c
void test_parser(char *xml_dir, int should_not_log_expected_msg, int configuration)
jm_log_level_enu_t
Log levels supported via the logger functions in jm_callbacks.
Definition: jm_types.h:51
FMILIB_EXPORT fmi2_import_t * fmi2_import_parse_xml(fmi_import_context_t *context, const char *dirPath, fmi2_xml_callbacks_t *xml_callbacks)
Create fmi2_import_t structure and parse the FMI 2.0 XML file found in the directory dirName...
Debug messages. Only enabled if library is configured with FMILIB_ENABLE_LOG_LEVEL_DEBUG.
Definition: jm_types.h:59
jm_log_level_enu_t log_level
Logging level.
Definition: jm_callbacks.h:85
v callbacks
fmi1_capi_t * fmu
int main(int argc, char *argv[])
static char * expected_message
void parser_log_expected_message(char *xml_dir)
static const int SHOULD_LOG_EXPECTED_MSG
Include file to be used in client applications of the FMI Library.
static int did_not_log_expected_msg
jm_malloc_f malloc
Allocate non-initialized memory.
Definition: jm_callbacks.h:75
jm_voidp context
Arbitrary context pointer passed to the logger function.
Definition: jm_callbacks.h:87
const char * jm_string
A constant string.
Definition: jm_types.h:33
void pass_name_check(char *xml_dir)
FMILIB_EXPORT void fmi_import_set_configuration(fmi_import_context_t *c, int conf)
Sets advanced configuration, if zero is passed default configuration is set. Currently only one non d...
The callbacks struct is sent to all the modules in the library.
Definition: jm_callbacks.h:73
struct fmi_xml_context_t fmi_import_context_t
FMI version independent library context. Opaque struct returned from fmi_import_allocate_context() ...
void importlogger(jm_callbacks *c, jm_string module, jm_log_level_enu_t log_level, jm_string message)
FMILIB_EXPORT fmi_import_context_t * fmi_import_allocate_context(jm_callbacks *callbacks)
Create fmi_import_context_t structure.
FMILIB_EXPORT void fmi_import_free_context(fmi_import_context_t *c)
Free memory allocated for the library context.
void test_variable_naming_conventions(void)
jm_realloc_f realloc
Re-allocate memory.
Definition: jm_callbacks.h:79
#define FMI_IMPORT_NAME_CHECK
If this configuration option is set, the model description will be checked to follow the variable nam...
static char * name_check_test_directory
jm_free_f free
Free-allocated memory.
Definition: jm_callbacks.h:81
jm_logger_f logger
Logging callback.
Definition: jm_callbacks.h:83
char * concat(char *s1, char *s2)
void fail_name_check(char *xml_dir)
static const int SHOULD_NOT_LOG_EXPECTED_MSG
struct fmi2_import_t fmi2_import_t
FMU version 2.0 object.