Skip to content

Commit

Permalink
Merge pull request #5 from modelon/fmi-2002
Browse files Browse the repository at this point in the history
Extend API: check if DefaultExperiment attributes defined
  • Loading branch information
filip-stenstrom committed Dec 12, 2019
2 parents 7cf4b39 + 5be797d commit 11ea105
Show file tree
Hide file tree
Showing 21 changed files with 630 additions and 75 deletions.
5 changes: 5 additions & 0 deletions Config.cmake/test_fmi1.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ compress_fmu("${TEST_OUTPUT_FOLDER}" "${FMU_DUMMY_ME_MODEL_IDENTIFIER}" "me" "fm
compress_fmu("${TEST_OUTPUT_FOLDER}" "${FMU_DUMMY_CS_MODEL_IDENTIFIER}" "cs" "fmu1_dll_cs" "${XML_CS_PATH}" "${SHARED_LIBRARY_CS_PATH}")
compress_fmu("${TEST_OUTPUT_FOLDER}" "${FMU_DUMMY_CS_MODEL_IDENTIFIER}" "cs_tc" "fmu1_dll_cs" "${XML_CS_TC_PATH}" "${SHARED_LIBRARY_CS_PATH}")

add_executable (fmi1_import_default_experiment_test ${RTTESTDIR}/FMI1/fmi1_import_default_experiment_test.c)
target_link_libraries (fmi1_import_default_experiment_test ${FMILIBFORTEST} )

add_executable (fmi1_xml_parsing_test ${RTTESTDIR}/FMI1/fmi1_xml_parsing_test.c)
target_link_libraries (fmi1_xml_parsing_test ${FMILIBFORTEST} )
add_executable (fmi_import_xml_test ${RTTESTDIR}/FMI1/fmi_import_xml_test.c)
Expand All @@ -83,6 +86,7 @@ to_native_c_path("${TEST_OUTPUT_FOLDER}/${FMU_DUMMY_CS_MODEL_IDENTIFIER}_cs_tc.f
# set(FMU_TEMPFOLDER ${TEST_OUTPUT_FOLDER}/tempfolder)
to_native_c_path(${TEST_OUTPUT_FOLDER}/tempfolder FMU_TEMPFOLDER)

add_test(ctest_fmi1_xml_parsing_test fmi1_import_default_experiment_test ${RTTESTDIR}/FMI1/parser_test_xmls/default_experiment/)
add_test(ctest_fmi1_xml_parsing_test fmi1_xml_parsing_test ${RTTESTDIR}/FMI1/parser_test_xmls/)
ADD_TEST(ctest_fmi_import_me_test fmi_import_me_test ${FMU_ME_PATH} ${FMU_TEMPFOLDER})
ADD_TEST(ctest_fmi_import_cs_test fmi_import_cs_test ${FMU_CS_PATH} ${FMU_TEMPFOLDER} "modelDescription_cs.xml")
Expand Down Expand Up @@ -114,6 +118,7 @@ set_target_properties(
fmi1_capi_me_test
fmi1_logger_test
fmi1_xml_parsing_test
fmi1_import_default_experiment_test
PROPERTIES FOLDER "Test/FMI1")

SET_TESTS_PROPERTIES (
Expand Down
9 changes: 9 additions & 0 deletions Config.cmake/test_fmi2.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ set(XML_MF_PATH ${FMU2_DUMMY_FOLDER}/modelDescription_malformed.xml)

set(VARIALBE_TEST_MODEL_DESC_DIR
${RTTESTDIR}/FMI2/parser_test_xmls/variable_test)
set(DEFAULT_EXPERIMENT_MODEL_DESC_DIR
${RTTESTDIR}/FMI2/parser_test_xmls/default_experiment/) # Trailing '/' necessary (for building system independent path)
set(VARIABLE_NO_TYPE_MODEL_DESC_DIR
${RTTESTDIR}/FMI2/parser_test_xmls/variable_no_type)
set(VARIABLE_BAD_VARIABILITY_CAUSALITY_MODEL_DESC_DIR
Expand Down Expand Up @@ -79,6 +81,8 @@ add_executable (fmi2_import_cs_test ${RTTESTDIR}/FMI2/fmi2_import_cs_test.c)
target_link_libraries (fmi2_import_cs_test ${FMILIBFORTEST})
add_executable(fmi2_import_variable_test ${RTTESTDIR}/FMI2/fmi2_import_variable_test.c)
target_link_libraries(fmi2_import_variable_test ${FMILIBFORTEST})
add_executable(fmi2_import_default_experiment_test ${RTTESTDIR}/FMI2/fmi2_import_default_experiment_test.c)
target_link_libraries(fmi2_import_default_experiment_test ${FMILIBFORTEST})
add_executable(fmi2_variable_no_type_test
${RTTESTDIR}/FMI2/fmi2_variable_no_type_test.c)
target_link_libraries(fmi2_variable_no_type_test ${FMILIBFORTEST})
Expand All @@ -93,6 +97,7 @@ set_target_properties(
fmi2_import_xml_test
fmi2_import_me_test fmi2_import_cs_test
fmi2_import_variable_test
fmi2_import_default_experiment_test
PROPERTIES FOLDER "Test/FMI2"
)
set(FAIL_NAME_CHECK 0)
Expand All @@ -110,6 +115,9 @@ add_test(ctest_fmi2_import_test_cs fmi2_import_cs_test ${FMU2_CS_PATH} ${FMU_TEM
add_test(ctest_fmi2_import_variable_test
fmi2_import_variable_test
${VARIALBE_TEST_MODEL_DESC_DIR})
add_test(ctest_fmi2_import_default_experiment_test
fmi2_import_default_experiment_test
${DEFAULT_EXPERIMENT_MODEL_DESC_DIR})
add_test(ctest_fmi2_variable_no_type_test
fmi2_variable_no_type_test
${VARIABLE_NO_TYPE_MODEL_DESC_DIR})
Expand All @@ -129,6 +137,7 @@ if(FMILIB_BUILD_BEFORE_TESTS)
ctest_fmi2_import_test_me
ctest_fmi2_import_test_cs
ctest_fmi2_import_variable_test
ctest_fmi2_import_default_experiment_test
ctest_fmi2_variable_no_type_test
ctest_fmi2_enum_test
ctest_fmi2_variable_bad_variability_causality_test
Expand Down
112 changes: 112 additions & 0 deletions Test/FMI1/fmi1_import_default_experiment_test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
#include <stdio.h>

#include <fmilib.h>
#include "config_test.h"
#include "fmil_test.h"

static fmi1_import_t *parse_xml(const char *model_desc_path)
{
jm_callbacks *cb = jm_get_default_callbacks();
fmi_import_context_t *ctx = fmi_import_allocate_context(cb);
fmi1_import_t *xml;

if (ctx == NULL) {
return NULL;
}

xml = fmi1_import_parse_xml(ctx, model_desc_path);

fmi_import_free_context(ctx);
return xml;
}

/* get values from DefaultExperiment */
static int test_default_experiment_defined(fmi1_import_t *xml)
{
/* test defined */
ASSERT_MSG(fmi1_import_get_default_experiment_has_start(xml) == 1, "test_undefined, has_start: incorrect");
ASSERT_MSG(fmi1_import_get_default_experiment_has_stop(xml) == 1, "test_undefined, has_stop: incorrect");
ASSERT_MSG(fmi1_import_get_default_experiment_has_tolerance(xml) == 1, "test_undefined, has_tolerance: incorrect");

/* test value */
ASSERT_MSG(fmi1_import_get_default_experiment_start(xml) == 2.3, "test_defined: incorrect startTime");
ASSERT_MSG(fmi1_import_get_default_experiment_stop(xml) == 3.55, "test_defined: incorrect stopTime");
ASSERT_MSG(fmi1_import_get_default_experiment_tolerance(xml) == 1e-6, "test_defined: incorrect tolerance");

return TEST_OK;
}

/* get default values from DefaultExperiment */
static int test_default_experiment_undefined(fmi1_import_t *xml)
{
/* test defined */
ASSERT_MSG(fmi1_import_get_default_experiment_has_start(xml) == 0, "test_undefined, has_start: incorrect");
ASSERT_MSG(fmi1_import_get_default_experiment_has_stop(xml) == 0, "test_undefined, has_stop: incorrect");
ASSERT_MSG(fmi1_import_get_default_experiment_has_tolerance(xml) == 0, "test_undefined, has_tolerance: incorrect");

/* test value */
ASSERT_MSG(fmi1_import_get_default_experiment_start(xml) == 0.0, "test_undefined: incorrect default startTime");
ASSERT_MSG(fmi1_import_get_default_experiment_stop(xml) == 1.0, "test_undefined: incorrect default stopTime");
ASSERT_MSG(fmi1_import_get_default_experiment_tolerance(xml) == 1e-4, "test_undefined: incorrect default tolerance");

return TEST_OK;
}

/* get mix of default and user defined values from DefaultExperiment */
static int test_default_experiment_mixed(fmi1_import_t *xml)
{
/* test defined */
ASSERT_MSG(fmi1_import_get_default_experiment_has_start(xml) == 1, "test_mixed, has_start: incorrect");
ASSERT_MSG(fmi1_import_get_default_experiment_has_stop(xml) == 0, "test_mixed, has_stop: incorrect");
ASSERT_MSG(fmi1_import_get_default_experiment_has_tolerance(xml) == 1, "test_mixed, has_tolerance: incorrect");

/* test value */
ASSERT_MSG(fmi1_import_get_default_experiment_start(xml) == 2.3, "test_mixed: incorrect default startTime");
ASSERT_MSG(fmi1_import_get_default_experiment_stop(xml) == 1.0, "test_mixed: incorrect default stopTime");
ASSERT_MSG(fmi1_import_get_default_experiment_tolerance(xml) == 1e-6, "test_mixed: incorrect default tolerance");

return TEST_OK;
}

int main(int argc, char **argv)
{
#define PATH_BUF_SIZE 1000
char path_buf[PATH_BUF_SIZE]; /* buffer for path to md */
fmi1_import_t *xml;
int ret = 1;
if (argc != 2) {
printf("Usage: %s <path to dir that contains 'defined' and 'undefined' "
"parent dirs of modelDescription files (including trailing file separator "
"(slash or backslash))>\n", argv[0]);
return CTEST_RETURN_FAIL;
}

printf("Running fmi1_import_variable_test\n");

/* test 1 */
xml = parse_xml(strcat(strncpy(path_buf, argv[1], PATH_BUF_SIZE), "defined"));
if (xml == NULL) {
return CTEST_RETURN_FAIL;
}
ret &= test_default_experiment_defined(xml);
fmi1_import_free(xml);

/* test 2 */
xml = parse_xml(strcat(strncpy(path_buf, argv[1], PATH_BUF_SIZE), "undefined"));
if (xml == NULL) {
return CTEST_RETURN_FAIL;
}
ret &= test_default_experiment_undefined(xml);
fmi1_import_free(xml);

/* test 3 */
xml = parse_xml(strcat(strncpy(path_buf, argv[1], PATH_BUF_SIZE), "mixed"));
if (xml == NULL) {
return CTEST_RETURN_FAIL;
}
ret &= test_default_experiment_mixed(xml);
fmi1_import_free(xml);

return ret == 0 ? CTEST_RETURN_FAIL : CTEST_RETURN_SUCCESS;
#undef PATH_BUF_SIZE
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<fmiModelDescription
fmiVersion="1.0"
modelName="myModelName"
guid="myGuid"
modelIdentifier="myModelIdentifier"
description="myDescription"
author="myAuthor"
generationTool="myGenerationTool"
generationDateAndTime="2002-05-30T09:00:00"
version="myModelVersion"
variableNamingConvention="structured"
numberOfContinuousStates="0"
numberOfEventIndicators="0">

<DefaultExperiment
startTime="2.3"
stopTime="3.55"
tolerance="1e-6"
/>

<ModelVariables/>

</fmiModelDescription>
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<fmiModelDescription
fmiVersion="1.0"
modelName="myModelName"
guid="myGuid"
modelIdentifier="myModelIdentifier"
description="myDescription"
author="myAuthor"
generationTool="myGenerationTool"
generationDateAndTime="2002-05-30T09:00:00"
version="myModelVersion"
variableNamingConvention="structured"
numberOfContinuousStates="0"
numberOfEventIndicators="0">

<DefaultExperiment
startTime="2.3"
tolerance="1e-6"
/>

<ModelVariables/>

</fmiModelDescription>
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<fmiModelDescription
fmiVersion="1.0"
modelName="myModelName"
guid="myGuid"
modelIdentifier="myModelIdentifier"
description="myDescription"
author="myAuthor"
generationTool="myGenerationTool"
generationDateAndTime="2002-05-30T09:00:00"
version="myModelVersion"
variableNamingConvention="structured"
numberOfContinuousStates="0"
numberOfEventIndicators="0">

<DefaultExperiment/>

<ModelVariables/>

</fmiModelDescription>
118 changes: 118 additions & 0 deletions Test/FMI2/fmi2_import_default_experiment_test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
#include <stdio.h>

#include <fmilib.h>
#include "config_test.h"
#include "fmil_test.h"

static fmi2_import_t *parse_xml(const char *model_desc_path)
{
jm_callbacks *cb = jm_get_default_callbacks();
fmi_import_context_t *ctx = fmi_import_allocate_context(cb);
fmi2_import_t *xml;

if (ctx == NULL) {
return NULL;
}

xml = fmi2_import_parse_xml(ctx, model_desc_path, NULL);

fmi_import_free_context(ctx);
return xml;
}

/* get values from DefaultExperiment */
static int test_default_experiment_defined(fmi2_import_t *xml)
{
/* test defined */
ASSERT_MSG(fmi2_import_get_default_experiment_has_start(xml) == 1, "test_undefined, has_start: incorrect");
ASSERT_MSG(fmi2_import_get_default_experiment_has_stop(xml) == 1, "test_undefined, has_stop: incorrect");
ASSERT_MSG(fmi2_import_get_default_experiment_has_tolerance(xml) == 1, "test_undefined, has_tolerance: incorrect");
ASSERT_MSG(fmi2_import_get_default_experiment_has_step(xml) == 1, "test_undefined, has_step: incorrect");

/* test value */
ASSERT_MSG(fmi2_import_get_default_experiment_start(xml) == 2.3, "test_defined: incorrect startTime");
ASSERT_MSG(fmi2_import_get_default_experiment_stop(xml) == 3.55, "test_defined: incorrect stopTime");
ASSERT_MSG(fmi2_import_get_default_experiment_tolerance(xml) == 1e-6, "test_defined: incorrect tolerance");
ASSERT_MSG(fmi2_import_get_default_experiment_step(xml) == 2e-3, "test_defined: incorrect stepSize");

return TEST_OK;
}

/* get default values from DefaultExperiment */
static int test_default_experiment_undefined(fmi2_import_t *xml)
{
/* test defined */
ASSERT_MSG(fmi2_import_get_default_experiment_has_start(xml) == 0, "test_undefined, has_start: incorrect");
ASSERT_MSG(fmi2_import_get_default_experiment_has_stop(xml) == 0, "test_undefined, has_stop: incorrect");
ASSERT_MSG(fmi2_import_get_default_experiment_has_tolerance(xml) == 0, "test_undefined, has_tolerance: incorrect");
ASSERT_MSG(fmi2_import_get_default_experiment_has_step(xml) == 0, "test_undefined, has_step: incorrect");

/* test value */
ASSERT_MSG(fmi2_import_get_default_experiment_start(xml) == 0.0, "test_undefined: incorrect default startTime");
ASSERT_MSG(fmi2_import_get_default_experiment_stop(xml) == 1.0, "test_undefined: incorrect default stopTime");
ASSERT_MSG(fmi2_import_get_default_experiment_tolerance(xml) == 1e-4, "test_undefined: incorrect default tolerance");
ASSERT_MSG(fmi2_import_get_default_experiment_step(xml) == 1e-2, "test_undefined: incorrect default stepSize");

return TEST_OK;
}

/* get mix of default and user defined values from DefaultExperiment */
static int test_default_experiment_mixed(fmi2_import_t *xml)
{
/* test defined */
ASSERT_MSG(fmi2_import_get_default_experiment_has_start(xml) == 1, "test_mixed, has_start: incorrect");
ASSERT_MSG(fmi2_import_get_default_experiment_has_stop(xml) == 0, "test_mixed, has_stop: incorrect");
ASSERT_MSG(fmi2_import_get_default_experiment_has_tolerance(xml) == 1, "test_mixed, has_tolerance: incorrect");
ASSERT_MSG(fmi2_import_get_default_experiment_has_step(xml) == 0, "test_mixed, has_step: incorrect");

/* test value */
ASSERT_MSG(fmi2_import_get_default_experiment_start(xml) == 2.3, "test_mixed: incorrect default startTime");
ASSERT_MSG(fmi2_import_get_default_experiment_stop(xml) == 1.0, "test_mixed: incorrect default stopTime");
ASSERT_MSG(fmi2_import_get_default_experiment_tolerance(xml) == 1e-6, "test_mixed: incorrect default tolerance");
ASSERT_MSG(fmi2_import_get_default_experiment_step(xml) == 1e-2, "test_mixed: incorrect default stepSize");

return TEST_OK;
}

int main(int argc, char **argv)
{
#define PATH_BUF_SIZE 1000
char path_buf[PATH_BUF_SIZE]; /* buffer for path to md */
fmi2_import_t *xml;
int ret = 1;
if (argc != 2) {
printf("Usage: %s <path to dir that contains 'defined' and 'undefined' "
"parent dirs of modelDescription files (including trailing file separator "
"(slash or backslash))>\n", argv[0]);
return CTEST_RETURN_FAIL;
}

printf("Running fmi2_import_variable_test\n");

/* test 1 */
xml = parse_xml(strcat(strncpy(path_buf, argv[1], PATH_BUF_SIZE), "defined"));
if (xml == NULL) {
return CTEST_RETURN_FAIL;
}
ret &= test_default_experiment_defined(xml);
fmi2_import_free(xml);

/* test 2 */
xml = parse_xml(strcat(strncpy(path_buf, argv[1], PATH_BUF_SIZE), "undefined"));
if (xml == NULL) {
return CTEST_RETURN_FAIL;
}
ret &= test_default_experiment_undefined(xml);
fmi2_import_free(xml);

/* test 3 */
xml = parse_xml(strcat(strncpy(path_buf, argv[1], PATH_BUF_SIZE), "mixed"));
if (xml == NULL) {
return CTEST_RETURN_FAIL;
}
ret &= test_default_experiment_mixed(xml);
fmi2_import_free(xml);

return ret == 0 ? CTEST_RETURN_FAIL : CTEST_RETURN_SUCCESS;
#undef PATH_BUF_SIZE
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<fmiModelDescription
fmiVersion="2.0"
modelName="myModelName"
guid="myGuid"
description="myDescription"
author="myAuthor"
generationTool="myGenerationTool"
generationDateAndTime="2002-05-30T09:00:00"
version="myModelVersion"
variableNamingConvention="structured"
numberOfEventIndicators="3">

<ModelExchange
modelIdentifier="myModelIdentifier" />

<DefaultExperiment
startTime="2.3"
stopTime="3.55"
tolerance="1e-6"
stepSize="2e-3"
/>

<ModelVariables/>
<ModelStructure/>

</fmiModelDescription>
Loading

0 comments on commit 11ea105

Please sign in to comment.