diff --git a/CMakeLists.txt b/CMakeLists.txt index 5fd50b44b..f8241f109 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,372 +1,372 @@ project(labplot2) # minimum 3.2.0 for FindGSL.cmake cmake_minimum_required (VERSION 3.2.0 FATAL_ERROR) set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(QT_MINIMUM_VERSION 5.6.0) set(KF5_MIN_VERSION "5.16.0") set(APPLE_SUPPRESS_X11_WARNING ON) find_package(ECM 1.3.0 REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/ ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}) # build type: "release", "debug", "debugfull" string (TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE) find_package(Qt5 ${QT_MIN_VERSION} NO_MODULE REQUIRED COMPONENTS Concurrent Gui PrintSupport Sql Svg Widgets Test SerialPort ) find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS Archive Completion Config ConfigWidgets CoreAddons Crash DocTools I18n IconThemes KIO TextWidgets WidgetsAddons XmlGui OPTIONAL_COMPONENTS NewStuff Service Parts SyntaxHighlighting ) IF (Qt5SerialPort_FOUND) MESSAGE (STATUS "Found Qt5 SerialPort") ELSE () MESSAGE (STATUS "Qt5 SerialPort not found") ENDIF () IF (KF5NewStuff_FOUND) MESSAGE (STATUS "Found KF5 new stuff") add_definitions (-DHAVE_KF5_NEW_STUFF) ELSE () MESSAGE (STATUS "KF5 new stuff not found") ENDIF () IF (KF5SyntaxHighlighting_FOUND) MESSAGE (STATUS "Found KF5 syntax highlighting") add_definitions (-DHAVE_KF5_SYNTAX_HIGHLIGHTING) ELSE () MESSAGE (STATUS "KF5 syntax highlighting not found") ENDIF () find_package(BISON REQUIRED) include(FeatureSummary) include(ECMAddAppIcon) include(ECMInstallIcons) include(KDEInstallDirs) include(KDECompilerSettings) include(KDECMakeSettings) ### compiler flags ###################################### set (GENERIC_FLAGS "-Wall -Wextra -Wundef -Wpointer-arith -Wunreachable-code -Wunused -Wdeprecated-declarations -fno-omit-frame-pointer -fstack-protector") set (GENERIC_GNU_FLAGS "-O2 -Wcast-align -Wswitch-enum -fvisibility=default") set (GENERIC_C_FLAGS "${GENERIC_FLAGS} -fno-exceptions") # liborigin needs exceptions set (GENERIC_CXX_FLAGS "${GENERIC_FLAGS} -fexceptions") if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU") message(STATUS "GNU C compiler detected, adding compile flags") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GENERIC_C_FLAGS} ${GENERIC_GNU_FLAGS}") elseif ("${CMAKE_C_COMPILER_ID}" MATCHES "Clang") message(STATUS "Clang C compiler detected, adding compile flags") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_GNU_SOURCE ${GENERIC_C_FLAGS} ${GENERIC_GNU_FLAGS}") elseif ("${CMAKE_C_COMPILER_ID}" MATCHES "Intel") message(STATUS "Intel C compiler detected, adding compile flags") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_GNU_SOURCE -O3 ${GENERIC_C_FLAGS}") elseif ("${CMAKE_C_COMPILER_ID}" MATCHES "PGI") message(STATUS "PGI C compiler detected, adding compile flags") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_GNU_SOURCE -O3 -D__GCC_ATOMIC_TEST_AND_SET_TRUEVAL=1 -Minform=inform -Mbounds -Mchkstk") # " x" postfix to work around a bug in CMake that causes "MSVC" to translate to something completely different elseif (("${CMAKE_C_COMPILER_ID} x" MATCHES "MSVC") OR MSVC) message(STATUS "MSVC C compiler detected, adding compile flags") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -W3") set(MSVC_FOUND TRUE) else () message(STATUS "UNKNOWN C compiler, adding compile flags") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GENERIC_C_FLAGS}") endif() if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") message(STATUS "GNU C++ compiler detected, adding compile flags") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GENERIC_CXX_FLAGS} ${GENERIC_GNU_FLAGS}") elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") message(STATUS "Clang C++ compiler detected, adding compile flags") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GNU_SOURCE ${GENERIC_CXX_FLAGS} ${GENERIC_GNU_FLAGS}") elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Intel") message(STATUS "Intel C++ compiler detected, adding compile flags") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GNU_SOURCE -std=c++11 ${GENERIC_CXX_FLAGS}") #-std=c++0x comes with cmake's general flags, deprecated in icc, remove it string(REPLACE "-std=c++0x" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "PGI") message(STATUS "PGI C++ compiler detected, adding compile flags") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GNU_SOURCE -O3 -std=c++11 -D__GCC_ATOMIC_TEST_AND_SET_TRUEVAL=1 -Minform=inform -Mbounds -Mchkstk") # " x" postfix to work around a bug in CMake that causes "MSVC" to translate to something completely different elseif (("${CMAKE_CXX_COMPILER_ID} x" MATCHES "MSVC") OR MSVC) message(STATUS "MSVC C++ compiler detected, adding compile flags") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -W3 -DPSAPI_VERSION=1") set(MSVC_FOUND TRUE) else () message(STATUS "UNKNOWN C++ compiler, adding compile flags") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GENERIC_CXX_FLAGS}") endif () ##########################################################ESC[m add_definitions (${QT_DEFINITIONS} ${QT_QTDBUS_DEFINITIONS}) include_directories (${QDBUS_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR}) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) add_definitions (-DLVERSION=\"2.7.0\") # add_definitions (-DLDEBUG='1') set(BUILD_SHARED_LIBS true) #cmake_policy(SET CMP0002 OLD) IF (CMAKE_VERSION VERSION_EQUAL "3.3" OR CMAKE_VERSION VERSION_GREATER "3.3") cmake_policy(SET CMP0063 NEW) ENDIF() if (CMAKE_VERSION VERSION_GREATER "3.5") set(ENABLE_CLANG_TIDY OFF CACHE BOOL "Add clang-tidy automatically to builds") if (ENABLE_CLANG_TIDY) find_program (CLANG_TIDY_EXE NAMES "clang-tidy" PATHS /usr/bin) if (CLANG_TIDY_EXE) message(STATUS "Clang-tidy supported, found and enabled: ${CLANG_TIDY_EXE}") - #set(CLANG_TIDY_CHECKS "-*,modernize-*,clang-analyzer-*,-clang-analyzer-cplusplus*") - set(CLANG_TIDY_CHECKS "modernize-*,clang-analyzer-*") + set(CLANG_TIDY_CHECKS "modernize-*,clang-analyzer-*,-clang-analyzer-cplusplus*") + #set(CLANG_TIDY_CHECKS "-*,modernize-*,clang-analyzer-*") # -extra-arg=--std=c++11 set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_EXE};-checks=${CLANG_TIDY_CHECKS};-header-filter='${CMAKE_SOURCE_DIR}/*'" CACHE STRING "" FORCE) else() message(AUTHOR_WARNING "clang-tidy not found!") set(CMAKE_CXX_CLANG_TIDY "" CACHE STRING "" FORCE) # delete it endif() else() message(STATUS "Clang-tidy supported but disabled") endif() endif() ### Options ###################################### option(ENABLE_CANTOR "Build with Cantor support" ON) option(ENABLE_FFTW "Build with FFTW support" ON) option(ENABLE_HDF5 "Build with HDF5 support" ON) option(ENABLE_NETCDF "Build with NetCDF support" ON) option(ENABLE_FITS "Build with FITS support" ON) option(ENABLE_LIBCERF "Build with libcerf support" ON) option(ENABLE_LIBORIGIN "Build with liborigin support" ON) option(ENABLE_ROOT "Build with ROOT (CERN) support" ON) option(ENABLE_TESTS "Build with tests" ON) option(ENABLE_MQTT "Build with MQTT support" ON) ### OS macros #################################### IF (WIN32) add_definitions (-DHAVE_WINDOWS) find_library (PSAPI Psapi) message (STATUS "PSAPI: ${PSAPI}") ENDIF () ### GSL (required) ############################### FIND_PACKAGE(GSL REQUIRED) ### liborigin (included) ############################### IF (ENABLE_LIBORIGIN) add_definitions (-DHAVE_LIBORIGIN) IF (CMAKE_BUILD_TYPE STREQUAL "debug" OR CMAKE_BUILD_TYPE STREQUAL "debugfull") MESSAGE (STATUS "Origin project import (through internal liborigin) enabled (parser logging enabled)") SET (ENABLE_ORIGIN_PARSER_LOG TRUE) ELSE () MESSAGE (STATUS "Origin project import (through internal liborigin) enabled (parser logging disabled)") ENDIF () ELSE () MESSAGE (STATUS "Origin project import DISABLED") ENDIF () ### Cantorlibs (optional) ############################### IF (ENABLE_CANTOR) FIND_PACKAGE (Cantor) SET_PACKAGE_PROPERTIES(Cantor PROPERTIES URL "https://edu.kde.org/cantor/" ) IF (Cantor_FOUND) MESSAGE (STATUS "Found Cantor Library") add_definitions (-DHAVE_CANTOR_LIBS) IF (NOT ${Cantor_VERSION} VERSION_GREATER "0") add_definitions (-DOLD_CANTORLIBS_VERSION) ENDIF() IF (${Cantor_VERSION} VERSION_GREATER "19.08") FIND_PACKAGE(Poppler "0.62.0" REQUIRED COMPONENTS Qt5) ENDIF() ELSE () MESSAGE (STATUS "Cantor Library NOT FOUND") ENDIF () ELSE () MESSAGE (STATUS "Cantor Library DISABLED") ENDIF () ### FFTW (optional) ##################################### IF (ENABLE_FFTW) FIND_PACKAGE (FFTW3) IF (FFTW3_FOUND) add_definitions (-DHAVE_FFTW3) ELSE () MESSAGE (STATUS "FFTW 3 Library NOT FOUND") ENDIF () ELSE () MESSAGE (STATUS "FFTW 3 Library DISABLED") ENDIF () ### HDF5 (optional) ############################## IF (ENABLE_HDF5) FIND_PACKAGE(HDF5 COMPONENTS C) SET_PACKAGE_PROPERTIES (HDF5 PROPERTIES DESCRIPTION "Reading and writing self describing array data" URL "https://www.hdfgroup.org/solutions/hdf5/" ) IF (HDF5_FOUND) add_definitions (-DHAVE_HDF5) IF (HDF5_VERSION VERSION_GREATER "1.9") add_definitions (-DHAVE_AT_LEAST_HDF5_1_10_0) ENDIF () IF (HDF5_VERSION VERSION_GREATER "1.10.0.1") add_definitions (-DHAVE_AT_LEAST_HDF5_1_10_0) add_definitions (-DHAVE_AT_LEAST_HDF5_1_10_1) ENDIF () include_directories (${HDF5_INCLUDE_DIRS}) ELSE () MESSAGE (STATUS "Hierarchical Data Format (HDF5) Library NOT FOUND") ENDIF () ELSE () MESSAGE (STATUS "Hierarchical Data Format (HDF5) Library DISABLED") ENDIF () ### NETCDF (optional) ############################# IF (ENABLE_NETCDF) FIND_PACKAGE(netCDF) SET_PACKAGE_PROPERTIES(netCDF PROPERTIES DESCRIPTION "Interfaces for array-oriented data access" URL "https://www.unidata.ucar.edu/software/netcdf/" ) IF (netCDF_FOUND) add_definitions (-DHAVE_NETCDF) ELSE () MESSAGE (STATUS "Network Common Data Format (NetCDF) Library NOT FOUND") ENDIF () ELSE () MESSAGE (STATUS "Network Common Data Format (NetCDF) Library DISABLED") ENDIF () ### MQTT (optional) ############################### IF (ENABLE_MQTT) # ATTENTION: unit test uses qWaitFor() which needs Qt >= 5.10 # avoid warning for the moment using QUIET find_package(Qt5Mqtt ${QT_MIN_VERSION} QUIET NO_MODULE) IF (Qt5Mqtt_FOUND) MESSAGE (STATUS "Found MQTT Library") add_definitions (-DHAVE_MQTT) ELSE () MESSAGE (STATUS "MQTT Library NOT FOUND") ENDIF () ELSE () MESSAGE (STATUS "MQTT Library DISABLED") ENDIF () ### FITS (optional) ############################### IF (ENABLE_FITS) FIND_PACKAGE (CFitsio) SET_PACKAGE_PROPERTIES (CFitsio PROPERTIES DESCRIPTION "FITS IO Library" URL "http://heasarc.gsfc.nasa.gov/fitsio/fitsio.html" PURPOSE "Support for the FITS (Flexible Image Transport System) data format.") IF (CFITSIO_FOUND) add_definitions (-DHAVE_FITS) include_directories (${CFITSIO_INCLUDE_DIR}) ELSE () MESSAGE (STATUS "Flexible Image Transport System Data Format (FITS) Library NOT FOUND") ENDIF () ELSE () MESSAGE (STATUS "Flexible Image Transport System Data Format (FITS) Library DISABLED") ENDIF () ### LIBCERF (optional) ############################# IF (ENABLE_LIBCERF) FIND_PACKAGE (LIBCERF) IF (LIBCERF_FOUND) add_definitions (-DHAVE_LIBCERF) ELSE () MESSAGE (STATUS "libcerf library NOT FOUND") ENDIF () ELSE () MESSAGE (STATUS "libcerf library DISABLED") ENDIF () IF (ENABLE_ROOT) FIND_PACKAGE(ZLIB) SET_PACKAGE_PROPERTIES (ZLIB PROPERTIES DESCRIPTION "General purpose compression library" URL "https://www.zlib.net/" ) FIND_PACKAGE(LZ4) IF (ZLIB_FOUND AND LZ4_FOUND) MESSAGE (STATUS "Found ZIP libraries ZLIB and LZ4 (needed for ROOT importer)") add_definitions (-DHAVE_ZIP) ELSE () MESSAGE (STATUS "ZIP libraries ZLIB and LZ4 (needed for ROOT importer) NOT FOUND") ENDIF () ELSE () MESSAGE (STATUS "ROOT (CERN) importer DISABLED") ENDIF () ################################################# include(CheckFunctionExists) CHECK_FUNCTION_EXISTS(random HAVE_RANDOM_FUNCTION) ################################################# FIND_PATH (XLOCALE_INCLUDE_DIR xlocale.h /usr/include /usr/local/include ) IF (XLOCALE_INCLUDE_DIR) add_definitions (-DHAVE_XLOCALE) include_directories (${XLOCALE_INCLUDE_DIR}) ENDIF() add_subdirectory(data) add_subdirectory(icons) add_subdirectory(src) add_subdirectory(doc) IF (ENABLE_LIBORIGIN) add_subdirectory(liborigin) ENDIF () if (ENABLE_TESTS) enable_testing(true) add_subdirectory(tests) endif() install(FILES org.kde.labplot2.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR}) feature_summary(WHAT ALL) find_package(KF5I18n CONFIG REQUIRED) ki18n_install(po) find_package(KF5DocTools CONFIG REQUIRED) kdoctools_install(po) diff --git a/tests/import_export/project/ProjectImportTest.cpp b/tests/import_export/project/ProjectImportTest.cpp index 10a23da83..6c8ed58d1 100755 --- a/tests/import_export/project/ProjectImportTest.cpp +++ b/tests/import_export/project/ProjectImportTest.cpp @@ -1,383 +1,414 @@ /*************************************************************************** File : ProjectImportTest.cpp Project : LabPlot Description : Tests for project imports -------------------------------------------------------------------- Copyright : (C) 2018 Alexander Semke (alexander.semke@web.de) ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, * * Boston, MA 02110-1301 USA * * * ***************************************************************************/ #include "ProjectImportTest.h" #ifdef HAVE_LIBORIGIN #include "backend/datasources/projects/OriginProjectParser.h" #endif #include "backend/core/Project.h" #include "backend/core/Workbook.h" #include "backend/matrix/Matrix.h" #include "backend/worksheet/Worksheet.h" #include "backend/worksheet/plots/cartesian/CartesianPlot.h" #include "backend/spreadsheet/Spreadsheet.h" void ProjectImportTest::initTestCase() { const QString currentDir = __FILE__; m_dataDir = currentDir.left(currentDir.lastIndexOf(QDir::separator())) + QDir::separator() + QLatin1String("data") + QDir::separator(); // needed in order to have the signals triggered by SignallingUndoCommand, see LabPlot.cpp //TODO: redesign/remove this qRegisterMetaType("const AbstractAspect*"); qRegisterMetaType("const AbstractColumn*"); } //############################################################################## //##################### import of LabPlot projects ############################ //############################################################################## #ifdef HAVE_LIBORIGIN //############################################################################## //###################### import of Origin projects ############################ //############################################################################## //project tree of the file "origin8_test_tree_import.opj" /* test_tree_import\ \Book3 \Folder \Book2 \Sheet1 \Sheet2 \MBook2 \MSheet1 \MSheet2 \Folder1 \MBook1 \Sheet1 \Book1 \Sheet1 \Book4 \MSheet1 \Graph2 \Excel1 */ void ProjectImportTest::testOrigin01() { //import the opj file into LabPlot's project object OriginProjectParser parser; parser.setProjectFileName(m_dataDir + QLatin1String("origin8_test_tree_import.opj")); Project project; parser.importTo(&project, QStringList()); //check the project tree for the imported project //first child of the root folder, spreadsheet "Book3" auto* aspect = project.child(0); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Book3")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Book3")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); //first child of the root folder, folder "Folder" -> import into a Folder aspect = project.child(1); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Folder")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Folder")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); //first child of "Folder", workbook "Book2" with two sheets -> import into a Workbook with two Spreadsheets aspect = project.child(1)->child(0); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Book2")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Book2")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); aspect = project.child(1)->child(0)->child(0); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Sheet1")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Sheet1")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); aspect = project.child(1)->child(0)->child(1); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Sheet2")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Sheet2")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); //second child of "Folder", matrixbook "MBook" with two matrix sheets -> import into a Workbook with two Matrices aspect = project.child(1)->child(1); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("MBook2")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("MBook2")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); aspect = project.child(1)->child(1)->child(0); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("MSheet1")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("MSheet1")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); aspect = project.child(1)->child(1)->child(1); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("MSheet2")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("MSheet2")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); //second child of the root folder, folder "Folder1" -> import into a Folder aspect = project.child(2); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Folder1")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Folder1")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); //first child of "Folder1", matrix "MBook1" aspect = project.child(2)->child(0); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("MBook1")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("MBook1")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); //second child of "Folder1", workbook "Book1" with on sheet -> import into a Spreadsheet aspect = project.child(2)->child(1); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Book1")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Book1")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); //second child of "Folder1", workbook "Book4" with on sheet -> import into a Spreadsheet aspect = project.child(2)->child(2); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Book4")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Book4")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); //third child of "Folder1", graph "Graph"-> import into a Worksheet aspect = project.child(2)->child(3); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Graph2")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Graph2")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); //TODO: check the created plot in the worksheet // TODO: loose window: spreadsheet "Excel1" //aspect = project.child(3); //QCOMPARE(aspect != nullptr, true); //QCOMPARE(aspect->name(), QLatin1String("Excel1")); //QCOMPARE(dynamic_cast(aspect) != nullptr, true); } /* * import one single folder child */ void ProjectImportTest::testOrigin02() { //import one single object OriginProjectParser parser; parser.setProjectFileName(m_dataDir + QLatin1String("origin8_test_tree_import.opj")); Project project; QStringList selectedPathes = {QLatin1String("test_tree_import/Folder1/Book1"), QLatin1String("test_tree_import/Folder1"), QLatin1String("test_tree_import")}; parser.importTo(&project, selectedPathes); //check the project tree for the imported project //first child of the root folder, folder "Folder1" -> import into a Folder auto* aspect = project.child(0); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Folder1")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Folder1")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); - QCOMPARE(aspect->childCount(), 1); + if (aspect != nullptr) + QCOMPARE(aspect->childCount(), 1); //first child of "Folder", workbook "Book" with one sheet -> import into a Spreadsheet aspect = project.child(0)->child(0); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Book1")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Book1")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); } /* * 1. import one single folder child * 2. import another folder child * 3. check that both children are available after the second import */ void ProjectImportTest::testOrigin03() { //import one single object OriginProjectParser parser; parser.setProjectFileName(m_dataDir + QLatin1String("origin8_test_tree_import.opj")); Project project; //import one single child in "Folder1" QStringList selectedPathes = {QLatin1String("test_tree_import/Folder1/Book1"), QLatin1String("test_tree_import/Folder1"), QLatin1String("test_tree_import")}; parser.importTo(&project, selectedPathes); //first child of the root folder, folder "Folder1" -> import into a Folder auto* aspect = project.child(0); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Folder1")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Folder1")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); - QCOMPARE(aspect->childCount(), 1); + if (aspect != nullptr) + QCOMPARE(aspect->childCount(), 1); //first child of "Folder", workbook "Book1" with one sheet -> import into a Spreadsheet aspect = project.child(0)->child(0); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Book1")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Book1")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); //import another child in "Folder1" selectedPathes.clear(); selectedPathes << QLatin1String("test_tree_import/Folder1/Book4") << QLatin1String("test_tree_import/Folder1") << QLatin1String("test_tree_import"); parser.importTo(&project, selectedPathes); //the first child should still be available in the project -> check it aspect = project.child(0); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Folder1")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Folder1")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); aspect = project.child(0)->child(0); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Book1")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Book1")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); //check the second child, workbook "Book4" with one sheet -> import into a Spreadsheet aspect = project.child(0)->child(1); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Book4")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Book4")); QCOMPARE(dynamic_cast(aspect) != nullptr, true); - QCOMPARE(aspect->childCount(), 2); + if (aspect != nullptr) + QCOMPARE(aspect->childCount(), 2); } /* * 1. import a spreadsheet * 2. modify a cell in it * 3. import the same spreadsheet once more * 4. check that the changes were really over-written */ void ProjectImportTest::testOrigin04() { OriginProjectParser parser; parser.setProjectFileName(m_dataDir + QLatin1String("origin8_test_tree_import.opj")); Project project; //import "Book1" QStringList selectedPathes = {QLatin1String("test_tree_import/Folder1/Book1"), QLatin1String("test_tree_import/Folder1"), QLatin1String("test_tree_import")}; parser.importTo(&project, selectedPathes); //first child of folder "Folder1", workbook "Book1" with one sheet -> import into a spreadsheet auto* aspect = project.child(0); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Folder1")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Folder1")); aspect = project.child(0)->child(0); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Book1")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Book1")); auto* spreadsheet = dynamic_cast(aspect); QCOMPARE(spreadsheet != nullptr, true); //the (0,0)-cell has the value 1.0 - QCOMPARE(spreadsheet->column(0)->valueAt(0), 1.0); + if (spreadsheet != nullptr) + QCOMPARE(spreadsheet->column(0)->valueAt(0), 1.0); //set the value to 5.0 spreadsheet->column(0)->setValueAt(0, 5.0); QCOMPARE(spreadsheet->column(0)->valueAt(0), 5.0); //re-import parser.importTo(&project, selectedPathes); //check the folder structure and the value of the (0,0)-cell again aspect = project.child(0)->child(0); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Book1")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Book1")); spreadsheet = dynamic_cast(aspect); QCOMPARE(spreadsheet != nullptr, true); - QCOMPARE(spreadsheet->column(0)->valueAt(0), 1.0); + if (spreadsheet != nullptr) + QCOMPARE(spreadsheet->column(0)->valueAt(0), 1.0); } void ProjectImportTest::testOriginTextNumericColumns() { OriginProjectParser parser; parser.setProjectFileName(m_dataDir + QLatin1String("origin8_test_workbook.opj")); Project project; //import "Book1" QStringList selectedPathes = {QLatin1String("origin8_test_workbook/Folder1/Book1"), QLatin1String("origin8_test_workbook/Folder1"), QLatin1String("origin8_test_workbook")}; parser.importTo(&project, selectedPathes); //first child of folder "Folder1", workbook "Book1" with one sheet -> import into a spreadsheet auto* aspect = project.child(0); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Folder1")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Folder1")); aspect = project.child(0)->child(0); QCOMPARE(aspect != nullptr, true); - QCOMPARE(aspect->name(), QLatin1String("Book1")); + if (aspect != nullptr) + QCOMPARE(aspect->name(), QLatin1String("Book1")); auto* spreadsheet = dynamic_cast(aspect); QCOMPARE(spreadsheet != nullptr, true); //check the values in the imported columns - QCOMPARE(spreadsheet->columnCount(), 6); + if (spreadsheet != nullptr) + QCOMPARE(spreadsheet->columnCount(), 6); //1st column, Origin::TextNumeric: //first non-empty value is numerical, column is set to Numeric, empty or text values in the column a set to NAN Column* column = spreadsheet->column(0); QCOMPARE(column->columnMode(), AbstractColumn::Numeric); QCOMPARE(!std::isnan(column->valueAt(0)), false); QCOMPARE(column->valueAt(1), 1.1); QCOMPARE(column->valueAt(2), 2.2); QCOMPARE(!std::isnan(column->valueAt(3)), false); QCOMPARE(!std::isnan(column->valueAt(4)), false); //2nd column, Origin::TextNumeric: //first non-empty value is string, the column is set to Text, numerical values are converted to strings column = spreadsheet->column(1); QCOMPARE(column->columnMode(), AbstractColumn::Text); QCOMPARE(column->textAt(0).isEmpty(), true); QCOMPARE(column->textAt(1), QLatin1String("a")); QCOMPARE(column->textAt(2), QLatin1String("b")); QCOMPARE(column->textAt(3), QLatin1String("1.1")); QCOMPARE(column->textAt(4), QLatin1String("2.2")); //3rd column, Origin::TextNumeric: //first is numerical, column is set to Numeric, empty or text values in the column a set to NAN column = spreadsheet->column(2); QCOMPARE(column->columnMode(), AbstractColumn::Numeric); QCOMPARE(column->valueAt(0), 1.1); QCOMPARE(column->valueAt(1), 2.2); QCOMPARE(!std::isnan(column->valueAt(2)), false); QCOMPARE(!std::isnan(column->valueAt(3)), false); QCOMPARE(column->valueAt(4), 3.3); //4th column, Origin::TextNumeric: //first value is string, the column is set to Text, numerical values are converted to strings column = spreadsheet->column(3); QCOMPARE(column->columnMode(), AbstractColumn::Text); QCOMPARE(column->textAt(0), QLatin1String("a")); QCOMPARE(column->textAt(1), QLatin1String("b")); QCOMPARE(column->textAt(2), QLatin1String("1.1")); QCOMPARE(column->textAt(3), QLatin1String("2.2")); QCOMPARE(column->textAt(4), QLatin1String("c")); //5th column, Origin::Numeric //column is set to Numeric, empty values in the column a set to NAN column = spreadsheet->column(4); QCOMPARE(column->columnMode(), AbstractColumn::Numeric); QCOMPARE(!std::isnan(column->valueAt(0)), false); QCOMPARE(column->valueAt(1), 1.1); QCOMPARE(column->valueAt(2), 2.2); QCOMPARE(column->valueAt(3), 3.3); QCOMPARE(!std::isnan(column->valueAt(4)), false); //6th column, Origin::Numeric //column is set to Numeric, empty values in the column a set to NAN column = spreadsheet->column(5); QCOMPARE(column->columnMode(), AbstractColumn::Numeric); QCOMPARE(column->valueAt(0), 1.1); QCOMPARE(column->valueAt(1), 2.2); QCOMPARE(column->valueAt(2), 3.3); QCOMPARE(!std::isnan(column->valueAt(3)), false); QCOMPARE(!std::isnan(column->valueAt(4)), false); } #endif QTEST_MAIN(ProjectImportTest)