CMAKE_MINIMUM_REQUIRED(VERSION 3.12)
#test part 21 files

#used to create a number of small files at test-time. you probably don't want to modify.
set( P21_FILE_HEAD "
ISO-10303-21;
HEADER;
FILE_DESCRIPTION((''),'2;1');
FILE_NAME('', '', (''), (''), '', '', '');
FILE_SCHEMA(('")
set( P21_FILE_MID "'));
ENDSEC;
DATA;
")
set( P21_FILE_TAIL "
ENDSEC;
END-ISO-10303-21;
" )

# used in INSTANCE_TEST
set( SI_TEST_COUNTER 0 )

#MACRO INSTANCE_TEST - create a file with one or more instances and test with p21read
#sname is the schema name
#instance is a p21 instance, without the number
#test_mode is PASS or FAIL - whether the test should pass or fail. affects the WILL_FAIL property
MACRO( INSTANCE_TEST sname test_mode instance )
  if( ${test_mode} STREQUAL "PASS" )
    set( _fail "FALSE" )
  elseif( ${test_mode} STREQUAL "FAIL" )
    set( _fail "TRUE" )
  else( )
    message( FATAL_ERROR "** Invalid test_mode passed to INSTANCE_TEST macro: ${test_mode} **" )
  endif( ${test_mode} STREQUAL "PASS" )
  math( EXPR SI_TEST_COUNTER "${SI_TEST_COUNTER}+1" )
  set( test_file "${CMAKE_CURRENT_BINARY_DIR}/${sname}_${SI_TEST_COUNTER}.stp" )
  file( WRITE ${test_file} "${P21_FILE_HEAD}${sname}${P21_FILE_MID}
#${SI_TEST_COUNTER}=${instance}    /* should ${test_mode} */
${P21_FILE_TAIL}" )
  add_test( test_${sname}_${SI_TEST_COUNTER} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/p21read_sdai_${sname} ${test_file} )
  set_tests_properties( test_${sname}_${SI_TEST_COUNTER} PROPERTIES DEPENDS build_cpp_sdai_${sname} LABELS exchange_file WILL_FAIL ${_fail} )
ENDMACRO( INSTANCE_TEST sname test_mode instance )


# test schema names
set( sn_insts "
#1=DRAUGHTING_PRE_DEFINED_COLOUR('green');
#2=COLOUR_RGB('',1.1E-2,1.2E-2,1.E0);
")
set( schema_name_good     "AUTOMOTIVE_DESIGN" )
set( schema_name_good_asn "AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }" )
set( schema_name_mismatch "DOES_NOT_MATCH" )
set( p21read_ap214 "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/p21read_sdai_AP214E3_2010" )
file( WRITE ${CMAKE_CURRENT_BINARY_DIR}/exch_file_good.p21      "${P21_FILE_HEAD}${schema_name_good}${P21_FILE_MID}
${sn_insts}${P21_FILE_TAIL}" )
file( WRITE ${CMAKE_CURRENT_BINARY_DIR}/exch_file_good_asn.p21  "${P21_FILE_HEAD}${schema_name_good_asn}${P21_FILE_MID}
${sn_insts}${P21_FILE_TAIL}" )
file( WRITE ${CMAKE_CURRENT_BINARY_DIR}/exch_file_mismatch.p21  "${P21_FILE_HEAD}${schema_name_mismatch}${P21_FILE_MID}
${sn_insts}${P21_FILE_TAIL}" )

#compare the schema name in a p21 file with than in the sdai lib
add_test( test_good_schema_name      ${p21read_ap214}    ${CMAKE_CURRENT_BINARY_DIR}/exch_file_good.p21 )
add_test( test_good_schema_name_asn  ${p21read_ap214}    ${CMAKE_CURRENT_BINARY_DIR}/exch_file_good_asn.p21 )
add_test( test_mismatch_schema_name  ${p21read_ap214}    ${CMAKE_CURRENT_BINARY_DIR}/exch_file_mismatch.p21 )
add_test( test_ignore_schema_name    ${p21read_ap214} -i ${CMAKE_CURRENT_BINARY_DIR}/exch_file_mismatch.p21 )

#these test for required attrs that are missing
add_test( test_missing_and_required        ${p21read_ap214}    ${CMAKE_CURRENT_SOURCE_DIR}/missing_and_required.p21 )
add_test( test_missing_and_required_strict ${p21read_ap214} -s ${CMAKE_CURRENT_SOURCE_DIR}/missing_and_required.p21 )

#test acceptance of comments within p21 entity, i.e. FILE_NAME( /* name */ 'ferrari sharknose', ...);
add_test( test_p21_entity_internal_comment ${p21read_ap214}    ${CMAKE_CURRENT_SOURCE_DIR}/comments.p21 )

set_tests_properties( test_good_schema_name test_good_schema_name_asn test_mismatch_schema_name
                      test_ignore_schema_name test_missing_and_required test_missing_and_required_strict test_p21_entity_internal_comment
                      PROPERTIES DEPENDS build_cpp_sdai_AP214E3_2010 LABELS exchange_file )

set_tests_properties( test_mismatch_schema_name test_missing_and_required_strict PROPERTIES WILL_FAIL TRUE )

#not sure how multiple schema names should be handled for testing, by p21read, or by the schema and stepeditor libs
#add_test( multi_schema )
#rotator_asm:
# FILE_SCHEMA(('CONFIG_CONTROL_DESIGN', 'GEOMETRIC_VALIDATION_PROPERTIES_MIM','SHAPE_APPEARANCE_LAYER_MIM'));

#check for a segmentation fault with selects. the files are a subset of the 210e3 schema and of SurfaceMountFlasher.stp, respectively
#p21read will report errors with the file, but they don't matter as long as there isn't a segfault.
BUILD_A_SCHEMA(${SC_SOURCE_DIR}/test/misc/select_segfault_210e3.exp)
add_test( test_select_segfault ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/p21read_sdai_select_segfault_210e3
                               ${CMAKE_CURRENT_SOURCE_DIR}/select_segfault_210e3.stp )
set_tests_properties( test_select_segfault PROPERTIES DEPENDS build_cpp_sdai_select_segfault_210e3 LABELS exchange_file WILL_FAIL TRUE )

set( mid "multiple_inheritance_derived" )
#schema for multiple inheritance where two attrs with same name are inherited; one is derived
BUILD_A_SCHEMA(${SC_SOURCE_DIR}/test/unitary_schemas/${mid}.exp)

INSTANCE_TEST( ${mid} PASS "A();"                              )
INSTANCE_TEST( ${mid} FAIL "A(*);"                             )
INSTANCE_TEST( ${mid} PASS "B(.BEE.);"                         )
INSTANCE_TEST( ${mid} FAIL "B();"                              )
INSTANCE_TEST( ${mid} PASS "AB(.BEE.);"                        )
INSTANCE_TEST( ${mid} FAIL "AB(*);"                            )
INSTANCE_TEST( ${mid} PASS "BA(.B.);"                          )
INSTANCE_TEST( ${mid} FAIL "BA(*);"                            )
INSTANCE_TEST( ${mid} PASS "AC();"                             )
INSTANCE_TEST( ${mid} FAIL "AC(3.0);"                          )
INSTANCE_TEST( ${mid} FAIL "AC('ac');"                         )
INSTANCE_TEST( ${mid} PASS "DD(*);"                            )
INSTANCE_TEST( ${mid} FAIL "DD();"                             )
INSTANCE_TEST( ${mid} FAIL "DD(3);"                            )
INSTANCE_TEST( ${mid} PASS "AA(4);"                            )
INSTANCE_TEST( ${mid} FAIL "AA();"                             )
INSTANCE_TEST( ${mid} PASS "BB(.BEE.,4.5);"                    )
INSTANCE_TEST( ${mid} FAIL "BB(4.5);"                          )
INSTANCE_TEST( ${mid} PASS "(A()B(.BEE.)AA(4)BB(4.5)AABB());"  )
INSTANCE_TEST( ${mid} FAIL "(A(*)B(.BEE.)AA(4)BB(4.5)AABB());" )
INSTANCE_TEST( ${mid} FAIL "AABB(.BEE.,4,4.5);"                )
INSTANCE_TEST( ${mid} FAIL "AABB(4,4.5);"                      )
INSTANCE_TEST( ${mid} FAIL "AABB(4,.BEE.,4.5);"                )
INSTANCE_TEST( ${mid} FAIL "AABB();"                           )
INSTANCE_TEST( ${mid} FAIL "AABB('z',2,.B.,1.2);"              )

