From c5aa7d30a9856a5b4c01bc79aa7cbecc0c8ff0f8 Mon Sep 17 00:00:00 2001 From: Izaak Beekman Date: Mon, 22 Jul 2019 17:15:14 -0400 Subject: [PATCH 1/5] TESTING: Use fixtures to copy and cleanup files - Fixes #413 - Also fixes regression testing and output validation --- CMakeLists.txt | 79 ++++++++++++++++++------------ files/expected-outputs/test12.json | 2 +- files/expected-outputs/test2.json | 29 ++++++----- files/expected-outputs/test21.json | 13 +++++ 4 files changed, 79 insertions(+), 44 deletions(-) create mode 100644 files/expected-outputs/test21.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 71962354ff..9f4d132aaf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -274,13 +274,11 @@ if ( ENABLE_TESTS ) find_program ( JSONLINT jsonlint ) find_program ( DIFF diff ) - file ( COPY "${CMAKE_SOURCE_DIR}/files" - DESTINATION "${CMAKE_BINARY_DIR}/" ) - set ( DATA_DIR "${CMAKE_BINARY_DIR}/files" ) + set ( DATA_DIR "${CMAKE_SOURCE_DIR}/files" ) set_directory_properties ( PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES - "${DATA_DIR}/test2.json;${DATA_DIR}/test4.json;${FORD_CLEAN_OUTPUTS}" ) + "${FORD_CLEAN_OUTPUTS}" ) # Validate input if ( JSONLINT ) @@ -294,26 +292,38 @@ if ( ENABLE_TESTS ) foreach ( VALID_JSON ${JSON_INPUTS} ) get_filename_component ( TESTNAME "${VALID_JSON}" NAME ) add_test ( NAME validate-${TESTNAME} - WORKING_DIRECTORY "${DATA_DIR}/inputs" - COMMAND ${JSONLINT} "--allow=nonescape-characters" "${VALID_JSON}" ) + WORKING_DIRECTORY "${DATA_DIR}/inputs" + COMMAND ${JSONLINT} "--allow=nonescape-characters" "${VALID_JSON}" ) endforeach () foreach ( INVALID ${INVALID_JSON} ) get_filename_component ( TESTNAME "${INVALID}" NAME ) add_test ( NAME validate-${TESTNAME} - WORKING_DIRECTORY "${DATA_DIR}/inputs" - COMMAND ${JSONLINT} "${INVALID}" ) + WORKING_DIRECTORY "${DATA_DIR}/inputs" + COMMAND ${JSONLINT} "${INVALID}" ) set_property ( TEST validate-${TESTNAME} - PROPERTY - WILL_FAIL TRUE) + PROPERTY + WILL_FAIL TRUE) endforeach () endif () + add_test(NAME jf-cleanup-fixture + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" + COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_BINARY_DIR}/files") + set_tests_properties(jf-cleanup-fixture + PROPERTIES FIXTURES_SETUP JF) + add_test(NAME jf-setup-fixture + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${DATA_DIR}" "${CMAKE_BINARY_DIR}/files") + set_tests_properties(jf-setup-fixture + PROPERTIES FIXTURES_SETUP JF + DEPENDS jf-cleanup-fixture) + set ( UNIT_TESTS '' ) foreach ( UNIT_TEST ${JF_TEST_SRCS} ) get_filename_component ( TEST ${UNIT_TEST} NAME_WE ) if(MSVC_IDE) - link_directories(${CMAKE_BINARY_DIR}/lib) + link_directories(${CMAKE_BINARY_DIR}/lib) endif() add_executable ( ${TEST} EXCLUDE_FROM_ALL ${UNIT_TEST} ) target_link_libraries ( ${TEST} ${LIB_NAME} ) @@ -325,11 +335,13 @@ if ( ENABLE_TESTS ) add_test( NAME ${TEST} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin COMMAND ./${TEST}) + set_tests_properties( ${TEST} + PROPERTIES FIXTURES_REQUIRED JF) list ( APPEND UNIT_TESTS ${TEST} ) if ( JSONLINT ) set_property ( TEST ${TEST} - APPEND - PROPERTY DEPENDS validate-input1 validate-input2 ) + APPEND + PROPERTY DEPENDS validate-input1 validate-input2 ) endif() endforeach ( UNIT_TEST ) @@ -338,34 +350,37 @@ if ( ENABLE_TESTS ) PROPERTY DEPENDS jf_test_02 ) # Validate output + file( GLOB EXPECTED_OUTPUTS "${DATA_DIR}/expected-outputs/*.json") + if (NOT ${ENABLE_UNICODE}) + list( REMOVE_ITEM EXPECTED_OUTPUTS "${DATA_DIR}/expected-outputs/hello-world-ucs4.json") + endif() + list( REMOVE_ITEM EXPECTED_OUTPUTS "${DATA_DIR}/expected-outputs/example2.json") + if ( JSONLINT ) - file ( GLOB JSON_FILES "${DATA_DIR}/*.json" ) - foreach ( JSON_FILE ${JSON_FILES} ) + foreach ( JSON_FILE ${EXPECTED_OUTPUTS} ) get_filename_component ( TESTNAME ${JSON_FILE} NAME ) add_test ( NAME validate-output-${TESTNAME} - WORKING_DIRECTORY "${DATA_DIR}" - COMMAND ${JSONLINT} "--allow=nonescape-characters" ${TESTNAME} ) + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/files" + COMMAND ${JSONLINT} "--allow=nonescape-characters" ${TESTNAME} ) set_property ( TEST validate-output-${TESTNAME} - APPEND - PROPERTY - DEPENDS ${UNIT_TESTS} - REQUIRED_FILES ${JSON_FILES} ) + APPEND + PROPERTY + DEPENDS ${UNIT_TESTS}) endforeach ( JSON_FILE ) endif () # Check output for differences if ( DIFF ) - file ( GLOB JSON_FILES "${DATA_DIR}/*.json" ) - foreach ( JSON_FILE ${JSON_FILES} ) - get_filename_component ( JSON_STEM ${JSON_FILE} NAME_WE ) - add_test ( NAME regression-${JSON_STEM}.json - WORKING_DIRECTORY "${DATA_DIR}" - COMMAND ${DIFF} -q ${JSON_STEM}.json expected-outputs/${JSON_STEM}.json ) - set_property ( TEST regression-${JSON_STEM}.json - APPEND - PROPERTY - DEPENDS ${UNIT_TESTS} - REQUIRED_FILES ${JSON_FILES} ) + foreach ( JSON_FILE ${EXPECTED_OUTPUTS} ) + get_filename_component (OUTPUT ${JSON_FILE} NAME ) + add_test ( NAME regression-${OUTPUT} + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/files" + COMMAND ${DIFF} -q ${OUTPUT} expected-outputs/${OUTPUT} ) + set_property ( TEST regression-${OUTPUT} + APPEND + PROPERTY + DEPENDS ${UNIT_TESTS} + REQUIRED_FILES ${EXPECTED_OUTPUTS} ) endforeach ( JSON_FILE ) else () message ( WARNING diff --git a/files/expected-outputs/test12.json b/files/expected-outputs/test12.json index 216d41cc12..c54cb9ebe8 100644 --- a/files/expected-outputs/test12.json +++ b/files/expected-outputs/test12.json @@ -85,7 +85,7 @@ "only one value" ], "page": [ - "The quick brown fox", + "The quick brown fox ", "jumps over the lazy dog." ] } diff --git a/files/expected-outputs/test2.json b/files/expected-outputs/test2.json index 871439c3fc..e3e414bdbb 100644 --- a/files/expected-outputs/test2.json +++ b/files/expected-outputs/test2.json @@ -1,7 +1,7 @@ { "inputs": { - "t0": 0.1E+0, - "tf": 0.11E+1, + "t0": 0.10000000000000001E+0, + "tf": 0.11000000000000001E+1, "x0": 0.9999E+4, "integer_scalar": 1, "integer_array": [ @@ -20,7 +20,14 @@ false, true ], - "null_variable": null + "null_variable": null, + "special chars": "\\ /", + "special chars in key \\ /": "\\ /", + "bspace": "\b", + "horizontal_tab": "\t", + "newline": "\n", + "formfeed": "\f", + "carriage_return": "\r" }, "trajectory": [ { @@ -58,35 +65,35 @@ }, { "VARIABLE": "Vx", - "UNITS": "km\/s", + "UNITS": "km/s", "FRAME": "J2000", "CENTER": "EARTH", "DATA": [ 0.1E-2, 0.2E-2, - 0.3E-2 + 0.30000000000000001E-2 ] }, { "VARIABLE": "Vy", - "UNITS": "km\/s", + "UNITS": "km/s", "FRAME": "J2000", "CENTER": "EARTH", "DATA": [ 0.2E-2, 0.2E-1, - 0.3E-2 + 0.30000000000000001E-2 ] }, { "VARIABLE": "Vz", - "UNITS": "km\/s", + "UNITS": "km/s", "FRAME": "J2000", "CENTER": "EARTH", "DATA": [ - 0.3E-2, - 0.3E-1, - 0.4E-1 + 0.30000000000000001E-2, + 0.29999999999999999E-1, + 0.40000000000000001E-1 ] } ] diff --git a/files/expected-outputs/test21.json b/files/expected-outputs/test21.json new file mode 100644 index 0000000000..2aadc9ccd9 --- /dev/null +++ b/files/expected-outputs/test21.json @@ -0,0 +1,13 @@ +{ + "value": [ + 0.14142135623730951E+1, + 0.17320508075688772E+1, + 0.26457513110645907E+1, + 0.14142135623730951E+3, + 0.54772255750516615E+3, + 0.26457513110645905E+4, + 0.17976931348623157E+309, + 0.22250738585072014E-307, + 0.22204460492503131E-15 + ] +} From 7693a303d817a1c0a0ca2d0a3bfda453519cafb9 Mon Sep 17 00:00:00 2001 From: Izaak Beekman Date: Mon, 22 Jul 2019 17:44:35 -0400 Subject: [PATCH 2/5] Travis-CI: Install jsonlint from node/npm --- .travis.yml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5065285887..9d3e444dd9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,6 +23,8 @@ matrix: - kalakris-cmake - ubuntu-toolchain-r-test packages: + - nodejs + - npm - gfortran-6 - binutils - cmake @@ -44,6 +46,8 @@ matrix: sources: - ubuntu-toolchain-r-test packages: + - nodejs + - npm - gfortran-6 - binutils - python-pip @@ -64,6 +68,8 @@ matrix: sources: - ubuntu-toolchain-r-test packages: + - nodejs + - npm - gfortran-7 - binutils - python-pip @@ -82,6 +88,8 @@ matrix: sources: - ubuntu-toolchain-r-test packages: + - nodejs + - npm - gfortran-8 - binutils - python-pip @@ -100,6 +108,8 @@ matrix: sources: - ubuntu-toolchain-r-test packages: + - nodejs + - npm - gfortran-9 - binutils - python-pip @@ -126,7 +136,12 @@ install: - pip install --upgrade graphviz - (pip install --upgrade FoBiS.py==2.2.8 && FoBiS.py --version) - (pip install --upgrade ford==6.0.0 && ford --version) - - (pip install --upgrade git+https://github.com/dmeranda/demjson.git && jsonlint --version) + - export NPM_PACKAGES="${HOME}/.npm-packages" + - mkdir "${HOME}/.npm-packages" || true + - npm config set prefix "${HOME}/.npm-packages" + - export PATH="${HOME}/.npm-packages/bin:$PATH" + - npm install -g jsonlint + - jsonlint --version || true # Why would you exit non-zero from --version ???!?!?! wth before_script: - | From 42e731a4fdc4467e2c173a2c73a36683d46b7463 Mon Sep 17 00:00:00 2001 From: Izaak Beekman Date: Mon, 22 Jul 2019 17:45:49 -0400 Subject: [PATCH 3/5] CMake: Don't rely on diff for testing --- CMakeLists.txt | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f4d132aaf..b30d281601 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -273,7 +273,6 @@ if ( ENABLE_TESTS ) add_dependencies(build_tests ${LIB_NAME} ${LIB_NAME}-static) find_program ( JSONLINT jsonlint ) - find_program ( DIFF diff ) set ( DATA_DIR "${CMAKE_SOURCE_DIR}/files" ) @@ -370,22 +369,22 @@ if ( ENABLE_TESTS ) endif () # Check output for differences - if ( DIFF ) - foreach ( JSON_FILE ${EXPECTED_OUTPUTS} ) - get_filename_component (OUTPUT ${JSON_FILE} NAME ) - add_test ( NAME regression-${OUTPUT} - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/files" - COMMAND ${DIFF} -q ${OUTPUT} expected-outputs/${OUTPUT} ) - set_property ( TEST regression-${OUTPUT} - APPEND - PROPERTY - DEPENDS ${UNIT_TESTS} - REQUIRED_FILES ${EXPECTED_OUTPUTS} ) - endforeach ( JSON_FILE ) - else () - message ( WARNING - "For full test coverage diff, or a similar tool must be present on your system" ) - endif () + if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.14) + set( JSON_FORTRAN_COMPARE_FLAG "--ignore-eol") + endif() + + foreach ( JSON_FILE ${EXPECTED_OUTPUTS} ) + get_filename_component (OUTPUT ${JSON_FILE} NAME ) + add_test ( NAME regression-${OUTPUT} + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/files" + COMMAND ${CMAKE_COMMAND} -E compare_files ${JSON_FORTRAN_COMPARE_FLAG} ${OUTPUT} expected-outputs/${OUTPUT} ) + set_property ( TEST regression-${OUTPUT} + APPEND + PROPERTY + DEPENDS ${UNIT_TESTS} + REQUIRED_FILES ${EXPECTED_OUTPUTS} ) + endforeach ( JSON_FILE ) + endif () From 789e75593635e2bde558aefb02fbbd78f48c8259 Mon Sep 17 00:00:00 2001 From: Izaak Beekman Date: Mon, 22 Jul 2019 17:16:24 -0400 Subject: [PATCH 4/5] Add a config option to compile & link against OC - Passing `-fcoarray=lib` to gfortran causes the compiler to generate different modules & symbols. This is likely a bug in gfortran, but, a consequence is that you need to build libraries you link to with the same `-fcoarray=...` flag. --- CMakeLists.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index b30d281601..802ff6666c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,6 +36,14 @@ include ( "cmake/checkOutOfSource.cmake" ) #--------------------- project ( jsonfortran NONE ) +if(CMAKE_Fortran_COMPILER_ID STREQUAL GNU) + option(JSON_FORTRAN_USE_OpenCoarrays + "Build JSON-Fortran with support for linking against OpenCoarray programs" OFF) +endif() +if(JSON_FORTRAN_USE_OpenCoarrays) + find_package(OpenCoarrays) +endif() + #--------------------- # Real and Integer kinds #--------------------- @@ -161,6 +169,14 @@ endif () set ( LIB_NAME ${CMAKE_PROJECT_NAME} ) add_library ( ${LIB_NAME} SHARED ${JF_LIB_SRCS} ) add_library ( ${LIB_NAME}-static STATIC ${JF_LIB_SRCS} ) + +if(JSON_FORTRAN_USE_OpenCoarrays) + target_link_libraries(${LIB_NAME} + PRIVATE OpenCoarrays::caf_mpi_static) + target_link_libraries(${LIB_NAME}-static + PRIVATE OpenCoarrays::caf_mpi_static) +endif() + set_target_properties ( ${LIB_NAME}-static PROPERTIES OUTPUT_NAME ${LIB_NAME} From a7e7978175cede79420f6a792bc544bb71334edd Mon Sep 17 00:00:00 2001 From: Izaak Beekman Date: Tue, 23 Jul 2019 12:56:43 -0400 Subject: [PATCH 5/5] CHANGELOG: Add entry/comment about OpenCoarrays --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3ce280d90..be1a4474d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,15 @@ [Complete Changeset](https://github.com/jacobwilliams/json-fortran/compare/7.1.0...HEAD) +**Enhancements:** + +- Allow linking to JSON-Fortran from GFortran programs using + [OpenCoarrays](https://github.com/sourceryinstitute/OpenCoarrays#readme) + as the coarray runtime implementation. Use the + `-DJSON_FORTRAN_USE_OpenCoarrays:BOOL=ON` option to cmake to enable + this. (NOTE: The fact that this is required may be a bug in + GFortran.) + ### [7.1.0](https://github.com/jacobwilliams/json-fortran/tree/7.1.0) (2019-06-23) [Complete Changeset](https://github.com/jacobwilliams/json-fortran/compare/7.0.0...7.1.0)