1 #include "test/common.hpp" 2 3 #include <pajlada/settings.hpp> 4 5 using namespace pajlada::Settings; 6 using namespace std; 7 8 class MyWindow 9 { 10 public: 11 int x = 0; 12 13 bool operator ==(const MyWindow & rhs) const14 operator==(const MyWindow &rhs) const 15 { 16 return std::tie(this->x) == std::tie(rhs.x); 17 } 18 }; 19 20 TEST_CASE("Single window", "[settings][advanced]") 21 { 22 SettingManager::clear(); 23 Setting<MyWindow> myWindow("/a"); 24 25 // REQUIRE(myWindow->x == 0); 26 27 REQUIRE(LoadFile("advanced-window.json")); 28 29 // REQUIRE(myWindow->x == 5); 30 } 31 32 TEST_CASE("Multi window", "[settings][advanced]") 33 { 34 SettingManager::clear(); 35 Setting<std::vector<MyWindow>> myWindows("/a"); 36 37 // REQUIRE(myWindows->size() == 0); 38 39 REQUIRE(LoadFile("advanced-window-multi.json")); 40 41 // REQUIRE(myWindows->size() == 3); 42 43 std::deque<int> values{5, 10, 15}; 44 45 /* 46 for (const auto &window : myWindows.getArray()) { 47 REQUIRE(window.x == values.front()); 48 values.pop_front(); 49 } 50 */ 51 52 // myWindows.push_back(MyWindow{}); 53 54 // REQUIRE(myWindows->size() == 4); 55 56 // myWindows.push_back(MyWindow{}); 57 58 // REQUIRE(myWindows->size() == 5); 59 } 60 61 TEST_CASE("Multi files", "[settings][advanced]") 62 { 63 auto sm1 = std::make_shared<SettingManager>(); 64 auto sm2 = std::make_shared<SettingManager>(); 65 Setting<std::vector<MyWindow>> myWindows("/a", SettingOption::Default, sm1); 66 67 // REQUIRE(myWindows->size() == 0); 68 69 REQUIRE(sm1->load("files/advanced-window-multi.json") == 70 SettingManager::LoadError::NoError); 71 REQUIRE(sm2->load("files/advanced-window-multi.json") == 72 SettingManager::LoadError::NoError); 73 74 // REQUIRE(myWindows->size() == 3); 75 76 std::deque<int> values{5, 10, 15}; 77 78 /* 79 for (const auto &window : myWindows.getArray()) { 80 REQUIRE(window.x == values.front()); 81 values.pop_front(); 82 } 83 */ 84 85 // myWindows.push_back(MyWindow{}); 86 87 // REQUIRE(myWindows->size() == 4); 88 89 // myWindows.push_back(MyWindow{}); 90 91 // REQUIRE(myWindows->size() == 5); 92 93 Setting<std::vector<MyWindow>> myWindows2("/a", SettingOption::Default, 94 sm2); 95 96 MyWindow test; 97 test.x = 77; 98 99 // myWindows2.push_back(std::move(test)); 100 101 sm1->setPath("lol.json"); 102 103 sm2->setPath("lol2.json"); 104 } 105 106 namespace pajlada { 107 108 template <> 109 struct IsEqual<MyWindow> { 110 static bool getpajlada::IsEqual111 get(const MyWindow &lhs, const MyWindow &rhs) 112 { 113 return lhs == rhs; 114 } 115 }; 116 117 template <> 118 struct Serialize<MyWindow> { 119 static rapidjson::Value getpajlada::Serialize120 get(const MyWindow &value, rapidjson::Document::AllocatorType &a) 121 { 122 rapidjson::Value ret(rapidjson::kObjectType); 123 124 ret.AddMember(rapidjson::Value("x", a).Move(), 125 pajlada::Serialize<int>::get(value.x, a), a); 126 127 return ret; 128 } 129 }; 130 131 template <> 132 struct Deserialize<MyWindow> { 133 static MyWindow getpajlada::Deserialize134 get(const rapidjson::Value &value, bool *error = nullptr) 135 { 136 MyWindow ret; 137 138 if (!value.IsObject()) { 139 PAJLADA_REPORT_ERROR(error) 140 return ret; 141 } 142 143 if (value.HasMember("x")) { 144 bool error = false; 145 auto out = pajlada::Deserialize<int>::get(value["x"], &error); 146 147 if (!error) { 148 ret.x = out; 149 } 150 } 151 152 return ret; 153 } 154 }; 155 156 } // namespace pajlada 157