/******************************************************************************** * Copyright (C) 2019-2023 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * * * * This software is distributed under the terms of the * * GNU Lesser General Public Licence (LGPL) version 3, * * copied verbatim in the file "LICENSE" * ********************************************************************************/ #include #if FAIRMQ_HAS_STD_FILESYSTEM #include namespace fs = std::filesystem; #else #define BOOST_FILESYSTEM_VERSION 3 #define BOOST_FILESYSTEM_NO_DEPRECATED #include namespace fs = ::boost::filesystem; #endif #include #include #include namespace { using namespace std; using namespace fair::mq; template auto set_and_get(ProgOptions& options, const string& key, T value) -> void { std::cout << key << std::endl; options.SetProperty(key, value); EXPECT_EQ(options.GetPropertyAsString(key), PropertyHelper::ConvertPropertyToString(Property(value))); EXPECT_EQ(options.GetProperty(key), value); } TEST(ProgOptions, SetAndGet) { ProgOptions o; set_and_get(o, "_char", 'a'); set_and_get(o, "_signed char", -2); set_and_get(o, "_unsigned char", 2); set_and_get(o, "_const char*", "testcstring"); set_and_get(o, "_string", "teststring"); set_and_get(o, "_int", 1); set_and_get(o, "_size_t", 11); set_and_get(o, "_uint16_t", 12); set_and_get(o, "_uint32_t", 123); set_and_get(o, "_uint64_t", 1234); set_and_get(o, "_long", 1234); set_and_get(o, "_long long", 12345); set_and_get(o, "_unsigned", 3); set_and_get(o, "_unsigned long", 32); set_and_get(o, "_unsigned long long", 321); set_and_get(o, "_float", 3.2); set_and_get(o, "_double", 33.22); set_and_get(o, "_long double", 333.222); set_and_get(o, "_bool", true); set_and_get(o, #if FAIRMQ_HAS_STD_FILESYSTEM "_std::filesystem::path", #else "_boost::filesystem::path", #endif fs::path("C:\\Windows")); set_and_get>(o, "_vector", { true, true }); set_and_get>(o, "_vector", { 'a', 'b', 'c' }); set_and_get>(o, "_vector", { -1, -2, -3 }); set_and_get>(o, "_vector", { 1, 2, 3 }); set_and_get>(o, "_vector", { "aa", "bb", "cc" }); set_and_get>(o, "_vector", { 1, 2, 3 }); set_and_get>(o, "_vector", { 1, 2, 3 }); set_and_get>(o, "_vector", { 12, 13, 14 }); set_and_get>(o, "_vector", { 123, 124, 125 }); set_and_get>(o, "_vector", { 1234, 1235, 1236 }); set_and_get>(o, "_vector", { 1234, 1235, 1236 }); set_and_get>(o, "_vector", { 12345, 12346, 12347 }); set_and_get>(o, "_vector", { 3, 4, 5 }); set_and_get>(o, "_vector", { 32, 33, 34 }); set_and_get>(o, "_vector", { 321, 322, 323 }); set_and_get>(o, "_vector", { 3.2, 3.3, 3.4 }); set_and_get>(o, "_vector", { 33.22, 33.23, 33.24 }); set_and_get>(o, "_vector", { 333.222, 333.223, 333.224 }); set_and_get>(o, #if FAIRMQ_HAS_STD_FILESYSTEM "_vector", #else "_vector", #endif { fs::path("C:\\Windows"), fs::path("C:\\Windows\\System32") }); ASSERT_THROW(o.ParseAll({"cmd", "--unregistered", "option"}, false), boost::program_options::unknown_option); ASSERT_NO_THROW(o.ParseAll({"cmd", "--unregistered", "option"}, true)); } template auto subscribe_and_set(ProgOptions& options, const string& expected_key, T expected_value) -> void { std::cout << expected_key << std::endl; const string subscriber("test"); const string different_key("different"); ASSERT_NE(expected_key, different_key); int type_events(0); int asstring_events(0); int total_events(0); options.Subscribe(subscriber, [&](const string& key, T value) { if (expected_key == key) { ++type_events; EXPECT_EQ(value, expected_value); } ++total_events; }); options.SubscribeAsString(subscriber, [&](const string& key, string value) { if (expected_key == key) { ++asstring_events; EXPECT_EQ(value, PropertyHelper::ConvertPropertyToString(Property(value))); } ++total_events; }); options.SetProperty(expected_key, expected_value); options.Unsubscribe(subscriber); options.SetProperty(different_key, expected_value); options.SetProperty(expected_key, expected_value); options.UnsubscribeAsString(subscriber); options.SetProperty(expected_key, expected_value); EXPECT_EQ(type_events, 1); EXPECT_EQ(asstring_events, 2); EXPECT_EQ(total_events, 4); } TEST(ProgOptions, SubscribeAndSet) { ProgOptions o; subscribe_and_set(o, "_char", 'a'); subscribe_and_set(o, "_signed char", -2); subscribe_and_set(o, "_unsigned char", 2); subscribe_and_set(o, "_const char*", "testcstring"); subscribe_and_set(o, "_string", "teststring"); subscribe_and_set(o, "_int", 1); subscribe_and_set(o, "_size_t", 11); subscribe_and_set(o, "_uint16_t", 12); subscribe_and_set(o, "_uint32_t", 123); subscribe_and_set(o, "_uint64_t", 1234); subscribe_and_set(o, "_long", 1234); subscribe_and_set(o, "_long long", 12345); subscribe_and_set(o, "_unsigned", 3); subscribe_and_set(o, "_unsigned long", 32); subscribe_and_set(o, "_unsigned long long", 321); subscribe_and_set(o, "_float", 3.2); subscribe_and_set(o, "_double", 33.22); subscribe_and_set(o, "_long double", 333.222); subscribe_and_set(o, "_bool", true); subscribe_and_set(o, #if FAIRMQ_HAS_STD_FILESYSTEM "_std::filesystem::path", #else "_boost::filesystem::path", #endif fs::path("C:\\Windows")); subscribe_and_set>(o, "_vector", { true, true }); subscribe_and_set>(o, "_vector", { 'a', 'b', 'c' }); subscribe_and_set>(o, "_vector", { -1, -2, -3 }); subscribe_and_set>(o, "_vector", { 1, 2, 3 }); subscribe_and_set>(o, "_vector", { "aa", "bb", "cc" }); subscribe_and_set>(o, "_vector", { 1, 2, 3 }); subscribe_and_set>(o, "_vector", { 1, 2, 3 }); subscribe_and_set>(o, "_vector", { 12, 13, 14 }); subscribe_and_set>(o, "_vector", { 12, 13, 14 }); subscribe_and_set>(o, "_vector", { 123, 124, 125 }); subscribe_and_set>(o, "_vector", { 1234, 1235, 1236 }); subscribe_and_set>(o, "_vector", { 12345, 12346, 12347 }); subscribe_and_set>(o, "_vector", { 3, 4, 5 }); subscribe_and_set>(o, "_vector", { 32, 33, 34 }); subscribe_and_set>(o, "_vector", { 321, 322, 323 }); subscribe_and_set>(o, "_vector", { 3.2, 3.3, 3.4 }); subscribe_and_set>(o, "_vector", { 33.22, 33.23, 33.24 }); subscribe_and_set>(o, "_vector", { 333.222, 333.223, 333.224 }); subscribe_and_set>(o, #if FAIRMQ_HAS_STD_FILESYSTEM "_vector", #else "_vector", #endif { fs::path("C:\\Windows"), fs::path("C:\\Windows\\System32") }); } TEST(PropertyHelper, ConvertPropertyToString) { EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast('a'))), "a"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast(-2))), "-2"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast(2))), "2"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast("testcstring"))), "testcstring"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast("teststring"))), "teststring"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast(1))), "1"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast(11))), "11"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast(12))), "12"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast(12))), "12"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast(123))), "123"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast(1234))), "1234"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast(12345))), "12345"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast(3))), "3"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast(32))), "32"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast(321))), "321"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast(3.2))), "3.2"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast(33.22))), "33.22"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast(333.222))), "333.222"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(static_cast(true))), "true"); #if FAIRMQ_HAS_STD_FILESYSTEM EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(fs::path("C:\\Windows"))), "\"C:\\\\Windows\""); #else EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(fs::path("C:\\Windows"))), "\"C:\\Windows\""); #endif EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ 'a', 'b', 'c' }))), "a, b, c"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ -1, -2, -3 }))), "-1, -2, -3"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ 1, 2, 3 }))), "1, 2, 3"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ "aa", "bb", "cc" }))), "aa, bb, cc"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ 1, 2, 3 }))), "1, 2, 3"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ 1, 2, 3 }))), "1, 2, 3"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ 12, 13, 14 }))), "12, 13, 14"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ 12, 13, 14 }))), "12, 13, 14"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ 123, 124, 125 }))), "123, 124, 125"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ 1234, 1235, 1236 }))), "1234, 1235, 1236"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ 12345, 12346, 12347 }))), "12345, 12346, 12347"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ 3, 4, 5 }))), "3, 4, 5"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ 32, 33, 34 }))), "32, 33, 34"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ 321, 322, 323 }))), "321, 322, 323"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ 3.2, 3.3, 3.4 }))), "3.2, 3.3, 3.4"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ 33.22, 33.23, 33.24 }))), "33.22, 33.23, 33.24"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ 333.222, 333.223, 333.224 }))), "333.222, 333.223, 333.224"); EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ true, true }))), "true, true"); #if FAIRMQ_HAS_STD_FILESYSTEM EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ fs::path("C:\\Windows"), fs::path("C:\\Windows\\System32") }))), "\"C:\\\\Windows\", \"C:\\\\Windows\\\\System32\""); #else EXPECT_EQ(PropertyHelper::ConvertPropertyToString(Property(vector({ fs::path("C:\\Windows"), fs::path("C:\\Windows\\System32") }))), "\"C:\\Windows\", \"C:\\Windows\\System32\""); #endif } } // namespace