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