From fd966edbc9e8cdbeaf8221465ec260fdf3269037 Mon Sep 17 00:00:00 2001 From: Evgenii Sopov Date: Sat, 19 Sep 2020 03:00:40 +0700 Subject: [PATCH 1/3] Updated version to v0.1.3 --- src.wsjcpp/CMakeLists.txt | 6 +++--- unit-tests.wsjcpp/CMakeLists.txt | 8 ++++---- unit-tests.wsjcpp/build_simple.sh | 2 +- wsjcpp.yml | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src.wsjcpp/CMakeLists.txt b/src.wsjcpp/CMakeLists.txt index be7f1d5..8825841 100644 --- a/src.wsjcpp/CMakeLists.txt +++ b/src.wsjcpp/CMakeLists.txt @@ -1,8 +1,8 @@ -# Automaticly generated by wsjcpp@v0.0.1 +# Automaticly generated by wsjcpp@v0.1.7 cmake_minimum_required(VERSION 3.0) -add_definitions(-DWSJCPP_VERSION="v0.1.0") -add_definitions(-DWSJCPP_NAME="wsjcpp-yaml") +add_definitions(-DWSJCPP_APP_VERSION="v0.1.3") +add_definitions(-DWSJCPP_APP_NAME="wsjcpp-yaml") if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(MACOSX TRUE) diff --git a/unit-tests.wsjcpp/CMakeLists.txt b/unit-tests.wsjcpp/CMakeLists.txt index e0fcb95..da9c506 100644 --- a/unit-tests.wsjcpp/CMakeLists.txt +++ b/unit-tests.wsjcpp/CMakeLists.txt @@ -1,9 +1,9 @@ -# Automaticly generated by wsjcpp@v0.0.1 +# Automaticly generated by wsjcpp@v0.1.7 cmake_minimum_required(VERSION 3.0) project(unit-tests C CXX) -add_definitions(-DWSJCPP_VERSION="ut-v0.1.0") -add_definitions(-DWSJCPP_NAME="unit-tests-wsjcpp-yaml") +add_definitions(-DWSJCPP_APP_VERSION="ut-v0.1.3") +add_definitions(-DWSJCPP_APP_NAME="unit-tests-wsjcpp-yaml") if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(MACOSX TRUE) @@ -27,7 +27,7 @@ list (APPEND WSJCPP_SOURCES "../src.wsjcpp/wsjcpp_core/wsjcpp_unit_tests.cpp") list (APPEND WSJCPP_SOURCES "../src.wsjcpp/wsjcpp_core/wsjcpp_unit_tests.h") list (APPEND WSJCPP_SOURCES "../src.wsjcpp/wsjcpp_core/wsjcpp_unit_tests_main.cpp") -# wsjcpp-yaml:v0.1.0 +# wsjcpp-yaml:v0.1.3 list (APPEND WSJCPP_INCLUDE_DIRS "../src") list (APPEND WSJCPP_SOURCES "../src/wsjcpp_yaml.cpp") list (APPEND WSJCPP_SOURCES "../src/wsjcpp_yaml.h") diff --git a/unit-tests.wsjcpp/build_simple.sh b/unit-tests.wsjcpp/build_simple.sh index 5c3dfd7..8b35d10 100755 --- a/unit-tests.wsjcpp/build_simple.sh +++ b/unit-tests.wsjcpp/build_simple.sh @@ -1,7 +1,7 @@ #!/bin/bash if [ ! -d tmp ]; then - mkdir -p tmp + mkdir -p tmp fi cd tmp diff --git a/wsjcpp.yml b/wsjcpp.yml index b03abec..ddbf954 100644 --- a/wsjcpp.yml +++ b/wsjcpp.yml @@ -3,7 +3,7 @@ cmake_minimum_required: 3.0 cmake_cxx_standard: 11 name: wsjcpp-yaml -version: v0.1.2 +version: v0.1.3 description: Read/Write yaml files issues: https://github.com/wsjcpp/wsjcpp-yaml/issues From 47c282a52fde664c2255961914232b4cabec2ed3 Mon Sep 17 00:00:00 2001 From: Evgenii Sopov Date: Sat, 19 Sep 2020 03:31:05 +0700 Subject: [PATCH 2/3] Updated wsjcpp-core to v0.2.1 --- src.wsjcpp/CMakeLists.txt | 2 +- .../wsjcpp_core/generate.Class.wsjcpp-script | 81 ++ .../generate.WsjcppUnitTest.wsjcpp-script | 70 ++ src.wsjcpp/wsjcpp_core/wsjcpp.hold.yml | 27 +- src.wsjcpp/wsjcpp_core/wsjcpp_core.cpp | 748 +++++++++++++++--- src.wsjcpp/wsjcpp_core/wsjcpp_core.h | 139 +++- src.wsjcpp/wsjcpp_core/wsjcpp_unit_tests.cpp | 66 +- src.wsjcpp/wsjcpp_core/wsjcpp_unit_tests.h | 32 +- .../wsjcpp_core/wsjcpp_unit_tests_main.cpp | 27 +- src/main.cpp | 4 +- unit-tests.wsjcpp/CMakeLists.txt | 10 +- .../src/unit_test_line_parser.cpp | 28 +- unit-tests.wsjcpp/src/unit_test_line_parser.h | 5 +- .../src/unit_test_yaml_parser_all.cpp | 52 +- .../src/unit_test_yaml_parser_all.h | 5 +- ...it_test_yaml_parser_array_included_map.cpp | 63 +- ...unit_test_yaml_parser_array_included_map.h | 5 +- .../src/unit_test_yaml_parser_comments.cpp | 88 ++- .../src/unit_test_yaml_parser_comments.h | 5 +- ...unit_test_yaml_parser_hierarchical_map.cpp | 52 +- .../unit_test_yaml_parser_hierarchical_map.h | 5 +- .../src/unit_test_yaml_parser_quotes.cpp | 68 +- .../src/unit_test_yaml_parser_quotes.h | 5 +- .../unit_test_yaml_parser_simple_array.cpp | 133 ++-- .../src/unit_test_yaml_parser_simple_array.h | 5 +- .../src/unit_test_yaml_parser_simple_map.cpp | 34 +- .../src/unit_test_yaml_parser_simple_map.h | 5 +- wsjcpp.yml | 11 +- 28 files changed, 1347 insertions(+), 428 deletions(-) create mode 100644 src.wsjcpp/wsjcpp_core/generate.Class.wsjcpp-script create mode 100644 src.wsjcpp/wsjcpp_core/generate.WsjcppUnitTest.wsjcpp-script diff --git a/src.wsjcpp/CMakeLists.txt b/src.wsjcpp/CMakeLists.txt index 8825841..c168c43 100644 --- a/src.wsjcpp/CMakeLists.txt +++ b/src.wsjcpp/CMakeLists.txt @@ -17,7 +17,7 @@ set (WSJCPP_SOURCES "") find_package(Threads REQUIRED) list (APPEND WSJCPP_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) -# wsjcpp-core:v0.1.1 +# wsjcpp-core:v0.2.1 list (APPEND WSJCPP_INCLUDE_DIRS "./src.wsjcpp/wsjcpp_core/") list (APPEND WSJCPP_SOURCES "./src.wsjcpp/wsjcpp_core/wsjcpp_core.cpp") list (APPEND WSJCPP_SOURCES "./src.wsjcpp/wsjcpp_core/wsjcpp_core.h") diff --git a/src.wsjcpp/wsjcpp_core/generate.Class.wsjcpp-script b/src.wsjcpp/wsjcpp_core/generate.Class.wsjcpp-script new file mode 100644 index 0000000..4a0d11f --- /dev/null +++ b/src.wsjcpp/wsjcpp_core/generate.Class.wsjcpp-script @@ -0,0 +1,81 @@ +#!/usr/bin/wsjcpp-safe-scripting + +# log_info rootdir +# log_info script_filename + +make_dir "src" + +var user_class_name +set_value user_class_name arg1 +normalize_class_name user_class_name +convert_CamelCase_to_snake_case user_class_name user_class_name + +var class_name +set_value class_name arg1 +normalize_class_name class_name + +var base_filename +convert_CamelCase_to_snake_case class_name base_filename +# log_info base_filename + +var filename_cpp +concat filename_cpp "./src/" base_filename ".cpp" + +var filename_h +concat filename_h "./src/" base_filename ".h" + +var ifndef_header +set_value ifndef_header base_filename +concat ifndef_header "_H" + +to_upper_case ifndef_header + +var content_header +concat content_header "#ifndef " ifndef_header " +#define " ifndef_header " + +#include + +class " class_name " { + public: + " class_name "(); + + private: + std::string TAG; +}; + +#endif // " ifndef_header + + +var content_source +concat content_source " +#include \"" base_filename ".h\" +#include + +// --------------------------------------------------------------------- +// " class_name " + +" class_name "::" class_name "() { + TAG = \"" class_name "\"; +} + +" + +var file_source +concat file_source "src/" filename_cpp + +write_file filename_h content_header +write_file filename_cpp content_source + +log_info " +====== +Generated class: + - " class_name " +Generated files: + - " filename_h " + - " filename_cpp " +====== +" + +cmakelists_txt_append_wsjcpp filename_h +cmakelists_txt_append_wsjcpp filename_cpp \ No newline at end of file diff --git a/src.wsjcpp/wsjcpp_core/generate.WsjcppUnitTest.wsjcpp-script b/src.wsjcpp/wsjcpp_core/generate.WsjcppUnitTest.wsjcpp-script new file mode 100644 index 0000000..fdf4902 --- /dev/null +++ b/src.wsjcpp/wsjcpp_core/generate.WsjcppUnitTest.wsjcpp-script @@ -0,0 +1,70 @@ +#!/usr/bin/wsjcpp-safe-scripting + +# log_info rootdir +# log_info script_filename + +make_dir "./unit-tests.wsjcpp" +make_dir "./unit-tests.wsjcpp/src" + +var class_name +set_value class_name arg1 +normalize_class_name class_name + +var filename_cpp +set_value filename_cpp arg2 + +var content_source +concat content_source " +#include +#include + +// --------------------------------------------------------------------- +// " class_name " + +class " class_name " : public WsjcppUnitTestBase { + public: + " class_name "(); + virtual bool doBeforeTest() override; + virtual void executeTest() override; + virtual bool doAfterTest() override; +}; + +REGISTRY_WSJCPP_UNIT_TEST(" class_name ") + +" class_name "::" class_name "() + : WsjcppUnitTestBase(\"" class_name "\") { +} + +// --------------------------------------------------------------------- + +bool " class_name "::doBeforeTest() { + // do something before test + return true; +} + +// --------------------------------------------------------------------- + +void " class_name "::executeTest() { + compare(\"Not implemented\", true, false); + // TODO unit test source code here +} + +// --------------------------------------------------------------------- + +bool " class_name "::doAfterTest() { + // do somethig after test + return true; +} + +" + +write_file filename_cpp content_source + +log_info " +====== +Generated class: + - " class_name " +Generated files: + - " filename_cpp " +====== +" diff --git a/src.wsjcpp/wsjcpp_core/wsjcpp.hold.yml b/src.wsjcpp/wsjcpp_core/wsjcpp.hold.yml index 1d20668..af61cea 100644 --- a/src.wsjcpp/wsjcpp_core/wsjcpp.hold.yml +++ b/src.wsjcpp/wsjcpp_core/wsjcpp.hold.yml @@ -3,7 +3,7 @@ cmake_cxx_standard: 11 cmake_minimum_required: 3.0 name: wsjcpp-core -version: v0.1.1 +version: v0.2.1 description: Basic Utils for wsjcpp issues: https://github.com/wsjcpp/wsjcpp-core/issues repositories: @@ -21,25 +21,36 @@ distribution: - source-file: src/wsjcpp_core.cpp target-file: wsjcpp_core.cpp type: "source-code" + sha1: "09ef821bbc090fc1cd8a15bc4a57a9a2ce8ae00d" - source-file: src/wsjcpp_core.h target-file: wsjcpp_core.h type: "source-code" # todo must be header-file + sha1: "e6e4ab2067d3c942db08e3b79862486eaf851e4b" - source-file: "src/wsjcpp_unit_tests.cpp" target-file: "wsjcpp_unit_tests.cpp" type: "unit-tests" + sha1: "fd5989d1a83c8b90bdc4d5e9bc9c3051eaa1e6d2" - source-file: "src/wsjcpp_unit_tests.h" target-file: "wsjcpp_unit_tests.h" type: "unit-tests" + sha1: "83d4b6e046b6b58c42882ccae4be413e03c401c1" - source-file: "src/wsjcpp_unit_tests_main.cpp" target-file: "wsjcpp_unit_tests_main.cpp" type: "unit-tests" + sha1: "388ae269b325c5e161f6c3a5c598575714a4bffc" + - source-file: "scripts.wsjcpp/generate.WsjcppUnitTest.wsjcpp-script" + target-file: "generate.WsjcppUnitTest.wsjcpp-script" + type: "safe-scripting-generate" + sha1: "a7c9c2d19bf81c5b00e659384b0b92a99319a4c1" + - source-file: "scripts.wsjcpp/generate.Class.wsjcpp-script" + target-file: "generate.Class.wsjcpp-script" + type: "safe-scripting-generate" + sha1: "de1799907c685d606b93e08b821b540c2faa2db1" unit-tests: cases: - name: CoreNormalizePath description: Check function normalizePath - - name: CoreUuid - description: Check test generate uuid function - name: CoreExtractFilename description: Check function extract filenane from path - name: "ToUpper" @@ -68,3 +79,13 @@ unit-tests: description: "Test join function" - name: "getHumanSizeBytes" description: "Test function get human size in bytes" + - name: "TestResources" + description: "Test basic resources" + - name: "ListOfDirs" + description: "Check list of directories" + - name: "FilePermissions" + description: "" + - name: "StringPadding" + description: "" + - name: "DateTimeFormat" + description: "" diff --git a/src.wsjcpp/wsjcpp_core/wsjcpp_core.cpp b/src.wsjcpp/wsjcpp_core/wsjcpp_core.cpp index 0256d53..5e937f3 100644 --- a/src.wsjcpp/wsjcpp_core/wsjcpp_core.cpp +++ b/src.wsjcpp/wsjcpp_core/wsjcpp_core.cpp @@ -1,6 +1,7 @@ #include "wsjcpp_core.h" #include #include +#include #include #include #include @@ -16,9 +17,237 @@ #include #include #include -#include -#include +// #include #include +#include +#include + +// --------------------------------------------------------------------- +// WsjcppFilePermissions + +WsjcppFilePermissions::WsjcppFilePermissions() { + // default permissions + m_bOwnerReadFlag = true; + m_bOwnerWriteFlag = true; + m_bOwnerExecuteFlag = false; + m_bGroupReadFlag = false; + m_bGroupWriteFlag = false; + m_bGroupExecuteFlag = false; + m_bOtherReadFlag = true; + m_bOtherWriteFlag = false; + m_bOtherExecuteFlag = false; +} + +WsjcppFilePermissions::WsjcppFilePermissions( + bool bOwnerReadFlag, bool bOwnerWriteFlag, bool bOwnerExecuteFlag, + bool bGroupReadFlag, bool bGroupWriteFlag, bool bGroupExecuteFlag, + bool bOtherReadFlag, bool bOtherWriteFlag, bool bOtherExecuteFlag +) { + m_bOwnerReadFlag = bOwnerReadFlag; + m_bOwnerWriteFlag = bOwnerWriteFlag; + m_bOwnerExecuteFlag = bOwnerExecuteFlag; + m_bGroupReadFlag = bGroupReadFlag; + m_bGroupWriteFlag = bGroupWriteFlag; + m_bGroupExecuteFlag = bGroupExecuteFlag; + m_bOtherReadFlag = bOtherReadFlag; + m_bOtherWriteFlag = bOtherWriteFlag; + m_bOtherExecuteFlag = bOtherExecuteFlag; +} + +WsjcppFilePermissions::WsjcppFilePermissions(uint16_t nFilePermission) { + + // owner + m_bOwnerReadFlag = nFilePermission & 0x0400; + m_bOwnerWriteFlag = nFilePermission & 0x0200; + m_bOwnerExecuteFlag = nFilePermission & 0x0100; + + // group + m_bGroupReadFlag = nFilePermission & 0x0040; + m_bGroupWriteFlag = nFilePermission & 0x0020; + m_bGroupExecuteFlag = nFilePermission & 0x0010; + + // for other + m_bOtherReadFlag = nFilePermission & 0x0004; + m_bOtherWriteFlag = nFilePermission & 0x0002; + m_bOtherExecuteFlag = nFilePermission & 0x0001; +} + +// --------------------------------------------------------------------- + +void WsjcppFilePermissions::setOwnerReadFlag(bool bOwnerReadFlag) { + m_bOwnerReadFlag = bOwnerReadFlag; +} + +// --------------------------------------------------------------------- + +bool WsjcppFilePermissions::getOwnerReadFlag() const { + return m_bOwnerReadFlag; +} + +// --------------------------------------------------------------------- + +void WsjcppFilePermissions::setOwnerWriteFlag(bool bOwnerWriteFlag) { + m_bOwnerWriteFlag = bOwnerWriteFlag; +} + +// --------------------------------------------------------------------- + +bool WsjcppFilePermissions::getOwnerWriteFlag() const { + return m_bOwnerWriteFlag; +} + +// --------------------------------------------------------------------- + +void WsjcppFilePermissions::setOwnerExecuteFlag(bool bOwnerExecuteFlag) { + m_bOwnerExecuteFlag = bOwnerExecuteFlag; +} + +// --------------------------------------------------------------------- + +bool WsjcppFilePermissions::getOwnerExecuteFlag() const { + return m_bOwnerExecuteFlag; +} + +// --------------------------------------------------------------------- + +void WsjcppFilePermissions::setOwnerFlags(bool bOwnerReadFlag, bool bOwnerWriteFlag, bool bOwnerExecuteFlag) { + m_bOwnerReadFlag = bOwnerReadFlag; + m_bOwnerWriteFlag = bOwnerWriteFlag; + m_bOwnerExecuteFlag = bOwnerExecuteFlag; +} + +// --------------------------------------------------------------------- + +void WsjcppFilePermissions::setGroupReadFlag(bool bGroupReadFlag) { + m_bGroupReadFlag = bGroupReadFlag; +} + +// --------------------------------------------------------------------- + +bool WsjcppFilePermissions::getGroupReadFlag() const { + return m_bGroupReadFlag; +} + +// --------------------------------------------------------------------- + +void WsjcppFilePermissions::setGroupWriteFlag(bool bGroupWriteFlag) { + m_bGroupWriteFlag = bGroupWriteFlag; +} + +// --------------------------------------------------------------------- + +bool WsjcppFilePermissions::getGroupWriteFlag() const { + return m_bGroupWriteFlag; +} + +// --------------------------------------------------------------------- + +void WsjcppFilePermissions::setGroupExecuteFlag(bool bGroupExecuteFlag) { + m_bGroupExecuteFlag = bGroupExecuteFlag; +} + +// --------------------------------------------------------------------- + +bool WsjcppFilePermissions::getGroupExecuteFlag() const { + return m_bGroupExecuteFlag; +} + +// --------------------------------------------------------------------- + +void WsjcppFilePermissions::setGroupFlags(bool bGroupReadFlag, bool bGroupWriteFlag, bool bGroupExecuteFlag) { + m_bGroupReadFlag = bGroupReadFlag; + m_bGroupWriteFlag = bGroupWriteFlag; + m_bGroupExecuteFlag = bGroupExecuteFlag; +} + +// --------------------------------------------------------------------- + +void WsjcppFilePermissions::setOtherReadFlag(bool bOtherReadFlag) { + m_bOtherReadFlag = bOtherReadFlag; +} + +// --------------------------------------------------------------------- + +bool WsjcppFilePermissions::getOtherReadFlag() const { + return m_bOtherReadFlag; +} + +// --------------------------------------------------------------------- + +void WsjcppFilePermissions::setOtherWriteFlag(bool bOtherWriteFlag) { + m_bOtherWriteFlag = bOtherWriteFlag; +} + +// --------------------------------------------------------------------- + +bool WsjcppFilePermissions::getOtherWriteFlag() const { + return m_bOtherWriteFlag; +} + +// --------------------------------------------------------------------- + +void WsjcppFilePermissions::setOtherExecuteFlag(bool bOtherExecuteFlag) { + m_bOtherExecuteFlag = bOtherExecuteFlag; +} + +// --------------------------------------------------------------------- + +bool WsjcppFilePermissions::getOtherExecuteFlag() const { + return m_bOtherExecuteFlag; +} + +// --------------------------------------------------------------------- + +void WsjcppFilePermissions::setOtherFlags(bool bOtherReadFlag, bool bOtherWriteFlag, bool bOtherExecuteFlag) { + m_bOtherReadFlag = bOtherReadFlag; + m_bOtherWriteFlag = bOtherWriteFlag; + m_bOtherExecuteFlag = bOtherExecuteFlag; +} + +// --------------------------------------------------------------------- + +std::string WsjcppFilePermissions::toString() const { + std::string sRet = "-"; + + // owner + sRet += m_bOwnerReadFlag ? "r" : "-"; + sRet += m_bOwnerWriteFlag ? "w" : "-"; + sRet += m_bOwnerExecuteFlag ? "x" : "-"; + + // group + sRet += m_bGroupReadFlag ? "r" : "-"; + sRet += m_bGroupWriteFlag ? "w" : "-"; + sRet += m_bGroupExecuteFlag ? "x" : "-"; + + // for other + sRet += m_bOtherReadFlag ? "r" : "-"; + sRet += m_bOtherWriteFlag ? "w" : "-"; + sRet += m_bOtherExecuteFlag ? "x" : "-"; + + return sRet; +} + +// --------------------------------------------------------------------- + +uint16_t WsjcppFilePermissions::toUInt16() const { + uint16_t nRet = 0x0; + // owner + nRet |= m_bOwnerReadFlag ? 0x0400 : 0x0; + nRet |= m_bOwnerWriteFlag ? 0x0200 : 0x0; + nRet |= m_bOwnerExecuteFlag ? 0x0100 : 0x0; + + // group + nRet += m_bGroupReadFlag ? 0x0040 : 0x0; + nRet += m_bGroupWriteFlag ? 0x0020 : 0x0; + nRet += m_bGroupExecuteFlag ? 0x0010 : 0x0; + + // for other + nRet += m_bOtherReadFlag ? 0x0004 : 0x0; + nRet += m_bOtherWriteFlag ? 0x0002 : 0x0; + nRet += m_bOtherExecuteFlag ? 0x0001 : 0x0; + return nRet; +} + // --------------------------------------------------------------------- // WsjcppCore @@ -31,8 +260,8 @@ bool WsjcppCore::init( const std::string &sLibraryNameForExports ) { // init random - std::srand(std::rand() + std::time(0)); - // WsjcppCore::initRandom(); + // std::srand(std::time(0)); + WsjcppCore::initRandom(); return true; } @@ -138,28 +367,35 @@ std::string WsjcppCore::getCurrentDirectory() { // --------------------------------------------------------------------- -long WsjcppCore::currentTime_milliseconds() { +long WsjcppCore::getCurrentTimeInMilliseconds() { long nTimeStart = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); return nTimeStart; } // --------------------------------------------------------------------- -long WsjcppCore::currentTime_seconds() { +long WsjcppCore::getCurrentTimeInSeconds() { long nTimeStart = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); return nTimeStart; } // --------------------------------------------------------------------- -std::string WsjcppCore::currentTime_logformat() { - long nTimeStart = WsjcppCore::currentTime_milliseconds(); +std::string WsjcppCore::getCurrentTimeForFilename() { + long nTimeStart = WsjcppCore::getCurrentTimeInSeconds(); + return WsjcppCore::formatTimeForFilename(nTimeStart); +} + +// --------------------------------------------------------------------- + +std::string WsjcppCore::getCurrentTimeForLogFormat() { + long nTimeStart = WsjcppCore::getCurrentTimeInMilliseconds(); std::string sMilliseconds = std::to_string(int(nTimeStart % 1000)); nTimeStart = nTimeStart / 1000; std::time_t tm_ = long(nTimeStart); - // struct tm tstruct = *localtime(&tm_); - struct tm tstruct = *gmtime ( &tm_ ); + struct tm tstruct; + gmtime_r(&tm_, &tstruct); // Visit http://en.cppreference.com/w/cpp/chrono/c/strftime // for more information about date/time format @@ -170,11 +406,14 @@ std::string WsjcppCore::currentTime_logformat() { // --------------------------------------------------------------------- -std::string WsjcppCore::threadId() { +std::string WsjcppCore::getThreadId() { + + static_assert(sizeof(std::thread::id)==sizeof(uint64_t),"this function only works if size of thead::id is equal to the size of uint_64"); std::thread::id this_id = std::this_thread::get_id(); + uint64_t val = *((uint64_t*) &this_id); std::stringstream stream; - stream << std::hex << this_id; - return "0x" + std::string(stream.str()); + stream << "0x" << std::setw(16) << std::setfill('0') << std::hex << val; + return std::string(stream.str()); } // --------------------------------------------------------------------- @@ -182,8 +421,8 @@ std::string WsjcppCore::threadId() { std::string WsjcppCore::formatTimeForWeb(long nTimeInSec) { std::time_t tm_ = long(nTimeInSec); // struct tm tstruct = *localtime(&tm_); - struct tm tstruct = *gmtime ( &tm_ ); - + struct tm tstruct; + gmtime_r(&tm_, &tstruct); // Visit http://en.cppreference.com/w/cpp/chrono/c/strftime // for more information about date/time format @@ -193,19 +432,15 @@ std::string WsjcppCore::formatTimeForWeb(long nTimeInSec) { return std::string(buf); } -// --------------------------------------------------------------------- -std::string WsjcppCore::currentTime_forFilename() { - long nTimeStart = WsjcppCore::currentTime_seconds(); - return WsjcppCore::formatTimeForFilename(nTimeStart); -} // --------------------------------------------------------------------- std::string WsjcppCore::formatTimeForFilename(long nTimeInSec) { std::time_t tm_ = long(nTimeInSec); // struct tm tstruct = *localtime(&tm_); - struct tm tstruct = *gmtime ( &tm_ ); + struct tm tstruct; + gmtime_r(&tm_, &tstruct); // Visit http://en.cppreference.com/w/cpp/chrono/c/strftime // for more information about date/time format @@ -220,7 +455,8 @@ std::string WsjcppCore::formatTimeUTC(int nTimeInSec) { // datetime std::time_t tm_ = long(nTimeInSec); // struct tm tstruct = *localtime(&tm_); - struct tm tstruct = *gmtime ( &tm_ ); + struct tm tstruct; + gmtime_r(&tm_, &tstruct); // Visit http://en.cppreference.com/w/cpp/chrono/c/strftime // for more information about date/time format @@ -254,44 +490,63 @@ bool WsjcppCore::dirExists(const std::string &sDirname) { // --------------------------------------------------------------------- std::vector WsjcppCore::listOfDirs(const std::string &sDirname) { + WsjcppLog::warn("listOfDirs", "Deprecated. Use a WsjcppCore::getListOfDirs"); + return WsjcppCore::getListOfDirs(sDirname); +} + +// --------------------------------------------------------------------- + +std::vector WsjcppCore::getListOfDirs(const std::string &sDirname) { std::vector vDirs; if (!WsjcppCore::dirExists(sDirname)) { return vDirs; } DIR *dir = opendir(sDirname.c_str()); - struct dirent *entry = readdir(dir); - while (entry != NULL) { - if (entry->d_type == DT_DIR) { - std::string sDir(entry->d_name); - if (sDir != "." && sDir != "..") { - vDirs.push_back(sDir); + if (dir != NULL) { + struct dirent *entry = readdir(dir); + while (entry != NULL) { + if (entry->d_type == DT_DIR) { + std::string sDir(entry->d_name); + if (sDir != "." && sDir != "..") { + vDirs.push_back(sDir); + } } + entry = readdir(dir); } - entry = readdir(dir); + closedir(dir); } - closedir(dir); + std::sort(vDirs.begin(), vDirs.end()); return vDirs; } // --------------------------------------------------------------------- std::vector WsjcppCore::listOfFiles(const std::string &sDirname) { + WsjcppLog::warn("listOfFiles", "Deprecated. Use a WsjcppCore::getListOfFiles"); + return WsjcppCore::getListOfFiles(sDirname); +} + +// --------------------------------------------------------------------- + +std::vector WsjcppCore::getListOfFiles(const std::string &sDirname) { std::vector vFiles; if (!WsjcppCore::dirExists(sDirname)) { return vFiles; } DIR *dir = opendir(sDirname.c_str()); - struct dirent *entry = readdir(dir); - while (entry != NULL) { - if (entry->d_type != DT_DIR) { - std::string sDir(entry->d_name); - if (sDir != "." && sDir != "..") { - vFiles.push_back(sDir); + if (dir != NULL) { + struct dirent *entry = readdir(dir); + while (entry != NULL) { + if (entry->d_type != DT_DIR) { + std::string sDir(entry->d_name); + if (sDir != "." && sDir != "..") { + vFiles.push_back(sDir); + } } + entry = readdir(dir); } - entry = readdir(dir); + closedir(dir); } - closedir(dir); return vFiles; } @@ -392,6 +647,35 @@ bool WsjcppCore::removeFile(const std::string &sFilename) { // --------------------------------------------------------------------- +bool WsjcppCore::copyFile(const std::string &sSourceFilename, const std::string &sTargetFilename) { + if (!WsjcppCore::fileExists(sSourceFilename)) { + WsjcppLog::err("copyFile", "File '" + sSourceFilename + "' did not exists"); + return false; + } + + if (WsjcppCore::fileExists(sTargetFilename)) { + WsjcppLog::err("copyFile", "File '" + sTargetFilename + "' already exists"); + return false; + } + + std::ifstream src(sSourceFilename, std::ios::binary); + if (!src.is_open()) { + WsjcppLog::err("copyFile", "Could not open file '" + sSourceFilename + "' for read"); + return false; + } + + std::ofstream dst(sTargetFilename, std::ios::binary); + if (!dst.is_open()) { + WsjcppLog::err("copyFile", "Could not open file '" + sTargetFilename + "' for write"); + return false; + } + + dst << src.rdbuf(); + return true; +} + +// --------------------------------------------------------------------- + bool WsjcppCore::createEmptyFile(const std::string &sFilename) { if (WsjcppCore::fileExists(sFilename)) { return false; @@ -497,7 +781,7 @@ std::string WsjcppCore::join(const std::vector &vWhat, const std::s // --------------------------------------------------------------------- void WsjcppCore::initRandom() { - std::srand(std::rand() + std::time(0)); + std::srand(std::time(0)); } // --------------------------------------------------------------------- @@ -505,13 +789,11 @@ void WsjcppCore::initRandom() { std::string WsjcppCore::createUuid() { std::string sRet = "00000000-0000-0000-0000-000000000000"; const std::string sAlphabet = "0123456789abcdef"; - // unsigned t = std::time(0); for (int i = 0; i < 36; i++) { if (i != 8 && i != 13 && i != 18 && i != 23) { - sRet[i] = sAlphabet[std::rand() % sAlphabet.length()]; + sRet[i] = sAlphabet[rand() % sAlphabet.length()]; } } - // Fallen::initRandom(); return sRet; } @@ -634,30 +916,193 @@ std::string WsjcppCore::getHumanSizeBytes(long nBytes) { return std::to_string(nBytes) + "PB"; } +// --------------------------------------------------------------------- + +bool WsjcppCore::recoursiveCopyFiles(const std::string& sSourceDir, const std::string& sTargetDir) { + if (!WsjcppCore::dirExists(sSourceDir)) { + WsjcppLog::err("recoursiveCopyFiles", "Source Dir '" + sSourceDir + "' did not exists"); + return false; + } + + if (!WsjcppCore::dirExists(sTargetDir)) { + if (!WsjcppCore::makeDir(sTargetDir)) { + WsjcppLog::err("recoursiveCopyFiles", "Could not create target dir '" + sTargetDir + "'"); + return false; + } + } + + std::vector vFiles = WsjcppCore::getListOfFiles(sSourceDir); + for (int i = 0; i < vFiles.size(); i++) { + std::string sSourceFile = sSourceDir + "/" + vFiles[i]; + std::string sTargetFile = sTargetDir + "/" + vFiles[i]; + if (!WsjcppCore::copyFile(sSourceFile, sTargetFile)) { + return false; + } + } + + std::vector vDirs = WsjcppCore::getListOfDirs(sSourceDir); + for (int i = 0; i < vDirs.size(); i++) { + std::string sSourceDir2 = sSourceDir + "/" + vDirs[i]; + std::string sTargetDir2 = sTargetDir + "/" + vDirs[i]; + if (!WsjcppCore::dirExists(sTargetDir2)) { + if (!WsjcppCore::makeDir(sTargetDir2)) { + WsjcppLog::err("recoursiveCopyFiles", "Could not create target subdir '" + sTargetDir2 + "'"); + return false; + } + } + + if (!WsjcppCore::recoursiveCopyFiles(sSourceDir2, sTargetDir2)) { + return false; + } + } + return true; +} + +// --------------------------------------------------------------------- + +bool WsjcppCore::recoursiveRemoveDir(const std::string& sDir) { + if (!WsjcppCore::dirExists(sDir)) { + WsjcppLog::err("recoursiveCopyFiles", "Dir '" + sDir + "' did not exists"); + return false; + } + + std::vector vFiles = WsjcppCore::getListOfFiles(sDir); + for (int i = 0; i < vFiles.size(); i++) { + std::string sFile = sDir + "/" + vFiles[i]; + if (!WsjcppCore::removeFile(sFile)) { + return false; + } + } + + std::vector vDirs = WsjcppCore::getListOfDirs(sDir); + for (int i = 0; i < vDirs.size(); i++) { + std::string sDir2 = sDir + "/" + vDirs[i]; + if (!WsjcppCore::recoursiveRemoveDir(sDir2)) { + return false; + } + } + + if (!WsjcppCore::removeFile(sDir)) { + return false; + } + return true; +} + +// --------------------------------------------------------------------- + +bool WsjcppCore::setFilePermissions(const std::string& sFilePath, const WsjcppFilePermissions &filePermissions, std::string& sError) { + + mode_t m; + + // owner + m |= filePermissions.getOwnerReadFlag() ? S_IRUSR : 0x0; + m |= filePermissions.getOwnerWriteFlag() ? S_IWUSR : 0x0; + m |= filePermissions.getOwnerExecuteFlag() ? S_IXUSR : 0x0; + + // group + m |= filePermissions.getGroupReadFlag() ? S_IRGRP : 0x0; + m |= filePermissions.getGroupWriteFlag() ? S_IWGRP : 0x0; + m |= filePermissions.getGroupExecuteFlag() ? S_IXGRP : 0x0; + + // for other + m |= filePermissions.getOtherReadFlag() ? S_IROTH : 0x0; + m |= filePermissions.getOtherWriteFlag() ? S_IWOTH : 0x0; + m |= filePermissions.getOtherExecuteFlag() ? S_IXOTH : 0x0; + + if (chmod(sFilePath.c_str(), m) != 0) { + sError = "Could not change permissions for: '" + sFilePath + "'"; + return false; + } + return true; +} + +// --------------------------------------------------------------------- + +bool WsjcppCore::getFilePermissions(const std::string& sFilePath, WsjcppFilePermissions &filePermissions, std::string& sError) { + if (!WsjcppCore::fileExists(sFilePath)) { + sError = "File '" + sFilePath + "' - not found"; + return false; + } + + struct stat fileStat; + if (stat(sFilePath.c_str(), &fileStat) < 0) { + sError = "Could not get info about file '" + sFilePath + "'."; + return false; + } + + mode_t m = fileStat.st_mode; + + // S_ISDIR(fileStat.st_mode)) ? "d" : "-" + + // owner + filePermissions.setOwnerReadFlag(m & S_IRUSR); + filePermissions.setOwnerWriteFlag(m & S_IWUSR); + filePermissions.setOwnerExecuteFlag(m & S_IXUSR); + + + // group + filePermissions.setGroupReadFlag(m & S_IRGRP); + filePermissions.setGroupWriteFlag(m & S_IWGRP); + filePermissions.setGroupExecuteFlag(m & S_IXGRP); + + // for other + filePermissions.setOtherReadFlag(m & S_IROTH); + filePermissions.setOtherWriteFlag(m & S_IWOTH); + filePermissions.setOtherExecuteFlag(m & S_IXOTH); + + return true; +} + +// --------------------------------------------------------------------- + +std::string WsjcppCore::doPadLeft(const std::string& sIn, char cWhat, int nLength) { + std::string sRet; + int nPadLen = nLength - sIn.length(); + for (int i = 0; i < nPadLen; i++) { + sRet += cWhat; + } + return sRet + sIn; +} + +// --------------------------------------------------------------------- + +std::string WsjcppCore::doPadRight(const std::string& sIn, char cWhat, int nLength) { + std::string sRet; + int nPadLen = nLength - sIn.length(); + for (int i = 0; i < nPadLen; i++) { + sRet += cWhat; + } + return sIn + sRet; +} + // --------------------------------------------------------------------- // WsjcppLog -// Last log messages -std::deque * WsjcppLog::g_WSJCPP_LOG_LAST_MESSAGES = nullptr; -std::mutex * WsjcppLog::g_WSJCPP_LOG_MUTEX = nullptr; -std::string WsjcppLog::g_WSJCPP_LOG_DIR = "./"; -std::string WsjcppLog::g_WSJCPP_LOG_FILE = ""; -std::string WsjcppLog::g_WSJCPP_LOG_PREFIX_FILE = ""; -long WsjcppLog::g_WSJCPP_LOG_START_TIME = 0; +WsjcppLogGlobalConf::WsjcppLogGlobalConf() { + // + logDir = "./"; + logPrefixFile = ""; + logFile = ""; + enableLogFile = true; + logStartTime = 0; + logRotationPeriodInSeconds = 51000; +} // --------------------------------------------------------------------- -void WsjcppLog::doLogRotateUpdateFilename(bool bForce) { - long t = WsjcppCore::currentTime_seconds(); - long nEverySeconds = 51000; // rotate log if started now or if time left more then 1 day - if (g_WSJCPP_LOG_START_TIME == 0 || t - g_WSJCPP_LOG_START_TIME > nEverySeconds || bForce) { - g_WSJCPP_LOG_START_TIME = t; - g_WSJCPP_LOG_FILE = g_WSJCPP_LOG_DIR + "/" - + WsjcppLog::g_WSJCPP_LOG_PREFIX_FILE + "_" - + WsjcppCore::formatTimeForFilename(g_WSJCPP_LOG_START_TIME) + ".log"; +void WsjcppLogGlobalConf::doLogRotateUpdateFilename(bool bForce) { + long t = WsjcppCore::getCurrentTimeInSeconds(); + long nEverySeconds = logRotationPeriodInSeconds; // rotate log if started now or if time left more then 1 day + if (logStartTime == 0 || t - logStartTime > nEverySeconds || bForce) { + logStartTime = t; + logFile = logDir + "/" + + logPrefixFile + "_" + + WsjcppCore::formatTimeForFilename(logStartTime) + ".log"; } } +WsjcppLogGlobalConf WsjcppLog::g_WSJCPP_LOG_GLOBAL_CONF; + // --------------------------------------------------------------------- void WsjcppLog::info(const std::string & sTag, const std::string &sMessage) { @@ -697,11 +1142,10 @@ void WsjcppLog::ok(const std::string &sTag, const std::string &sMessage) { // --------------------------------------------------------------------- std::vector WsjcppLog::getLastLogMessages() { - WsjcppLog::initGlobalVariables(); - std::lock_guard lock(*WsjcppLog::g_WSJCPP_LOG_MUTEX); + std::lock_guard lock(WsjcppLog::g_WSJCPP_LOG_GLOBAL_CONF.logMutex); std::vector vRet; - for (int i = 0; i < g_WSJCPP_LOG_LAST_MESSAGES->size(); i++) { - vRet.push_back(g_WSJCPP_LOG_LAST_MESSAGES->at(i)); + for (int i = 0; i < WsjcppLog::g_WSJCPP_LOG_GLOBAL_CONF.logLastMessages.size(); i++) { + vRet.push_back(WsjcppLog::g_WSJCPP_LOG_GLOBAL_CONF.logLastMessages[i]); } return vRet; } @@ -709,58 +1153,182 @@ std::vector WsjcppLog::getLastLogMessages() { // --------------------------------------------------------------------- void WsjcppLog::setLogDirectory(const std::string &sDirectoryPath) { - WsjcppLog::g_WSJCPP_LOG_DIR = sDirectoryPath; - WsjcppLog::doLogRotateUpdateFilename(true); + WsjcppLog::g_WSJCPP_LOG_GLOBAL_CONF.logDir = sDirectoryPath; + if (!WsjcppCore::dirExists(sDirectoryPath)) { + if (!WsjcppCore::makeDir(sDirectoryPath)) { + WsjcppLog::err("setLogDirectory", "Could not create log directory '" + sDirectoryPath + "'"); + } + } + WsjcppLog::g_WSJCPP_LOG_GLOBAL_CONF.doLogRotateUpdateFilename(true); } // --------------------------------------------------------------------- void WsjcppLog::setPrefixLogFile(const std::string &sPrefixLogFile) { - WsjcppLog::g_WSJCPP_LOG_PREFIX_FILE = sPrefixLogFile; - WsjcppLog::doLogRotateUpdateFilename(true); + WsjcppLog::g_WSJCPP_LOG_GLOBAL_CONF.logPrefixFile = sPrefixLogFile; + WsjcppLog::g_WSJCPP_LOG_GLOBAL_CONF.doLogRotateUpdateFilename(true); } // --------------------------------------------------------------------- -void WsjcppLog::initGlobalVariables() { - // create deque if not created - if (WsjcppLog::g_WSJCPP_LOG_LAST_MESSAGES == nullptr) { - WsjcppLog::g_WSJCPP_LOG_LAST_MESSAGES = new std::deque(); - // std::cout << WsjcppCore::currentTime_logformat() + ", " + WsjcppCore::threadId() + " Init last messages deque\r\n"; - } - // create mutex if not created - if (WsjcppLog::g_WSJCPP_LOG_MUTEX == nullptr) { - WsjcppLog::g_WSJCPP_LOG_MUTEX = new std::mutex(); - // std::cout << WsjcppCore::currentTime_logformat() + ", " + WsjcppCore::threadId() + " Init mutex for log\r\n"; - } +void WsjcppLog::setEnableLogFile(bool bEnable) { + WsjcppLog::g_WSJCPP_LOG_GLOBAL_CONF.enableLogFile = bEnable; +} + +// --------------------------------------------------------------------- + +void WsjcppLog::setRotationPeriodInSec(long nRotationPeriodInSec) { + WsjcppLog::g_WSJCPP_LOG_GLOBAL_CONF.logRotationPeriodInSeconds = nRotationPeriodInSec; } // --------------------------------------------------------------------- void WsjcppLog::add(WsjcppColorModifier &clr, const std::string &sType, const std::string &sTag, const std::string &sMessage) { - WsjcppLog::initGlobalVariables(); - WsjcppLog::doLogRotateUpdateFilename(); + WsjcppLog::g_WSJCPP_LOG_GLOBAL_CONF.doLogRotateUpdateFilename(); - std::lock_guard lock(*WsjcppLog::g_WSJCPP_LOG_MUTEX); + std::lock_guard lock(WsjcppLog::g_WSJCPP_LOG_GLOBAL_CONF.logMutex); WsjcppColorModifier def(WsjcppColorCode::FG_DEFAULT); - std::string sLogMessage = WsjcppCore::currentTime_logformat() + ", " + WsjcppCore::threadId() + std::string sLogMessage = WsjcppCore::getCurrentTimeForLogFormat() + ", " + WsjcppCore::getThreadId() + " [" + sType + "] " + sTag + ": " + sMessage; std::cout << clr << sLogMessage << def << std::endl; - g_WSJCPP_LOG_LAST_MESSAGES->push_front(sLogMessage); - while (g_WSJCPP_LOG_LAST_MESSAGES->size() > 50) { - g_WSJCPP_LOG_LAST_MESSAGES->pop_back(); + WsjcppLog::g_WSJCPP_LOG_GLOBAL_CONF.logLastMessages.push_front(sLogMessage); + + + while (WsjcppLog::g_WSJCPP_LOG_GLOBAL_CONF.logLastMessages.size() > 50) { + WsjcppLog::g_WSJCPP_LOG_GLOBAL_CONF.logLastMessages.pop_back(); } - // TODO try create global variable - std::ofstream logFile(WsjcppLog::g_WSJCPP_LOG_FILE, std::ios::app); - if (!logFile) { - std::cout << "Error Opening File" << std::endl; - return; + + // log file + if (WsjcppLog::g_WSJCPP_LOG_GLOBAL_CONF.enableLogFile) { + std::ofstream logFile(WsjcppLog::g_WSJCPP_LOG_GLOBAL_CONF.logFile, std::ios::app); + if (!logFile) { + std::cout << "Error Opening File" << std::endl; + return; + } + + logFile << sLogMessage << std::endl; + logFile.close(); } +} - logFile << sLogMessage << std::endl; - logFile.close(); +// --------------------------------------------------------------------- +// WsjcppResourceFile + +WsjcppResourceFile::WsjcppResourceFile() { + WsjcppResourcesManager::add(this); +} + +// --------------------------------------------------------------------- + + +// --------------------------------------------------------------------- +// WsjcppResourcesManager + +std::vector *g_pWsjcppResourceFiles = nullptr; + +void WsjcppResourcesManager::initGlobalVariables() { + if (g_pWsjcppResourceFiles == nullptr) { + g_pWsjcppResourceFiles = new std::vector(); + } +} + +// --------------------------------------------------------------------- + +void WsjcppResourcesManager::add(WsjcppResourceFile* pStorage) { + WsjcppResourcesManager::initGlobalVariables(); + g_pWsjcppResourceFiles->push_back(pStorage); } +// --------------------------------------------------------------------- + +bool WsjcppResourcesManager::has(const std::string &sFilename) { + WsjcppResourcesManager::initGlobalVariables(); + for (int i = 0; i < WsjcppResourcesManager::list().size(); i++) { + if (WsjcppResourcesManager::list()[i]->getFilename() == sFilename) { + return true; + } + } + return false; +} + +// --------------------------------------------------------------------- + +WsjcppResourceFile* WsjcppResourcesManager::get(const std::string &sFilename) { + WsjcppResourcesManager::initGlobalVariables(); + for (int i = 0; i < WsjcppResourcesManager::list().size(); i++) { + if (WsjcppResourcesManager::list()[i]->getFilename() == sFilename) { + return WsjcppResourcesManager::list()[i]; + } + } + return nullptr; +} + +// --------------------------------------------------------------------- + +const std::vector &WsjcppResourcesManager::list() { + return *g_pWsjcppResourceFiles; +} + +// --------------------------------------------------------------------- + +/* +bool WsjcppResourcesManager::make(const std::string &sWorkspace) { + if (!WsjcppResourcesManager::createFolders(sWorkspace)) { + return false; + } + return WsjcppResourcesManager::extractFiles(sWorkspace); +} + +// --------------------------------------------------------------------- + +bool WsjcppResourcesManager::createFolders(const std::string &sWorkspace) { + // prepare folders + std::vector vCreateDirs; + vCreateDirs.push_back(sWorkspace + "/logs"); + vCreateDirs.push_back(sWorkspace + "/teams"); + vCreateDirs.push_back(sWorkspace + "/checkers"); + vCreateDirs.push_back(sWorkspace + "/html"); + vCreateDirs.push_back(sWorkspace + "/html/css"); + vCreateDirs.push_back(sWorkspace + "/html/js"); + vCreateDirs.push_back(sWorkspace + "/html/images"); + vCreateDirs.push_back(sWorkspace + "/html/images/teams"); + vCreateDirs.push_back(sWorkspace + "/html/images/states"); + + for(int i = 0; i < vCreateDirs.size(); i++) { + std::string sPath = vCreateDirs[i]; + // check dir existing + if (!FS::dirExists(sPath)) { + // try make dir + if (!FS::makeDir(sPath)) { + std::cout << "Could not create folder " << sPath << std::endl; + return false; + } else { + std::cout << "Created folder " << sPath << std::endl; + } + } + } + return true; +} + +// --------------------------------------------------------------------- + +bool WsjcppResourcesManager::extractFiles(const std::string &sWorkspace) { + // TODO mkdir -p for files + const std::vector list = WsjcppResourcesManager::list(); + for(int i = 0; i < list.size(); i++) { + std::string sFilename = sWorkspace + "/" + list[i]->filename(); + if (!FS::fileExists(sFilename)) { + if (!FS::writeFile(sFilename, list[i]->buffer(), list[i]->bufferSize())) { + std::cout << "Could not write file " << sFilename << std::endl; + return false; + } else { + std::cout << "Created file " << sFilename << std::endl; + } + } + } + return true; +} +*/ diff --git a/src.wsjcpp/wsjcpp_core/wsjcpp_core.h b/src.wsjcpp/wsjcpp_core/wsjcpp_core.h index 4884467..249c693 100644 --- a/src.wsjcpp/wsjcpp_core/wsjcpp_core.h +++ b/src.wsjcpp/wsjcpp_core/wsjcpp_core.h @@ -8,6 +8,58 @@ #include #include +class WsjcppFilePermissions { + public: + WsjcppFilePermissions(); + WsjcppFilePermissions( + bool bOwnerReadFlag, bool bOwnerWriteFlag, bool bOwnerExecuteFlag, + bool bGroupReadFlag, bool bGroupWriteFlag, bool bGroupExecuteFlag, + bool bOtherReadFlag, bool bOtherWriteFlag, bool bOtherExecuteFlag + ); + WsjcppFilePermissions(uint16_t nFilePermission); + + // owner flags + void setOwnerReadFlag(bool bOwnerReadFlag); + bool getOwnerReadFlag() const; + void setOwnerWriteFlag(bool bOwnerWriteFlag); + bool getOwnerWriteFlag() const; + void setOwnerExecuteFlag(bool bOwnerExecuteFlag); + bool getOwnerExecuteFlag() const; + void setOwnerFlags(bool bOwnerReadFlag, bool bOwnerWriteFlag, bool bOwnerExecuteFlag); + + // group flags + void setGroupReadFlag(bool bGroupReadFlag); + bool getGroupReadFlag() const; + void setGroupWriteFlag(bool bGroupWriteFlag); + bool getGroupWriteFlag() const; + void setGroupExecuteFlag(bool bGroupExecuteFlag); + bool getGroupExecuteFlag() const; + void setGroupFlags(bool bGroupReadFlag, bool bGroupWriteFlag, bool bGroupExecuteFlag); + + // for other flags + void setOtherReadFlag(bool bOtherReadFlag); + bool getOtherReadFlag() const; + void setOtherWriteFlag(bool bOtherWriteFlag); + bool getOtherWriteFlag() const; + void setOtherExecuteFlag(bool bOtherExecuteFlag); + bool getOtherExecuteFlag() const; + void setOtherFlags(bool bOtherReadFlag, bool bOtherWriteFlag, bool bOtherExecuteFlag); + + std::string toString() const; + uint16_t toUInt16() const; + + private: + bool m_bOwnerReadFlag; + bool m_bOwnerWriteFlag; + bool m_bOwnerExecuteFlag; + bool m_bGroupReadFlag; + bool m_bGroupWriteFlag; + bool m_bGroupExecuteFlag; + bool m_bOtherReadFlag; + bool m_bOtherWriteFlag; + bool m_bOtherExecuteFlag; +}; + class WsjcppCore { public: static bool init( @@ -22,11 +74,11 @@ class WsjcppCore { static std::string extractFilename(const std::string &sPath); static std::string getCurrentDirectory(); - static long currentTime_milliseconds(); - static long currentTime_seconds(); - static std::string currentTime_forFilename(); - static std::string currentTime_logformat(); - static std::string threadId(); + static long getCurrentTimeInMilliseconds(); + static long getCurrentTimeInSeconds(); + static std::string getCurrentTimeForFilename(); + static std::string getCurrentTimeForLogFormat(); + static std::string getThreadId(); static std::string formatTimeForWeb(long nTimeInSec); static std::string formatTimeForFilename(long nTimeInSec); static std::string formatTimeUTC(int nTimeInSec); @@ -34,13 +86,17 @@ class WsjcppCore { static bool dirExists(const std::string &sFilename); static bool fileExists(const std::string &sFilename); static std::vector listOfDirs(const std::string &sDirname); - static std::vector listOfFiles(const std::string &sDirname); + static std::vector getListOfDirs(const std::string &sDirname); + static std::vector listOfFiles(const std::string &sDirname); + static std::vector getListOfFiles(const std::string &sDirname); static bool makeDir(const std::string &sDirname); static bool writeFile(const std::string &sFilename, const std::string &sContent); static bool readTextFile(const std::string &sFilename, std::string &sOutputContent); static bool readFileToBuffer(const std::string &sFilename, char *pBuffer[], int &nBufferSize); static bool writeFile(const std::string &sFilename, const char *pBuffer, const int nBufferSize); static bool removeFile(const std::string &sFilename); + static bool copyFile(const std::string &sSourceFilename, const std::string &sTargetFilename); + static bool createEmptyFile(const std::string &sFilename); static std::string& ltrim(std::string& str, const std::string& chars = "\t\n\v\f\r "); @@ -64,6 +120,16 @@ class WsjcppCore { static std::string decodeUriComponent(const std::string& sValue); static std::string getHumanSizeBytes(long nBytes); + + static bool recoursiveCopyFiles(const std::string& sSourceDir, const std::string& sTargetDir); + static bool recoursiveRemoveDir(const std::string& sDir); + + static bool setFilePermissions(const std::string& sFilePath, const WsjcppFilePermissions &filePermissions, std::string& sError); + static bool getFilePermissions(const std::string& sFilePath, WsjcppFilePermissions &filePermissions, std::string& sError); + + static std::string doPadLeft(const std::string& sIn, char cWhat, int nLength); + static std::string doPadRight(const std::string& sIn, char cWhat, int nLength); + }; @@ -95,15 +161,23 @@ class WsjcppColorModifier { // --------------------------------------------------------------------- +class WsjcppLogGlobalConf { + public: + WsjcppLogGlobalConf(); + void doLogRotateUpdateFilename(bool bForce = false); + std::mutex logMutex; + std::string logDir; + std::string logPrefixFile; + std::string logFile; + bool enableLogFile; + long logStartTime; + long logRotationPeriodInSeconds; + std::deque logLastMessages; +}; + class WsjcppLog { public: - static std::string g_WSJCPP_LOG_DIR; - static std::string g_WSJCPP_LOG_PREFIX_FILE; - static std::string g_WSJCPP_LOG_FILE; - static long g_WSJCPP_LOG_START_TIME; - static std::mutex * g_WSJCPP_LOG_MUTEX; - static std::deque * g_WSJCPP_LOG_LAST_MESSAGES; - static void doLogRotateUpdateFilename(bool bForce = false); + static WsjcppLogGlobalConf g_WSJCPP_LOG_GLOBAL_CONF; static void info(const std::string &sTag, const std::string &sMessage); static void err(const std::string &sTag, const std::string &sMessage); @@ -113,12 +187,49 @@ class WsjcppLog { static std::vector getLastLogMessages(); static void setLogDirectory(const std::string &sDirectoryPath); static void setPrefixLogFile(const std::string &sPrefixLogFile); - static void initGlobalVariables(); + static void setEnableLogFile(bool bEnable); + static void setRotationPeriodInSec(long nRotationPeriodInSec); private: static void add(WsjcppColorModifier &clr, const std::string &sType, const std::string &sTag, const std::string &sMessage); }; +// --------------------------------------------------------------------- +// WsjcppResourceFile + +class WsjcppResourceFile { + public: + WsjcppResourceFile(); + virtual const std::string &getFilename() const = 0; + virtual const std::string &getPackAs() const = 0; + virtual int getBufferSize() const = 0; + virtual const char *getBuffer() const = 0; +}; + + +// --------------------------------------------------------------------- +// WsjcppResourcesManager + +extern std::vector *g_pWsjcppResourceFiles; + +class WsjcppResourcesManager { + public: + static void initGlobalVariables(); + static void add(WsjcppResourceFile*); + static const std::vector &list(); + static bool has(const std::string &sFilename); + static WsjcppResourceFile* get(const std::string &sFilename); + static bool make(const std::string &sWorkspace); + // static bool createFolders(const std::string &sWorkspace); + // static bool extractFiles(const std::string &sWorkspace); +}; + +// --------------------------------------------------------------------- +// Registry WsjcppResourceFile +#define REGISTRY_WSJCPP_RESOURCE_FILE( classname ) \ + static classname * pRegistryWsjcppResourceFile ## classname = new classname(); \ + + #endif // WSJCPP_CORE_H diff --git a/src.wsjcpp/wsjcpp_core/wsjcpp_unit_tests.cpp b/src.wsjcpp/wsjcpp_core/wsjcpp_unit_tests.cpp index d675dac..bd00383 100644 --- a/src.wsjcpp/wsjcpp_core/wsjcpp_unit_tests.cpp +++ b/src.wsjcpp/wsjcpp_core/wsjcpp_unit_tests.cpp @@ -1,56 +1,74 @@ #include "wsjcpp_unit_tests.h" +#include + +// --------------------------------------------------------------------- +// WsjcppUnitTestBase WsjcppUnitTestBase::WsjcppUnitTestBase(const std::string &sTestName) { m_sTestName = sTestName; TAG = m_sTestName; + m_bTestResult = true; WsjcppUnitTests::addUnitTest(sTestName, this); } // --------------------------------------------------------------------- -std::string WsjcppUnitTestBase::name() { +std::string WsjcppUnitTestBase::getName() { return m_sTestName; } // --------------------------------------------------------------------- -void WsjcppUnitTestBase::compareS(bool &bTestSuccess, const std::string &sPoint, - const std::string &sValue, const std::string &sExpected) { - if (sValue != sExpected) { - WsjcppLog::err(TAG, " {" + sPoint + "} Expected '" + sExpected + "', but got '" + sValue + "'"); - bTestSuccess = false; - } +void WsjcppUnitTestBase::ok(const std::string &sSuccessMessage) { + // print obly success message + WsjcppLog::ok(TAG, sSuccessMessage); } // --------------------------------------------------------------------- -bool WsjcppUnitTestBase::compareN(bool &bTestSuccess, const std::string &sPoint, int nValue, int nExpected) { - if (nValue != nExpected) { - WsjcppLog::err(TAG, " {" + sPoint + "} Expected '" + std::to_string(nExpected) + "', but got '" + std::to_string(nValue) + "'"); - bTestSuccess = false; - return false; - } - return true; +void WsjcppUnitTestBase::fail(const std::string &sFailedMessage) { + WsjcppLog::err(TAG, sFailedMessage); + m_bTestResult = false; } // --------------------------------------------------------------------- -bool WsjcppUnitTestBase::compareD(bool &bTestSuccess, const std::string &sPoint, double nValue, double nExpected) { - if (nValue != nExpected) { - WsjcppLog::err(TAG, " {" + sPoint + "} Expected '" + std::to_string(nExpected) + "', but got '" + std::to_string(nValue) + "'"); - bTestSuccess = false; +bool WsjcppUnitTestBase::runTest() { + WsjcppLog::info(TAG, "Start unit-test"); + WsjcppLog::info(TAG, "Do before unit-test"); + if (!doBeforeTest()) { + fail("Problem with before unit-test"); return false; } - return true; + WsjcppLog::info(TAG, "Execute unit-test"); + try { + executeTest(); + } catch(const std::exception& e) { + fail(e.what()); + } catch(...) { + + } + if (m_bTestResult) { + ok("Test passed."); + } else { + fail("Test failed."); + } + WsjcppLog::info(TAG, "Do after unit-test"); + if (!doAfterTest()) { + fail("Problem with after unit-test"); + } + WsjcppLog::info(TAG, "End unit-test"); + return m_bTestResult; } // --------------------------------------------------------------------- -void WsjcppUnitTestBase::compareB(bool &bTestSuccess, const std::string &sPoint, bool bValue, bool bExpected) { - if (bValue != bExpected) { - WsjcppLog::err(TAG, " {" + sPoint + "} Expected '" + (bExpected ? "true" : "false") + "', but got '" + (bValue ? "true" : "false") + "'"); - bTestSuccess = false; +bool WsjcppUnitTestBase::compareD(const std::string &sMark, double nValue, double nExpected) { + if (abs(nValue - nExpected) > std::numeric_limits::epsilon()) { + fail(" {" + sMark + "} Expected '" + std::to_string(nExpected) + "', but got '" + std::to_string(nValue) + "'"); + return false; } + return true; } // --------------------------------------------------------------------- @@ -71,7 +89,7 @@ void WsjcppUnitTests::addUnitTest(const std::string &sTestName, WsjcppUnitTestBa bool bFound = false; for (int i = 0; i < g_pWsjcppUnitTests->size(); i++) { WsjcppUnitTestBase* p = g_pWsjcppUnitTests->at(i); - if (p->name() == sTestName) { + if (p->getName() == sTestName) { bFound = true; } } diff --git a/src.wsjcpp/wsjcpp_core/wsjcpp_unit_tests.h b/src.wsjcpp/wsjcpp_core/wsjcpp_unit_tests.h index b3213db..c2d8eff 100644 --- a/src.wsjcpp/wsjcpp_core/wsjcpp_unit_tests.h +++ b/src.wsjcpp/wsjcpp_core/wsjcpp_unit_tests.h @@ -1,25 +1,35 @@ #ifndef WSJCPP_UNIT_TESTS_H #define WSJCPP_UNIT_TESTS_H -#include -#include #include +#include class WsjcppUnitTestBase { public: WsjcppUnitTestBase(const std::string &sTestName); - std::string name(); - virtual void init() = 0; - virtual bool run() = 0; + std::string getName(); + void ok(const std::string &sSuccessMessage); + void fail(const std::string &sFailedMessage); + bool runTest(); + + virtual bool doBeforeTest() = 0; + virtual void executeTest() = 0; + virtual bool doAfterTest() = 0; protected: std::string TAG; - - void compareS(bool &bTestSuccess, const std::string &sPoint, const std::string &sValue, const std::string &sExpected); - bool compareN(bool &bTestSuccess, const std::string &sPoint, int nValue, int nExpected); - bool compareD(bool &bTestSuccess, const std::string &sPoint, double nValue, double nExpected); - void compareB(bool &bTestSuccess, const std::string &sPoint, bool bValue, bool bExpected); - + + bool compareD(const std::string &sMark, double nValue, double nExpected); + template bool compare(const std::string &sMark, T1 tGotValue, T2 tExpectedValue) { + if (tGotValue != tExpectedValue) { + std::stringstream ss; + ss << " {mark: " << sMark << "} Expected '" << tExpectedValue << "', but got '" << tGotValue << "'"; + fail(ss.str()); + return false; + } + return true; + } private: + bool m_bTestResult; std::string m_sTestName; }; diff --git a/src.wsjcpp/wsjcpp_core/wsjcpp_unit_tests_main.cpp b/src.wsjcpp/wsjcpp_core/wsjcpp_unit_tests_main.cpp index 23fb13c..c66e9d2 100644 --- a/src.wsjcpp/wsjcpp_core/wsjcpp_unit_tests_main.cpp +++ b/src.wsjcpp/wsjcpp_core/wsjcpp_unit_tests_main.cpp @@ -32,20 +32,21 @@ int main(int argc, char** argv) { if (argc == 1) { int nAll = g_pWsjcppUnitTests->size(); - WsjcppLog::info("runUnitTests", "All tests count " + std::to_string(nAll)); + WsjcppLog::info(TAG, "All tests count " + std::to_string(nAll)); int nSuccess = 0; for (int i = 0; i < g_pWsjcppUnitTests->size(); i++) { WsjcppUnitTestBase* pUnitTest = g_pWsjcppUnitTests->at(i); - std::string sTestName = pUnitTest->name(); - WsjcppLog::info("runUnitTests", "Run test " + sTestName); - if (pUnitTest->run()) { - WsjcppLog::ok(sTestName, "Test passed"); + if (pUnitTest->runTest()) { nSuccess++; - } else { - WsjcppLog::err(sTestName, "Test failed"); } } - WsjcppLog::info(TAG, "Passed tests " + std::to_string(nSuccess) + " / " + std::to_string(nAll)); + if (nSuccess == nAll) { + WsjcppLog::ok(TAG, "All unit-tests passed " + std::to_string(nSuccess) + " / " + std::to_string(nAll)); + } else { + WsjcppLog::warn(TAG, "Passed unit-tests " + std::to_string(nSuccess) + " / " + std::to_string(nAll)); + WsjcppLog::err(TAG, std::to_string(nAll - nSuccess) + " unit-test(s) failed."); + } + bool bResult = nSuccess == nAll; return bResult ? 0 : -1; } else if (argc == 2) { @@ -54,7 +55,7 @@ int main(int argc, char** argv) { std::string sOutput = "\nList of unit-tests:\n"; for (int i = 0; i < g_pWsjcppUnitTests->size(); i++) { WsjcppUnitTestBase* pUnitTest = g_pWsjcppUnitTests->at(i); - sOutput += " - " + pUnitTest->name() + "\n"; + sOutput += " - " + pUnitTest->getName() + "\n"; } WsjcppLog::info(TAG, sOutput); return -1; @@ -70,13 +71,11 @@ int main(int argc, char** argv) { bool bTestFound = false; for (int i = 0; i < g_pWsjcppUnitTests->size(); i++) { WsjcppUnitTestBase* pUnitTest = g_pWsjcppUnitTests->at(i); - if (pUnitTest->name() == sArg3) { + if (pUnitTest->getName() == sArg3) { bTestFound = true; - if (pUnitTest->run()) { - WsjcppLog::ok(TAG, pUnitTest->name() + " Test passed"); + bool bResult = pUnitTest->runTest(); + if (bResult) { nSuccess++; - } else { - WsjcppLog::err(TAG, pUnitTest->name() + " Test failed"); } } } diff --git a/src/main.cpp b/src/main.cpp index 3f27e87..8af3f86 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,8 +7,8 @@ int main(int argc, char* argv[]) { std::string TAG = "MAIN"; WsjcppCore::initRandom(); - std::string appName = std::string(WSJCPP_NAME); - std::string appVersion = std::string(WSJCPP_VERSION); + std::string appName = std::string(WSJCPP_APP_NAME); + std::string appVersion = std::string(WSJCPP_APP_VERSION); std::string appLogPath = ".wsjcpp-yaml-logs"; WsjcppLog::setLogDirectory(appLogPath); if (!WsjcppCore::dirExists(appLogPath)) { diff --git a/unit-tests.wsjcpp/CMakeLists.txt b/unit-tests.wsjcpp/CMakeLists.txt index da9c506..ec00433 100644 --- a/unit-tests.wsjcpp/CMakeLists.txt +++ b/unit-tests.wsjcpp/CMakeLists.txt @@ -19,7 +19,7 @@ set (WSJCPP_SOURCES "") find_package(Threads REQUIRED) list (APPEND WSJCPP_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) -# wsjcpp-core:v0.1.1 +# wsjcpp-core:v0.2.1 list (APPEND WSJCPP_INCLUDE_DIRS "../src.wsjcpp/wsjcpp_core/") list (APPEND WSJCPP_SOURCES "../src.wsjcpp/wsjcpp_core/wsjcpp_core.cpp") list (APPEND WSJCPP_SOURCES "../src.wsjcpp/wsjcpp_core/wsjcpp_core.h") @@ -42,6 +42,14 @@ list (APPEND WSJCPP_SOURCES "../unit-tests.wsjcpp/src/unit_test_yaml_parser_simp list (APPEND WSJCPP_SOURCES "../unit-tests.wsjcpp/src/unit_test_yaml_parser_simple_map.cpp") list (APPEND WSJCPP_SOURCES "../unit-tests.wsjcpp/src/unit_test_yaml_parser_hierarchical_map.h") list (APPEND WSJCPP_SOURCES "../unit-tests.wsjcpp/src/unit_test_yaml_parser_hierarchical_map.cpp") +list (APPEND WSJCPP_SOURCES "../unit-tests.wsjcpp/src/unit_test_yaml_parser_quotes.h") +list (APPEND WSJCPP_SOURCES "../unit-tests.wsjcpp/src/unit_test_yaml_parser_quotes.cpp") +list (APPEND WSJCPP_SOURCES "../unit-tests.wsjcpp/src/unit_test_yaml_parser_comments.h") +list (APPEND WSJCPP_SOURCES "../unit-tests.wsjcpp/src/unit_test_yaml_parser_comments.cpp") +list (APPEND WSJCPP_SOURCES "../unit-tests.wsjcpp/src/unit_test_yaml_parser_all.h") +list (APPEND WSJCPP_SOURCES "../unit-tests.wsjcpp/src/unit_test_yaml_parser_all.cpp") +list (APPEND WSJCPP_SOURCES "../unit-tests.wsjcpp/src/unit_test_yaml_parser_array_included_map.h") +list (APPEND WSJCPP_SOURCES "../unit-tests.wsjcpp/src/unit_test_yaml_parser_array_included_map.cpp") # required-libraries list (APPEND WSJCPP_LIBRARIES "-lpthread") diff --git a/unit-tests.wsjcpp/src/unit_test_line_parser.cpp b/unit-tests.wsjcpp/src/unit_test_line_parser.cpp index 821449e..08ccfe0 100644 --- a/unit-tests.wsjcpp/src/unit_test_line_parser.cpp +++ b/unit-tests.wsjcpp/src/unit_test_line_parser.cpp @@ -12,13 +12,14 @@ UnitTestLineParser::UnitTestLineParser() // --------------------------------------------------------------------- -void UnitTestLineParser::init() { +bool UnitTestLineParser::doBeforeTest() { // nothing + return true; } // --------------------------------------------------------------------- -bool UnitTestLineParser::run() { +void UnitTestLineParser::executeTest() { struct LineTest { LineTest( int nNumberOfTest, @@ -63,8 +64,6 @@ bool UnitTestLineParser::run() { vTestLines.push_back(LineTest(6, " - \"test4:111\"", " ", true, "", false, "test4:111", true, "")); vTestLines.push_back(LineTest(7, "issues: https://github.com/wsjcpp/wsjcpp-yaml/issues", "", false, "issues", false, "https://github.com/wsjcpp/wsjcpp-yaml/issues", false, "")); - bool bTestSuccess = true; - for (int i = 0; i < vTestLines.size(); i++) { LineTest test = vTestLines[i]; @@ -72,14 +71,19 @@ bool UnitTestLineParser::run() { line.parseLine(test.sLine); std::string tagline = "{line:" + std::to_string(test.nNumberOfTest) + ": '" + test.sLine + "'}"; - compareS(bTestSuccess, tagline + ", prefix", line.getPrefix(), test.sPrefix); - compareB(bTestSuccess, tagline + ", arrayitem", line.isArrayItem(), test.isArrayItem); - compareS(bTestSuccess, tagline + ", name", line.getName(), test.sName); - compareB(bTestSuccess, tagline + ", name-has-quotes", line.hasNameDoubleQuotes(), test.bNameHasQuotes); - compareS(bTestSuccess, tagline + ", value", line.getValue(), test.sValue); - compareB(bTestSuccess, tagline + ", value-has-quotes", line.hasValueDoubleQuotes(), test.bValueHasQuotes); - compareS(bTestSuccess, tagline + ", comment", line.getComment(), test.sComment); + compare(tagline + ", prefix", line.getPrefix(), test.sPrefix); + compare(tagline + ", arrayitem", line.isArrayItem(), test.isArrayItem); + compare(tagline + ", name", line.getName(), test.sName); + compare(tagline + ", name-has-quotes", line.hasNameDoubleQuotes(), test.bNameHasQuotes); + compare(tagline + ", value", line.getValue(), test.sValue); + compare(tagline + ", value-has-quotes", line.hasValueDoubleQuotes(), test.bValueHasQuotes); + compare(tagline + ", comment", line.getComment(), test.sComment); } +} - return bTestSuccess; +// --------------------------------------------------------------------- + +bool UnitTestLineParser::doAfterTest() { + // nothing + return true; } \ No newline at end of file diff --git a/unit-tests.wsjcpp/src/unit_test_line_parser.h b/unit-tests.wsjcpp/src/unit_test_line_parser.h index 87df0af..e685ece 100644 --- a/unit-tests.wsjcpp/src/unit_test_line_parser.h +++ b/unit-tests.wsjcpp/src/unit_test_line_parser.h @@ -6,8 +6,9 @@ class UnitTestLineParser : public WsjcppUnitTestBase { public: UnitTestLineParser(); - virtual void init(); - virtual bool run(); + virtual bool doBeforeTest() override; + virtual void executeTest() override; + virtual bool doAfterTest() override; }; #endif // UNIT_TEST_LINE_PARSER_H \ No newline at end of file diff --git a/unit-tests.wsjcpp/src/unit_test_yaml_parser_all.cpp b/unit-tests.wsjcpp/src/unit_test_yaml_parser_all.cpp index e8630d6..0a11dba 100644 --- a/unit-tests.wsjcpp/src/unit_test_yaml_parser_all.cpp +++ b/unit-tests.wsjcpp/src/unit_test_yaml_parser_all.cpp @@ -13,13 +13,14 @@ UnitTestYamlParserAll::UnitTestYamlParserAll() // --------------------------------------------------------------------- -void UnitTestYamlParserAll::init() { +bool UnitTestYamlParserAll::doBeforeTest() { // nothing + return true; } // --------------------------------------------------------------------- -bool UnitTestYamlParserAll::run() { +void UnitTestYamlParserAll::executeTest() { std::string g_sTestYaml = "# Some comment 1\n" @@ -46,50 +47,51 @@ bool UnitTestYamlParserAll::run() { " test80: opa2" ; - bool bTestSuccess = true; - WsjcppYaml yaml; - if (yaml.loadFromString(g_sTestYaml)) { - WsjcppLog::throw_err(TAG, "Error parsing"); - return -1; + if (!compare("Error parsing", yaml.loadFromString(g_sTestYaml), true)) { + return; } + std::string sSaved = ""; if (yaml.saveToString(sSaved)) { WsjcppLog::info(TAG, "\n>>>>\n" + sSaved); } WsjcppYamlItem *pItem = nullptr; - compareS(bTestSuccess, "test10", yaml.getRoot()->getElement("test10")->getValue(), "two"); - compareS(bTestSuccess, "test20", yaml.getRoot()->getElement("test20")->getValue(), "two"); + compare("test10", yaml.getRoot()->getElement("test10")->getValue(), "one"); + compare("test20", yaml.getRoot()->getElement("test20")->getValue(), "two"); pItem = yaml.getRoot()->getElement("array30"); - compareN(bTestSuccess, "array30_length", pItem->getLength(), 3); + compare("array30_length", pItem->getLength(), 3); pItem = yaml.getRoot()->getElement("array30")->getElement(0); - compareS(bTestSuccess, "test30_value", pItem->getValue(), "one31"); - compareS(bTestSuccess, "test30_comment", pItem->getComment(), "this field for test array30"); + compare("test30_value", pItem->getValue(), "one31"); + compare("test30_comment", pItem->getComment(), "this field for test array30"); pItem = yaml.getRoot()->getElement("array30")->getElement(1); - compareS(bTestSuccess, "test40_value", pItem->getValue(), "two32"); - compareS(bTestSuccess, "test40_comment", pItem->getComment(), ""); + compare("test40_value", pItem->getValue(), "two32"); + compare("test40_comment", pItem->getComment(), ""); pItem = yaml.getRoot()->getElement("array40"); - compareN(bTestSuccess, "array40_length", pItem->getLength(), 2); + compare("array40_length", pItem->getLength(), 2); pItem = yaml.getRoot()->getElement("array50"); - compareN(bTestSuccess, "array50_length", pItem->getLength(), 1); + compare("array50_length", pItem->getLength(), 2); pItem = yaml.getRoot()->getElement("map60")->getElement("test70"); - compareS(bTestSuccess, "test70_value", pItem->getValue(), "opa1"); + compare("test70_value", pItem->getValue(), "opa1"); pItem = yaml.getRoot()->getElement("map60")->getElement("test80"); - compareS(bTestSuccess, "test80_comment", pItem->getValue(), "opa2"); + compare("test80_comment", pItem->getValue(), "opa2"); sSaved = ""; - if (yaml.saveToString(sSaved)) { - compareS(bTestSuccess, "yaml_save", sSaved, g_sTestYaml); - } else { - WsjcppLog::err(TAG, "Could not save to string"); - bTestSuccess = false; + if (compare("save yaml", yaml.saveToString(sSaved), true)) { + compare("yaml_save", sSaved, g_sTestYaml); } - return bTestSuccess; -} \ No newline at end of file +} + +// --------------------------------------------------------------------- + +bool UnitTestYamlParserAll::doAfterTest() { + // nothing + return true; +} diff --git a/unit-tests.wsjcpp/src/unit_test_yaml_parser_all.h b/unit-tests.wsjcpp/src/unit_test_yaml_parser_all.h index 529320e..2383eef 100644 --- a/unit-tests.wsjcpp/src/unit_test_yaml_parser_all.h +++ b/unit-tests.wsjcpp/src/unit_test_yaml_parser_all.h @@ -6,8 +6,9 @@ class UnitTestYamlParserAll : public WsjcppUnitTestBase { public: UnitTestYamlParserAll(); - virtual void init(); - virtual bool run(); + virtual bool doBeforeTest() override; + virtual void executeTest() override; + virtual bool doAfterTest() override; }; #endif // UNIT_TEST_YAML_PARSER_ALL_H \ No newline at end of file diff --git a/unit-tests.wsjcpp/src/unit_test_yaml_parser_array_included_map.cpp b/unit-tests.wsjcpp/src/unit_test_yaml_parser_array_included_map.cpp index 9eec68b..1467d64 100644 --- a/unit-tests.wsjcpp/src/unit_test_yaml_parser_array_included_map.cpp +++ b/unit-tests.wsjcpp/src/unit_test_yaml_parser_array_included_map.cpp @@ -12,13 +12,14 @@ UnitTestYamlParserArrayIncludedMap::UnitTestYamlParserArrayIncludedMap() // --------------------------------------------------------------------- -void UnitTestYamlParserArrayIncludedMap::init() { +bool UnitTestYamlParserArrayIncludedMap::doBeforeTest() { // nothing + return true; } // --------------------------------------------------------------------- -bool UnitTestYamlParserArrayIncludedMap::run() { +void UnitTestYamlParserArrayIncludedMap::executeTest() { std::string g_sTestYaml = "#test array included map\n" @@ -35,52 +36,49 @@ bool UnitTestYamlParserArrayIncludedMap::run() { " submap-param2: v12\n" "param2: v2\n" ; - - bool bTestSuccess = true; WsjcppYaml yaml; - if (!yaml.loadFromString(g_sTestYaml)) { - WsjcppLog::err(TAG, "Error parsing"); - return false; + if (!compare("Error parsing", yaml.loadFromString(g_sTestYaml), true)) { + return; } WsjcppYamlItem *pItem = nullptr; - compareS(bTestSuccess, "param1-value", yaml.getRoot()->getElement("param1")->getValue(), "none value1"); - compareS(bTestSuccess, "param1-line", yaml.getRoot()->getElement("param1")->getPlaceInFile().getLine(), "param1: none value1 # it's value for something # olala "); - compareN(bTestSuccess, "param1-original-number-of-line", yaml.getRoot()->getElement("param1")->getPlaceInFile().getNumberOfLine(), 1); - compareS(bTestSuccess, "param1-comment", yaml.getRoot()->getElement("param1")->getComment(), "it's value for something # olala"); + compare("param1-value", yaml.getRoot()->getElement("param1")->getValue(), "none value1"); + compare("param1-line", yaml.getRoot()->getElement("param1")->getPlaceInFile().getLine(), "param1: none value1 # it's value for something # olala "); + compare("param1-original-number-of-line", yaml.getRoot()->getElement("param1")->getPlaceInFile().getNumberOfLine(), 1); + compare("param1-comment", yaml.getRoot()->getElement("param1")->getComment(), "it's value for something # olala"); - compareN(bTestSuccess, "array-test2-length", yaml.getRoot()->getElement("array-test2")->getLength(), 3); - compareS(bTestSuccess, "array-test2-comment", yaml.getRoot()->getElement("array-test2")->getComment(), "some comment 2"); + compare("array-test2-length", yaml.getRoot()->getElement("array-test2")->getLength(), 3); + compare("array-test2-comment", yaml.getRoot()->getElement("array-test2")->getComment(), "some comment 2"); pItem = yaml.getRoot()->getElement("array-test2")->getElement(0); - compareS(bTestSuccess, "array-test2-element0-value", pItem->getValue(), "value21"); - compareS(bTestSuccess, "array-test2-element0-comment", pItem->getComment(), "comment v21"); + compare("array-test2-element0-value", pItem->getValue(), "value21"); + compare("array-test2-element0-comment", pItem->getComment(), "comment v21"); pItem = yaml.getRoot()->getElement("array-test2")->getElement(1); - compareS(bTestSuccess, "array-test2-element1-value", yaml["array-test2"][1].getValue(), "value22"); - compareS(bTestSuccess, "array-test2-element1-comment", yaml["array-test2"][1].getComment(), "comment v22"); + compare("array-test2-element1-value", yaml["array-test2"][1].getValue(), "value22"); + compare("array-test2-element1-comment", yaml["array-test2"][1].getComment(), "comment v22"); pItem = yaml.getRoot()->getElement("array-test2")->getElement(2); - compareS(bTestSuccess, "array-test2-element2-value", pItem->getValue(), "true"); - compareS(bTestSuccess, "array-test2-element2-comment", pItem->getComment(), "comment true"); + compare("array-test2-element2-value", pItem->getValue(), "true"); + compare("array-test2-element2-comment", pItem->getComment(), "comment true"); - compareN(bTestSuccess, "array-and-map-length", yaml["array-and-map"].getLength(), 2); + compare("array-and-map-length", yaml["array-and-map"].getLength(), 2); pItem = yaml.getRoot()->getElement("array-and-map")->getElement(0); - compareS(bTestSuccess, "array-and-map-element0-value", pItem->getElement("submap-param1")->getValue(), "v01"); - compareS(bTestSuccess, "array-and-map-element0-value", pItem->getElement("submap-param2")->getValue(), "v02"); + compare("array-and-map-element0-value", pItem->getElement("submap-param1")->getValue(), "v01"); + compare("array-and-map-element0-value", pItem->getElement("submap-param2")->getValue(), "v02"); pItem = yaml.getRoot()->getElement("array-and-map")->getElement(1); - compareS(bTestSuccess, "array-and-map-element1-value", pItem->getElement("submap-param1")->getValue(), "v11"); - compareS(bTestSuccess, "array-and-map-element1-value", pItem->getElement("submap-param2")->getValue(), "v12"); + compare("array-and-map-element1-value", pItem->getElement("submap-param1")->getValue(), "v11"); + compare("array-and-map-element1-value", pItem->getElement("submap-param2")->getValue(), "v12"); - compareS(bTestSuccess, "param2-value", yaml.getRoot()->getElement("param2")->getValue(), "v2"); + compare("param2-value", yaml.getRoot()->getElement("param2")->getValue(), "v2"); std::string sSaved = ""; - if (yaml.saveToString(sSaved)) { - compareS(bTestSuccess, "yaml_save", sSaved, + if (compare("save yaml", yaml.saveToString(sSaved), true)) { + compare("yaml_save", sSaved, "# test array included map\n" // expected "param1: none value1 # it's value for something # olala\n" "array-test2: # some comment 2\n" @@ -95,9 +93,12 @@ bool UnitTestYamlParserArrayIncludedMap::run() { " submap-param2: v12\n" "param2: v2" ); - } else { - WsjcppLog::err(TAG, "Could not save to string"); - bTestSuccess = false; } - return bTestSuccess; +} + +// --------------------------------------------------------------------- + +bool UnitTestYamlParserArrayIncludedMap::doAfterTest() { + // nothing + return true; } \ No newline at end of file diff --git a/unit-tests.wsjcpp/src/unit_test_yaml_parser_array_included_map.h b/unit-tests.wsjcpp/src/unit_test_yaml_parser_array_included_map.h index 50956e0..97cfbc1 100644 --- a/unit-tests.wsjcpp/src/unit_test_yaml_parser_array_included_map.h +++ b/unit-tests.wsjcpp/src/unit_test_yaml_parser_array_included_map.h @@ -6,8 +6,9 @@ class UnitTestYamlParserArrayIncludedMap : public WsjcppUnitTestBase { public: UnitTestYamlParserArrayIncludedMap(); - virtual void init(); - virtual bool run(); + virtual bool doBeforeTest() override; + virtual void executeTest() override; + virtual bool doAfterTest() override; }; #endif // UNIT_TEST_YAML_PARSER_ARRAY_INCLUDED_MAP_H \ No newline at end of file diff --git a/unit-tests.wsjcpp/src/unit_test_yaml_parser_comments.cpp b/unit-tests.wsjcpp/src/unit_test_yaml_parser_comments.cpp index cd09df3..b0ad677 100644 --- a/unit-tests.wsjcpp/src/unit_test_yaml_parser_comments.cpp +++ b/unit-tests.wsjcpp/src/unit_test_yaml_parser_comments.cpp @@ -12,13 +12,14 @@ UnitTestYamlParserComments::UnitTestYamlParserComments() // --------------------------------------------------------------------- -void UnitTestYamlParserComments::init() { +bool UnitTestYamlParserComments::doBeforeTest() { // nothing + return true; } // --------------------------------------------------------------------- -bool UnitTestYamlParserComments::run() { +void UnitTestYamlParserComments::executeTest() { std::string g_sTestYaml = "# Some comment 1\n" @@ -36,61 +37,62 @@ bool UnitTestYamlParserComments::run() { " p2: val 2 # comment 12\n" ; - bool bTestSuccess = true; + WsjcppYaml yaml; - if (!yaml.loadFromString(g_sTestYaml)) { - WsjcppLog::err(TAG, "Error parsing"); - return false; + if (!compare("Error parsing", yaml.loadFromString(g_sTestYaml), true)) { + return; } // TODO: .findLine(0) - compareS(bTestSuccess, "param1", yaml["param1"].getValue(), "value1"); - compareS(bTestSuccess, "param1", yaml["param1"].getComment(), "comment 2 # comment"); + compare("param1", yaml["param1"].getValue(), "value1"); + compare("param1", yaml["param1"].getComment(), "comment 2 # comment"); - compareS(bTestSuccess, "param2", yaml["param2"].getValue(), "value2"); - compareS(bTestSuccess, "param2", yaml["param2"].getComment(), "some \"comment 3\""); + compare("param2", yaml["param2"].getValue(), "value2"); + compare("param2", yaml["param2"].getComment(), "some \"comment 3\""); - compareS(bTestSuccess, "array1-comment", yaml["array1"].getComment(), "comment 5"); - compareN(bTestSuccess, "array1-length", yaml["array1"].getLength(), 2); - compareS(bTestSuccess, "array1-element0-value", yaml["array1"][0].getValue(), "val1"); - compareS(bTestSuccess, "array1-element0-comment", yaml["array1"][0].getComment(), "comment 6"); + compare("array1-comment", yaml["array1"].getComment(), "comment 5"); + compare("array1-length", yaml["array1"].getLength(), 2); + compare("array1-element0-value", yaml["array1"][0].getValue(), "val1"); + compare("array1-element0-comment", yaml["array1"][0].getComment(), "comment 6"); // TODO: .findLine(7) - compareS(bTestSuccess, "array1-element1-value", yaml["array1"][1].getValue(), "val2"); - compareS(bTestSuccess, "array1-element1-comment", yaml["array1"][1].getComment(), "comment 8"); + compare("array1-element1-value", yaml["array1"][1].getValue(), "val2"); + compare("array1-element1-comment", yaml["array1"][1].getComment(), "comment 8"); - compareS(bTestSuccess, "map1-comment", yaml["map1"].getComment(), "comment 9"); - compareS(bTestSuccess, "map1-p1-comment", yaml["map1"]["p1"].getComment(), "comment 10"); - compareS(bTestSuccess, "map1-p2-comment", yaml["map1"]["p2"].getComment(), "comment 12"); + compare("map1-comment", yaml["map1"].getComment(), "comment 9"); + compare("map1-p1-comment", yaml["map1"]["p1"].getComment(), "comment 10"); + compare("map1-p2-comment", yaml["map1"]["p2"].getComment(), "comment 12"); - // compareS(bTestSuccess, "param2", yaml.getRoot()->getElement("param2")->getValue(), "value2"); - // compareS(bTestSuccess, "param2", yaml.getRoot()->getElement("param2")->getComment(), "some comment 2"); + // compare("param2", yaml.getRoot()->getElement("param2")->getValue(), "value2"); + // compare("param2", yaml.getRoot()->getElement("param2")->getComment(), "some comment 2"); std::string sSaved = ""; - if (yaml.saveToString(sSaved)) { - compareS(bTestSuccess, "yaml_save", sSaved, - "# Some comment 1\n" - "param1: value1 # comment 2 # comment\n" - "param2: value2 # some \"comment 3\"\n" - "# Some comment 4\n" - "array1: # comment 5\n" - " - val1 # comment 6\n" - " # comment 7\n" - " \n" - " - val2 # comment 8\n" - "map1: # comment 9\n" - " p1: val 1 # comment 10\n" - " # comment 11\n" - " p2: val 2 # comment 12" - ); - } else { - WsjcppLog::err(TAG, "Could not save to string"); - bTestSuccess = false; - } - return bTestSuccess; -} \ No newline at end of file + compare("save yaml", yaml.saveToString(sSaved), true); + compare("yaml_save", sSaved, + "# Some comment 1\n" + "param1: value1 # comment 2 # comment\n" + "param2: value2 # some \"comment 3\"\n" + "# Some comment 4\n" + "array1: # comment 5\n" + " - val1 # comment 6\n" + " # comment 7\n" + " \n" + " - val2 # comment 8\n" + "map1: # comment 9\n" + " p1: val 1 # comment 10\n" + " # comment 11\n" + " p2: val 2 # comment 12" + ); +} + +// --------------------------------------------------------------------- + +bool UnitTestYamlParserComments::doAfterTest() { + // nothing + return true; +} diff --git a/unit-tests.wsjcpp/src/unit_test_yaml_parser_comments.h b/unit-tests.wsjcpp/src/unit_test_yaml_parser_comments.h index 195e397..0acc039 100644 --- a/unit-tests.wsjcpp/src/unit_test_yaml_parser_comments.h +++ b/unit-tests.wsjcpp/src/unit_test_yaml_parser_comments.h @@ -6,8 +6,9 @@ class UnitTestYamlParserComments : public WsjcppUnitTestBase { public: UnitTestYamlParserComments(); - virtual void init(); - virtual bool run(); + virtual bool doBeforeTest() override; + virtual void executeTest() override; + virtual bool doAfterTest() override; }; #endif // UNIT_TEST_YAML_PARSER_COMMENTS_H \ No newline at end of file diff --git a/unit-tests.wsjcpp/src/unit_test_yaml_parser_hierarchical_map.cpp b/unit-tests.wsjcpp/src/unit_test_yaml_parser_hierarchical_map.cpp index cb59007..d218a4f 100644 --- a/unit-tests.wsjcpp/src/unit_test_yaml_parser_hierarchical_map.cpp +++ b/unit-tests.wsjcpp/src/unit_test_yaml_parser_hierarchical_map.cpp @@ -12,13 +12,14 @@ UnitTestYamlParserHierarchicalMap::UnitTestYamlParserHierarchicalMap() // --------------------------------------------------------------------- -void UnitTestYamlParserHierarchicalMap::init() { +bool UnitTestYamlParserHierarchicalMap::doBeforeTest() { // nothing + return true; } // --------------------------------------------------------------------- -bool UnitTestYamlParserHierarchicalMap::run() { +void UnitTestYamlParserHierarchicalMap::executeTest() { std::string g_sTestYaml = "# Some comment 1\n" @@ -42,43 +43,41 @@ bool UnitTestYamlParserHierarchicalMap::run() { "param2: v2 # some comment 2\n" "\n" // empty line ; - - bool bTestSuccess = true; WsjcppYaml yaml; - if (!yaml.loadFromString(g_sTestYaml)) { - WsjcppLog::err(TAG, "Error parsing"); - return false; + if (!compare("Error parsing", yaml.loadFromString(g_sTestYaml), true)) { + return; } WsjcppYamlItem *pItem = nullptr; pItem = yaml.getRoot()->getElement("map1")->getElement("map11")->getElement("map111"); - compareS(bTestSuccess, "param1111", pItem->getElement("param1111")->getValue(), "v1111"); - compareS(bTestSuccess, "param1112", pItem->getElement("param1112")->getValue(), "v1112"); + compare("param1111", pItem->getElement("param1111")->getValue(), "v1111"); + compare("param1112", pItem->getElement("param1112")->getValue(), "v1112"); pItem = yaml.getRoot()->getElement("map1")->getElement("map11")->getElement("map112"); - compareS(bTestSuccess, "param1121", pItem->getElement("param1121")->getValue(), "v1121"); - compareS(bTestSuccess, "param1122", pItem->getElement("param1122")->getValue(), "v1122"); + compare("param1121", pItem->getElement("param1121")->getValue(), "v1121"); + compare("param1122", pItem->getElement("param1122")->getValue(), "v1122"); pItem = yaml.getRoot()->getElement("map1")->getElement("map11")->getElement("map113"); - compareS(bTestSuccess, "param1131", pItem->getElement("param1131")->getValue(), "v1131"); - compareS(bTestSuccess, "param1132", pItem->getElement("param1132")->getValue(), "v1132"); + compare("param1131", pItem->getElement("param1131")->getValue(), "v1131"); + compare("param1132", pItem->getElement("param1132")->getValue(), "v1132"); pItem = yaml.getRoot()->getElement("map1")->getElement("map12"); - compareS(bTestSuccess, "param121", pItem->getElement("param121")->getValue(), "v121"); - compareS(bTestSuccess, "param122", pItem->getElement("param122")->getValue(), "v122"); + compare("param121", pItem->getElement("param121")->getValue(), "v121"); + compare("param122", pItem->getElement("param122")->getValue(), "v122"); pItem = yaml.getRoot()->getElement("map1")->getElement("map12")->getElement("map123"); - compareS(bTestSuccess, "param1231", pItem->getElement("param1231")->getValue(), "v1231"); - compareS(bTestSuccess, "param1232", pItem->getElement("param1232")->getValue(), "v1232"); + compare("param1231", pItem->getElement("param1231")->getValue(), "v1231"); + compare("param1232", pItem->getElement("param1232")->getValue(), "v1232"); - compareS(bTestSuccess, "param2", yaml.getRoot()->getElement("param2")->getValue(), "v2"); - compareS(bTestSuccess, "param2", yaml.getRoot()->getElement("param2")->getComment(), "some comment 2"); + compare("param2", yaml.getRoot()->getElement("param2")->getValue(), "v2"); + compare("param2", yaml.getRoot()->getElement("param2")->getComment(), "some comment 2"); std::string sSaved = ""; - if (yaml.saveToString(sSaved)) { - compareS(bTestSuccess, "yaml_save", sSaved, + bool bResult = yaml.saveToString(sSaved); + if (compare("save yaml", bResult, true)) { + compare("yaml_save", sSaved, "# Some comment 1\n" "map1:\n" " map11:\n" @@ -99,9 +98,12 @@ bool UnitTestYamlParserHierarchicalMap::run() { " param1232: v1232\n" "param2: v2 # some comment 2" ); - } else { - WsjcppLog::err(TAG, "Could not save to string"); - bTestSuccess = false; } - return bTestSuccess; +} + +// --------------------------------------------------------------------- + +bool UnitTestYamlParserHierarchicalMap::doAfterTest() { + // nothing + return true; } \ No newline at end of file diff --git a/unit-tests.wsjcpp/src/unit_test_yaml_parser_hierarchical_map.h b/unit-tests.wsjcpp/src/unit_test_yaml_parser_hierarchical_map.h index b396495..f3b7541 100644 --- a/unit-tests.wsjcpp/src/unit_test_yaml_parser_hierarchical_map.h +++ b/unit-tests.wsjcpp/src/unit_test_yaml_parser_hierarchical_map.h @@ -6,8 +6,9 @@ class UnitTestYamlParserHierarchicalMap : public WsjcppUnitTestBase { public: UnitTestYamlParserHierarchicalMap(); - virtual void init(); - virtual bool run(); + virtual bool doBeforeTest() override; + virtual void executeTest() override; + virtual bool doAfterTest() override; }; #endif // UNIT_TEST_YAML_PARSER_HIERARCHICAL_MAP_H \ No newline at end of file diff --git a/unit-tests.wsjcpp/src/unit_test_yaml_parser_quotes.cpp b/unit-tests.wsjcpp/src/unit_test_yaml_parser_quotes.cpp index 74c07b5..b913b9f 100644 --- a/unit-tests.wsjcpp/src/unit_test_yaml_parser_quotes.cpp +++ b/unit-tests.wsjcpp/src/unit_test_yaml_parser_quotes.cpp @@ -12,13 +12,14 @@ UnitTestYamlParserQuotes::UnitTestYamlParserQuotes() // --------------------------------------------------------------------- -void UnitTestYamlParserQuotes::init() { +bool UnitTestYamlParserQuotes::doBeforeTest() { // nothing + return true; } // --------------------------------------------------------------------- -bool UnitTestYamlParserQuotes::run() { +void UnitTestYamlParserQuotes::executeTest() { std::string g_sTestYaml = "# Some comment 1\n" @@ -32,47 +33,48 @@ bool UnitTestYamlParserQuotes::run() { " - \"https://github.com/wsjcpp/wsjcpp-core:v0.0.1\"\n" ; - bool bTestSuccess = true; + WsjcppYaml yaml; - if (!yaml.loadFromString(g_sTestYaml)) { - WsjcppLog::err(TAG, "Error parsing"); - return false; + if (!compare("Error parsing", yaml.loadFromString(g_sTestYaml), true)) { + return; } // TODO: .findLine(0) - compareS(bTestSuccess, "param1", yaml["param1"].getValue(), "value1"); - compareS(bTestSuccess, "param1", yaml["param1"].getComment(), "v1"); + compare("param1", yaml["param1"].getValue(), "value1"); + compare("param1", yaml["param1"].getComment(), "v1"); - compareS(bTestSuccess, "param2", yaml["param2"].getValue(), " #$!!!value2"); - compareS(bTestSuccess, "param2", yaml["param2"].getComment(), "val 2"); + compare("param2", yaml["param2"].getValue(), " #$!!!value2"); + compare("param2", yaml["param2"].getComment(), "val 2"); - compareS(bTestSuccess, " param3 olala", yaml[" param3 olala"].getValue(), "val 3"); - compareS(bTestSuccess, " param3 olala", yaml[" param3 olala"].getComment(), "val 3***"); + compare(" param3 olala", yaml[" param3 olala"].getValue(), "val 3"); + compare(" param3 olala", yaml[" param3 olala"].getComment(), "val 3***"); - compareS(bTestSuccess, "url-value", yaml["url"].getValue(), "https://github.com/wsjcpp/wsjcpp-yaml"); - compareS(bTestSuccess, "issues-value", yaml["issues"].getValue(), "https://github.com/wsjcpp/wsjcpp-yaml/issues"); - compareS(bTestSuccess, "empty-value", yaml["empty"].getValue(), ""); + compare("url-value", yaml["url"].getValue(), "https://github.com/wsjcpp/wsjcpp-yaml"); + compare("issues-value", yaml["issues"].getValue(), "https://github.com/wsjcpp/wsjcpp-yaml/issues"); + compare("empty-value", yaml["empty"].getValue(), ""); - compareS(bTestSuccess, "array-element0-value", yaml["array"][0].getValue(), "https://github.com/wsjcpp/wsjcpp-core:v0.0.1"); + compare("array-element0-value", yaml["array"][0].getValue(), "https://github.com/wsjcpp/wsjcpp-core:v0.0.1"); std::string sSaved = ""; - if (yaml.saveToString(sSaved)) { - compareS(bTestSuccess, "yaml_save", sSaved, - "# Some comment 1\n" - "param1: \"value1\" # v1\n" - "param2: \" #$!!!value2\" # val 2\n" - "\" param3 olala\": val 3 # val 3***\n" - "url: \"https://github.com/wsjcpp/wsjcpp-yaml\"\n" - "issues: https://github.com/wsjcpp/wsjcpp-yaml/issues\n" - "empty: \"\"\n" - "array:\n" - " - \"https://github.com/wsjcpp/wsjcpp-core:v0.0.1\"" - ); - } else { - WsjcppLog::err(TAG, "Could not save to string"); - bTestSuccess = false; - } - return bTestSuccess; + compare("save yaml", yaml.saveToString(sSaved), true); + compare("yaml_save", sSaved, + "# Some comment 1\n" + "param1: \"value1\" # v1\n" + "param2: \" #$!!!value2\" # val 2\n" + "\" param3 olala\": val 3 # val 3***\n" + "url: \"https://github.com/wsjcpp/wsjcpp-yaml\"\n" + "issues: https://github.com/wsjcpp/wsjcpp-yaml/issues\n" + "empty: \"\"\n" + "array:\n" + " - \"https://github.com/wsjcpp/wsjcpp-core:v0.0.1\"" + ); +} + +// --------------------------------------------------------------------- + +bool UnitTestYamlParserQuotes::doAfterTest() { + // nothing + return true; } \ No newline at end of file diff --git a/unit-tests.wsjcpp/src/unit_test_yaml_parser_quotes.h b/unit-tests.wsjcpp/src/unit_test_yaml_parser_quotes.h index a4ab171..21d379c 100644 --- a/unit-tests.wsjcpp/src/unit_test_yaml_parser_quotes.h +++ b/unit-tests.wsjcpp/src/unit_test_yaml_parser_quotes.h @@ -6,8 +6,9 @@ class UnitTestYamlParserQuotes : public WsjcppUnitTestBase { public: UnitTestYamlParserQuotes(); - virtual void init(); - virtual bool run(); + virtual bool doBeforeTest() override; + virtual void executeTest() override; + virtual bool doAfterTest() override; }; #endif // UNIT_TEST_YAML_PARSER_QUOTES_H \ No newline at end of file diff --git a/unit-tests.wsjcpp/src/unit_test_yaml_parser_simple_array.cpp b/unit-tests.wsjcpp/src/unit_test_yaml_parser_simple_array.cpp index 8cbbfba..76d4013 100644 --- a/unit-tests.wsjcpp/src/unit_test_yaml_parser_simple_array.cpp +++ b/unit-tests.wsjcpp/src/unit_test_yaml_parser_simple_array.cpp @@ -12,13 +12,14 @@ UnitTestYamlParserSimpleArray::UnitTestYamlParserSimpleArray() // --------------------------------------------------------------------- -void UnitTestYamlParserSimpleArray::init() { +bool UnitTestYamlParserSimpleArray::doBeforeTest() { // nothing + return true; } // --------------------------------------------------------------------- -bool UnitTestYamlParserSimpleArray::run() { +void UnitTestYamlParserSimpleArray::executeTest() { std::string g_sTestYaml = "# simple array test\n" @@ -34,82 +35,82 @@ bool UnitTestYamlParserSimpleArray::run() { " - 1\n" "param2: val2 # value 2 \n" ; - - bool bTestSuccess = true; WsjcppYaml yaml; - if (!yaml.loadFromString(g_sTestYaml)) { - WsjcppLog::err(TAG, "Error parsing"); - return false; + if (!compare("Error parsing", yaml.loadFromString(g_sTestYaml), true)) { + return; } WsjcppYamlItem *pItem = nullptr; - compareS(bTestSuccess, "param1-value", yaml.getRoot()->getElement("param1")->getValue(), "none value1"); - compareS(bTestSuccess, "param1-line", yaml.getRoot()->getElement("param1")->getPlaceInFile().getLine(), "param1: none value1 # it's value for something # olala "); - compareN(bTestSuccess, "param1-original-number-of-line", yaml.getRoot()->getElement("param1")->getPlaceInFile().getNumberOfLine(), 1); - compareS(bTestSuccess, "param1-comment", yaml.getRoot()->getElement("param1")->getComment(), "it's value for something # olala"); + compare("param1-value", yaml.getRoot()->getElement("param1")->getValue(), "none value1"); + compare("param1-line", yaml.getRoot()->getElement("param1")->getPlaceInFile().getLine(), "param1: none value1 # it's value for something # olala "); + compare("param1-original-number-of-line", yaml.getRoot()->getElement("param1")->getPlaceInFile().getNumberOfLine(), 1); + compare("param1-comment", yaml.getRoot()->getElement("param1")->getComment(), "it's value for something # olala"); - compareN(bTestSuccess, "array-test2-length", yaml.getRoot()->getElement("array-test2")->getLength(), 7); - compareS(bTestSuccess, "array-test2-comment", yaml.getRoot()->getElement("array-test2")->getComment(), "some comment 2"); + compare("array-test2-length", yaml.getRoot()->getElement("array-test2")->getLength(), 7); + compare("array-test2-comment", yaml.getRoot()->getElement("array-test2")->getComment(), "some comment 2"); pItem = yaml.getRoot()->getElement("array-test2")->getElement(0); - compareS(bTestSuccess, "array-test2-element0-value", pItem->getValue(), "value21"); - compareS(bTestSuccess, "array-test2-element0-comment", pItem->getComment(), "comment v21"); + compare("array-test2-element0-value", pItem->getValue(), "value21"); + compare("array-test2-element0-comment", pItem->getComment(), "comment v21"); pItem = yaml.getRoot()->getElement("array-test2")->getElement(1); - compareS(bTestSuccess, "array-test2-element1-value", pItem->getValue(), "value22"); - compareS(bTestSuccess, "array-test2-element1-comment", pItem->getComment(), "comment v22"); - - compareS(bTestSuccess, "array-test2-element2-value", yaml["array-test2"][2].getValue(), "true"); - compareS(bTestSuccess, "array-test2-element2-line", yaml["array-test2"][2].getPlaceInFile().getLine(), " - true # comment true "); - compareN(bTestSuccess, "array-test2-element2-original-number-of-line", yaml["array-test2"][2].getPlaceInFile().getNumberOfLine(), 5); - compareS(bTestSuccess, "array-test2-element2-comment", yaml["array-test2"][2].getComment(), "comment true"); - - compareS(bTestSuccess, "array-test2-element3-value", yaml["array-test2"][3].getValue(), "falsesome"); - compareS(bTestSuccess, "array-test2-element3-line", yaml["array-test2"][3].getPlaceInFile().getLine(), " - falsesome "); - compareN(bTestSuccess, "array-test2-element3-original-number-of-line", yaml["array-test2"][3].getPlaceInFile().getNumberOfLine(), 7); - compareS(bTestSuccess, "array-test2-element3-comment", yaml["array-test2"][3].getComment(), ""); + compare("array-test2-element1-value", pItem->getValue(), "value22"); + compare("array-test2-element1-comment", pItem->getComment(), "comment v22"); + + compare("array-test2-element2-value", yaml["array-test2"][2].getValue(), "true"); + compare("array-test2-element2-line", yaml["array-test2"][2].getPlaceInFile().getLine(), " - true # comment true "); + compare("array-test2-element2-original-number-of-line", yaml["array-test2"][2].getPlaceInFile().getNumberOfLine(), 5); + compare("array-test2-element2-comment", yaml["array-test2"][2].getComment(), "comment true"); + + compare("array-test2-element3-value", yaml["array-test2"][3].getValue(), "falsesome"); + compare("array-test2-element3-line", yaml["array-test2"][3].getPlaceInFile().getLine(), " - falsesome "); + compare("array-test2-element3-original-number-of-line", yaml["array-test2"][3].getPlaceInFile().getNumberOfLine(), 7); + compare("array-test2-element3-comment", yaml["array-test2"][3].getComment(), ""); - compareS(bTestSuccess, "array-test2-element4-value", yaml["array-test2"][4].getValue(), "free@free"); - compareS(bTestSuccess, "array-test2-element4-line", yaml["array-test2"][4].getPlaceInFile().getLine(), " - free@free "); - compareN(bTestSuccess, "array-test2-element4-original-number-of-line", yaml["array-test2"][4].getPlaceInFile().getNumberOfLine(), 8); - compareS(bTestSuccess, "array-test2-element4-comment", yaml["array-test2"][4].getComment(), ""); - - compareS(bTestSuccess, "array-test2-element5-value", yaml["array-test2"][5].getValue(), ""); - compareS(bTestSuccess, "array-test2-element5-line", yaml["array-test2"][5].getPlaceInFile().getLine(), " - # empty "); - compareN(bTestSuccess, "array-test2-element5-original-number-of-line", yaml["array-test2"][5].getPlaceInFile().getNumberOfLine(), 9); - compareS(bTestSuccess, "array-test2-element5-comment", yaml["array-test2"][5].getComment(), "empty"); - - compareS(bTestSuccess, "array-test2-element6-value", yaml["array-test2"][6].getValue(), "1"); - compareS(bTestSuccess, "array-test2-element6-line", yaml["array-test2"][6].getPlaceInFile().getLine(), " - 1"); - compareN(bTestSuccess, "array-test2-element6-original-number-of-line", yaml["array-test2"][6].getPlaceInFile().getNumberOfLine(), 10); - compareS(bTestSuccess, "array-test2-element6-comment", yaml["array-test2"][6].getComment(), ""); - - compareS(bTestSuccess, "param2-value", yaml.getRoot()->getElement("param2")->getValue(), "val2"); - compareS(bTestSuccess, "param2-line", yaml.getRoot()->getElement("param2")->getPlaceInFile().getLine(), "param2: val2 # value 2 "); - compareN(bTestSuccess, "param2-original-number-of-line", yaml.getRoot()->getElement("param2")->getPlaceInFile().getNumberOfLine(), 11); - compareS(bTestSuccess, "param2-comment", yaml.getRoot()->getElement("param2")->getComment(), "value 2"); + compare("array-test2-element4-value", yaml["array-test2"][4].getValue(), "free@free"); + compare("array-test2-element4-line", yaml["array-test2"][4].getPlaceInFile().getLine(), " - free@free "); + compare("array-test2-element4-original-number-of-line", yaml["array-test2"][4].getPlaceInFile().getNumberOfLine(), 8); + compare("array-test2-element4-comment", yaml["array-test2"][4].getComment(), ""); + + compare("array-test2-element5-value", yaml["array-test2"][5].getValue(), ""); + compare("array-test2-element5-line", yaml["array-test2"][5].getPlaceInFile().getLine(), " - # empty "); + compare("array-test2-element5-original-number-of-line", yaml["array-test2"][5].getPlaceInFile().getNumberOfLine(), 9); + compare("array-test2-element5-comment", yaml["array-test2"][5].getComment(), "empty"); + + compare("array-test2-element6-value", yaml["array-test2"][6].getValue(), "1"); + compare("array-test2-element6-line", yaml["array-test2"][6].getPlaceInFile().getLine(), " - 1"); + compare("array-test2-element6-original-number-of-line", yaml["array-test2"][6].getPlaceInFile().getNumberOfLine(), 10); + compare("array-test2-element6-comment", yaml["array-test2"][6].getComment(), ""); + + compare("param2-value", yaml.getRoot()->getElement("param2")->getValue(), "val2"); + compare("param2-line", yaml.getRoot()->getElement("param2")->getPlaceInFile().getLine(), "param2: val2 # value 2 "); + compare("param2-original-number-of-line", yaml.getRoot()->getElement("param2")->getPlaceInFile().getNumberOfLine(), 11); + compare("param2-comment", yaml.getRoot()->getElement("param2")->getComment(), "value 2"); std::string sSaved = ""; - if (yaml.saveToString(sSaved)) { - compareS(bTestSuccess, "yaml_save", sSaved, - "# simple array test\n" // expected - "param1: none value1 # it's value for something # olala\n" - "array-test2: # some comment 2\n" - " - value21 # comment v21\n" - " - value22 # comment v22\n" - " - true # comment true\n" - " # some\n" - " - falsesome\n" - " - free@free\n" - " - # empty\n" - " - 1\n" - "param2: val2 # value 2" - ); - } else { - WsjcppLog::err(TAG, "Could not save to string"); - bTestSuccess = false; - } - return bTestSuccess; + bool bResult = yaml.saveToString(sSaved); + compare("save yaml", bResult, true); + compare("yaml_save", sSaved, + "# simple array test\n" // expected + "param1: none value1 # it's value for something # olala\n" + "array-test2: # some comment 2\n" + " - value21 # comment v21\n" + " - value22 # comment v22\n" + " - true # comment true\n" + " # some\n" + " - falsesome\n" + " - free@free\n" + " - # empty\n" + " - 1\n" + "param2: val2 # value 2" + ); +} + +// --------------------------------------------------------------------- + +bool UnitTestYamlParserSimpleArray::doAfterTest() { + // nothing + return true; } \ No newline at end of file diff --git a/unit-tests.wsjcpp/src/unit_test_yaml_parser_simple_array.h b/unit-tests.wsjcpp/src/unit_test_yaml_parser_simple_array.h index 3703a72..a9f29f7 100644 --- a/unit-tests.wsjcpp/src/unit_test_yaml_parser_simple_array.h +++ b/unit-tests.wsjcpp/src/unit_test_yaml_parser_simple_array.h @@ -6,8 +6,9 @@ class UnitTestYamlParserSimpleArray : public WsjcppUnitTestBase { public: UnitTestYamlParserSimpleArray(); - virtual void init(); - virtual bool run(); + virtual bool doBeforeTest() override; + virtual void executeTest() override; + virtual bool doAfterTest() override; }; #endif // UNIT_TEST_YAML_PARSER_SIMPLE_ARRAY_H \ No newline at end of file diff --git a/unit-tests.wsjcpp/src/unit_test_yaml_parser_simple_map.cpp b/unit-tests.wsjcpp/src/unit_test_yaml_parser_simple_map.cpp index 5d4e4d8..287ac6a 100644 --- a/unit-tests.wsjcpp/src/unit_test_yaml_parser_simple_map.cpp +++ b/unit-tests.wsjcpp/src/unit_test_yaml_parser_simple_map.cpp @@ -12,13 +12,14 @@ UnitTestYamlParserSimpleMap::UnitTestYamlParserSimpleMap() // --------------------------------------------------------------------- -void UnitTestYamlParserSimpleMap::init() { +bool UnitTestYamlParserSimpleMap::doBeforeTest() { // nothing + return true; } // --------------------------------------------------------------------- -bool UnitTestYamlParserSimpleMap::run() { +void UnitTestYamlParserSimpleMap::executeTest() { std::string g_sTestYaml = "# Some comment 1\n" @@ -26,30 +27,31 @@ bool UnitTestYamlParserSimpleMap::run() { "param2: value2 # some comment 2\n" "\n" // empty line ; - - bool bTestSuccess = true; WsjcppYaml yaml; - if (!yaml.loadFromString(g_sTestYaml)) { - WsjcppLog::err(TAG, "Error parsing"); - return false; + if (!compare("Error parsing", yaml.loadFromString(g_sTestYaml), true)) { + return; } WsjcppYamlItem *pItem = nullptr; - compareS(bTestSuccess, "param1", yaml.getRoot()->getElement("param1")->getValue(), "value1"); - compareS(bTestSuccess, "param2", yaml.getRoot()->getElement("param2")->getValue(), "value2"); - compareS(bTestSuccess, "param2", yaml.getRoot()->getElement("param2")->getComment(), "some comment 2"); + compare("param1", yaml.getRoot()->getElement("param1")->getValue(), "value1"); + compare("param2", yaml.getRoot()->getElement("param2")->getValue(), "value2"); + compare("param2", yaml.getRoot()->getElement("param2")->getComment(), "some comment 2"); std::string sSaved = ""; - if (yaml.saveToString(sSaved)) { - compareS(bTestSuccess, "yaml_save", sSaved, + bool bResult = yaml.saveToString(sSaved); + if (compare("save yaml", bResult, true)) { + compare("yaml_save", sSaved, "# Some comment 1\n" "param1: value1\n" "param2: value2 # some comment 2" ); - } else { - WsjcppLog::err(TAG, "Could not save to string"); - bTestSuccess = false; } - return bTestSuccess; +} + +// --------------------------------------------------------------------- + +bool UnitTestYamlParserSimpleMap::doAfterTest() { + // nothing + return true; } \ No newline at end of file diff --git a/unit-tests.wsjcpp/src/unit_test_yaml_parser_simple_map.h b/unit-tests.wsjcpp/src/unit_test_yaml_parser_simple_map.h index d7b72a1..1f74d69 100644 --- a/unit-tests.wsjcpp/src/unit_test_yaml_parser_simple_map.h +++ b/unit-tests.wsjcpp/src/unit_test_yaml_parser_simple_map.h @@ -6,8 +6,9 @@ class UnitTestYamlParserSimpleMap : public WsjcppUnitTestBase { public: UnitTestYamlParserSimpleMap(); - virtual void init(); - virtual bool run(); + virtual bool doBeforeTest() override; + virtual void executeTest() override; + virtual bool doAfterTest() override; }; #endif // UNIT_TEST_YAML_PARSER_SIMPLE_MAP_H \ No newline at end of file diff --git a/wsjcpp.yml b/wsjcpp.yml index ddbf954..be57f36 100644 --- a/wsjcpp.yml +++ b/wsjcpp.yml @@ -27,7 +27,7 @@ required-libraries: dependencies: - name: "wsjcpp-core" - version: "v0.1.1" + version: "v0.2.1" url: "https://github.com/wsjcpp/wsjcpp-core:master" origin: "https://github.com/" installation-dir: "./src.wsjcpp/wsjcpp_core" @@ -50,3 +50,12 @@ unit-tests: description: Test Parse Map - name: YamlParserHierarchicalMap description: Test Hierarchical Map + - name: YamlParserQuotes + description: YamlParserQuotes + - name: YamlParserComments + description: YamlParserComments + - name: YamlParserAll + description: YamlParserAll + - name: YamlParserArrayIncludedMap + description: YamlParserArrayIncludedMap + From be4da0c5ff601682a530d037e12b81421eee3368 Mon Sep 17 00:00:00 2001 From: Evgenii Sopov Date: Sat, 19 Sep 2020 03:33:06 +0700 Subject: [PATCH 3/3] Updated README: added badges for lgtm --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 32d1562..96d0762 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # wsjcpp-yaml -[![Build Status](https://api.travis-ci.com/wsjcpp/wsjcpp-yaml.svg?branch=master)](https://travis-ci.com/wsjcpp/wsjcpp-yaml) [![Github Stars](https://img.shields.io/github/stars/wsjcpp/wsjcpp-yaml.svg?label=github%20%E2%98%85)](https://github.com/wsjcpp/wsjcpp-yaml) [![Github Stars](https://img.shields.io/github/contributors/wsjcpp/wsjcpp-yaml.svg)](https://github.com/wsjcpp/wsjcpp-yaml) [![Github Forks](https://img.shields.io/github/forks/wsjcpp/wsjcpp-yaml.svg?label=github%20forks)](https://github.com/wsjcpp/wsjcpp-yaml/network/members) +[![Build Status](https://api.travis-ci.com/wsjcpp/wsjcpp-yaml.svg?branch=master)](https://travis-ci.com/wsjcpp/wsjcpp-yaml) [![Github Stars](https://img.shields.io/github/stars/wsjcpp/wsjcpp-yaml.svg?label=github%20%E2%98%85)](https://github.com/wsjcpp/wsjcpp-yaml) [![Github Stars](https://img.shields.io/github/contributors/wsjcpp/wsjcpp-yaml.svg)](https://github.com/wsjcpp/wsjcpp-yaml) [![Github Forks](https://img.shields.io/github/forks/wsjcpp/wsjcpp-yaml.svg?label=github%20forks)](https://github.com/wsjcpp/wsjcpp-yaml/network/members) [![Total alerts](https://img.shields.io/lgtm/alerts/g/wsjcpp/wsjcpp-yaml.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/wsjcpp/wsjcpp-yaml/alerts/) [![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/wsjcpp/wsjcpp-yaml.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/wsjcpp/wsjcpp-yaml/context:cpp) C++ Write/Reader yaml files