]> git.stg.codes - stg.git/blob - tests/test_tariff.cpp
Do not use pthread_kill to stop a thread
[stg.git] / tests / test_tariff.cpp
1 #include "tut/tut.hpp"
2
3 #include "stg/tariff_conf.h"
4 #include "tariff_impl.h"
5
6 namespace tut
7 {
8     struct tariff_data {
9     };
10
11     typedef test_group<tariff_data> tg;
12     tg tariff_test_group("TARIFF tests group");
13
14     typedef tg::object testobject;
15
16     template<>
17     template<>
18     void testobject::test<1>()
19     {
20         set_test_name("Check construction");
21
22         TARIFF_DATA td("test");
23         td.tariffConf.fee = 1;
24         td.tariffConf.free = 2;
25         td.tariffConf.traffType = TRAFF_UP_DOWN;
26         td.tariffConf.passiveCost = 4;
27         td.dirPrice[0].mDay = 30;
28         td.dirPrice[0].hDay = 9;
29         td.dirPrice[0].mNight = 30;
30         td.dirPrice[0].hNight = 21;
31         td.dirPrice[0].priceDayA = 0;
32         td.dirPrice[0].priceDayB = 1;
33         td.dirPrice[0].priceNightA = 2;
34         td.dirPrice[0].priceNightB = 3;
35         td.dirPrice[0].threshold = 4;
36         td.dirPrice[0].singlePrice = 0;
37         td.dirPrice[0].noDiscount = 0;
38         TARIFF_IMPL tariff(td);
39
40         ensure("freeMb = 2", tariff.GetFreeMb() == td.tariffConf.free);
41         ensure("passiveCost = 4", tariff.GetPassiveCost() == td.tariffConf.passiveCost);
42         ensure("fee = 1", tariff.GetFee() == td.tariffConf.fee);
43         ensure("free (alias of freeMb) = 2", tariff.GetFree() == td.tariffConf.free);
44         ensure("name = \"test\"'", tariff.GetName() == td.tariffConf.name);
45         ensure("traffType = TRAFF_UP_DOWN", tariff.GetTraffType() == td.tariffConf.traffType);
46         ensure("threshold[0] = 4", tariff.GetThreshold(0) == td.dirPrice[0].threshold);
47         ensure_equals("traffByType(6, 0) = 6", tariff.GetTraffByType(6, 0), 6);
48         ensure_equals("traffByType(5, 1) = 6", tariff.GetTraffByType(5, 1), 6);
49         ensure_equals("traffByType(4, 2) = 6", tariff.GetTraffByType(4, 2), 6);
50         ensure_equals("traffByType(3, 3) = 6", tariff.GetTraffByType(3, 3), 6);
51         ensure_equals("traffByType(2, 4) = 6", tariff.GetTraffByType(2, 4), 6);
52         ensure_equals("traffByType(1, 5) = 6", tariff.GetTraffByType(1, 5), 6);
53         ensure_equals("traffByType(0, 6) = 6", tariff.GetTraffByType(0, 6), 6);
54     }
55
56     template<>
57     template<>
58     void testobject::test<2>()
59     {
60         set_test_name("Check traff types");
61
62         TARIFF_DATA td("test");
63         td.tariffConf.fee = 1;
64         td.tariffConf.free = 2;
65         td.tariffConf.traffType = TRAFF_UP;
66         td.tariffConf.passiveCost = 4;
67         td.dirPrice[0].mDay = 30;
68         td.dirPrice[0].hDay = 9;
69         td.dirPrice[0].mNight = 30;
70         td.dirPrice[0].hNight = 21;
71         td.dirPrice[0].priceDayA = 0;
72         td.dirPrice[0].priceDayB = 1;
73         td.dirPrice[0].priceNightA = 2;
74         td.dirPrice[0].priceNightB = 3;
75         td.dirPrice[0].threshold = 4;
76         td.dirPrice[0].singlePrice = 0;
77         td.dirPrice[0].noDiscount = 0;
78         TARIFF_IMPL tariff(td);
79
80         ensure("traffType = TRAFF_UP", tariff.GetTraffType() == TRAFF_UP);
81         ensure_equals("traffByType(6, 0) = 6 for UP", tariff.GetTraffByType(6, 0), 6);
82         ensure_equals("traffByType(5, 1) = 5 for UP", tariff.GetTraffByType(5, 1), 5);
83         ensure_equals("traffByType(4, 2) = 4 for UP", tariff.GetTraffByType(4, 2), 4);
84         ensure_equals("traffByType(3, 3) = 3 for UP", tariff.GetTraffByType(3, 3), 3);
85         ensure_equals("traffByType(2, 4) = 2 for UP", tariff.GetTraffByType(2, 4), 2);
86         ensure_equals("traffByType(1, 5) = 1 for UP", tariff.GetTraffByType(1, 5), 1);
87         ensure_equals("traffByType(0, 6) = 0 for UP", tariff.GetTraffByType(0, 6), 0);
88
89         td.tariffConf.traffType = TRAFF_DOWN;
90         tariff = td;
91
92         ensure("traffType = TRAFF_DOWN", tariff.GetTraffType() == TRAFF_DOWN);
93         ensure_equals("traffByType(6, 0) = 0 for DOWN", tariff.GetTraffByType(6, 0), 0);
94         ensure_equals("traffByType(5, 1) = 1 for DOWN", tariff.GetTraffByType(5, 1), 1);
95         ensure_equals("traffByType(4, 2) = 2 for DOWN", tariff.GetTraffByType(4, 2), 2);
96         ensure_equals("traffByType(3, 3) = 3 for DOWN", tariff.GetTraffByType(3, 3), 3);
97         ensure_equals("traffByType(2, 4) = 4 for DOWN", tariff.GetTraffByType(2, 4), 4);
98         ensure_equals("traffByType(1, 5) = 5 for DOWN", tariff.GetTraffByType(1, 5), 5);
99         ensure_equals("traffByType(0, 6) = 6 for DOWN", tariff.GetTraffByType(0, 6), 6);
100
101         td.tariffConf.traffType = TRAFF_MAX;
102         tariff = td;
103
104         ensure("traffType = TRAFF_MAX", tariff.GetTraffType() == TRAFF_MAX);
105         ensure_equals("traffByType(6, 0) = 6 for MAX", tariff.GetTraffByType(6, 0), 6);
106         ensure_equals("traffByType(5, 1) = 5 for MAX", tariff.GetTraffByType(5, 1), 5);
107         ensure_equals("traffByType(4, 2) = 4 for MAX", tariff.GetTraffByType(4, 2), 4);
108         ensure_equals("traffByType(3, 3) = 3 for MAX", tariff.GetTraffByType(3, 3), 3);
109         ensure_equals("traffByType(2, 4) = 4 for MAX", tariff.GetTraffByType(2, 4), 4);
110         ensure_equals("traffByType(1, 5) = 5 for MAX", tariff.GetTraffByType(1, 5), 5);
111         ensure_equals("traffByType(0, 6) = 6 for MAX", tariff.GetTraffByType(0, 6), 6);
112
113         td.tariffConf.traffType = TRAFF_UP_DOWN;
114         tariff = td;
115
116         ensure("traffType = TRAFF_UP_DOWN", tariff.GetTraffType() == TRAFF_UP_DOWN);
117         ensure_equals("traffByType(6, 0) = 6 for UP_DOWN", tariff.GetTraffByType(6, 0), 6);
118         ensure_equals("traffByType(5, 1) = 6 for UP_DOWN", tariff.GetTraffByType(5, 1), 6);
119         ensure_equals("traffByType(4, 2) = 6 for UP_DOWN", tariff.GetTraffByType(4, 2), 6);
120         ensure_equals("traffByType(3, 3) = 6 for UP_DOWN", tariff.GetTraffByType(3, 3), 6);
121         ensure_equals("traffByType(2, 4) = 6 for UP_DOWN", tariff.GetTraffByType(2, 4), 6);
122         ensure_equals("traffByType(1, 5) = 6 for UP_DOWN", tariff.GetTraffByType(1, 5), 6);
123         ensure_equals("traffByType(0, 6) = 6 for UP_DOWN", tariff.GetTraffByType(0, 6), 6);
124     }
125
126     template<>
127     template<>
128     void testobject::test<3>()
129     {
130         set_test_name("Check normal interval prices");
131
132         TARIFF_DATA td("test");
133         td.tariffConf.fee = 1;
134         td.tariffConf.free = 2;
135         td.tariffConf.traffType = TRAFF_UP_DOWN;
136         td.tariffConf.passiveCost = 4;
137         td.dirPrice[0].mDay = 30;
138         td.dirPrice[0].hDay = 9;
139         td.dirPrice[0].mNight = 30;
140         td.dirPrice[0].hNight = 21;
141         td.dirPrice[0].priceDayA = 0;
142         td.dirPrice[0].priceDayB = 1;
143         td.dirPrice[0].priceNightA = 2;
144         td.dirPrice[0].priceNightB = 3;
145         td.dirPrice[0].threshold = 4;
146         td.dirPrice[0].singlePrice = 0;
147         td.dirPrice[0].noDiscount = 0;
148         TARIFF_IMPL tariff(td);
149
150         ensure_equals("0000 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA
151         ensure_equals("0001 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 1); // Near 17:30, 6 > 4 DB
152         ensure_equals("0010 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 2); // Near 22:30, 0 < 4 NA
153         ensure_equals("0011 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 3); // Near 22:30, 6 > 4 NB
154
155         td.dirPrice[0].singlePrice = 1;
156         tariff = td;
157
158         ensure_equals("0100 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA
159         ensure_equals("0101 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 1); // Near 17:30, 6 > 4 DB
160         ensure_equals("0110 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA
161         ensure_equals("0111 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 1); // Near 22:30, 6 > 4 DB
162
163         td.dirPrice[0].singlePrice = 0;
164         td.dirPrice[0].noDiscount = 1;
165         tariff = td;
166
167         ensure_equals("1000 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA
168         ensure_equals("1001 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 6 > 4 DA
169         ensure_equals("1010 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 2); // Near 22:30, 0 < 4 NA
170         ensure_equals("1011 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 2); // Near 22:30, 6 > 4 NA
171
172         td.dirPrice[0].singlePrice = 1;
173         td.dirPrice[0].noDiscount = 1;
174         tariff = td;
175
176         ensure_equals("1100 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA
177         ensure_equals("1101 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 6 > 4 DA
178         ensure_equals("1110 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA
179         ensure_equals("1111 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 6 > 4 DA
180     }
181
182     template<>
183     template<>
184     void testobject::test<4>()
185     {
186         set_test_name("Check construction for day-night inversion");
187
188         TARIFF_DATA td("test");
189         td.tariffConf.fee = 1;
190         td.tariffConf.free = 2;
191         td.tariffConf.traffType = TRAFF_UP_DOWN;
192         td.tariffConf.passiveCost = 4;
193         td.dirPrice[0].mDay = 30;
194         td.dirPrice[0].hDay = 21;
195         td.dirPrice[0].mNight = 30;
196         td.dirPrice[0].hNight = 9;
197         td.dirPrice[0].priceDayA = 0;
198         td.dirPrice[0].priceDayB = 1;
199         td.dirPrice[0].priceNightA = 2;
200         td.dirPrice[0].priceNightB = 3;
201         td.dirPrice[0].threshold = 4;
202         td.dirPrice[0].singlePrice = 0;
203         td.dirPrice[0].noDiscount = 0;
204         TARIFF_IMPL tariff(td);
205
206         ensure("freeMb = 2", tariff.GetFreeMb() == td.tariffConf.free);
207         ensure("passiveCost = 4", tariff.GetPassiveCost() == td.tariffConf.passiveCost);
208         ensure("fee = 1", tariff.GetFee() == td.tariffConf.fee);
209         ensure("free (alias of freeMb) = 2", tariff.GetFree() == td.tariffConf.free);
210         ensure("name = \"test\"'", tariff.GetName() == td.tariffConf.name);
211         ensure("traffType = TRAFF_UP_DOWN", tariff.GetTraffType() == td.tariffConf.traffType);
212         ensure("threshold[0] = 4", tariff.GetThreshold(0) == td.dirPrice[0].threshold);
213         ensure_equals("traffByType(6, 0) = 6", tariff.GetTraffByType(6, 0), 6);
214         ensure_equals("traffByType(5, 1) = 6", tariff.GetTraffByType(5, 1), 6);
215         ensure_equals("traffByType(4, 2) = 6", tariff.GetTraffByType(4, 2), 6);
216         ensure_equals("traffByType(3, 3) = 6", tariff.GetTraffByType(3, 3), 6);
217         ensure_equals("traffByType(2, 4) = 6", tariff.GetTraffByType(2, 4), 6);
218         ensure_equals("traffByType(1, 5) = 6", tariff.GetTraffByType(1, 5), 6);
219         ensure_equals("traffByType(0, 6) = 6", tariff.GetTraffByType(0, 6), 6);
220     }
221
222     template<>
223     template<>
224     void testobject::test<5>()
225     {
226         set_test_name("Check traff types for day-night inversion");
227
228         TARIFF_DATA td("test");
229         td.tariffConf.fee = 1;
230         td.tariffConf.free = 2;
231         td.tariffConf.traffType = TRAFF_UP;
232         td.tariffConf.passiveCost = 4;
233         td.dirPrice[0].mDay = 30;
234         td.dirPrice[0].hDay = 21;
235         td.dirPrice[0].mNight = 30;
236         td.dirPrice[0].hNight = 9;
237         td.dirPrice[0].priceDayA = 0;
238         td.dirPrice[0].priceDayB = 1;
239         td.dirPrice[0].priceNightA = 2;
240         td.dirPrice[0].priceNightB = 3;
241         td.dirPrice[0].threshold = 4;
242         td.dirPrice[0].singlePrice = 0;
243         td.dirPrice[0].noDiscount = 0;
244         TARIFF_IMPL tariff(td);
245
246         ensure("traffType = TRAFF_UP", tariff.GetTraffType() == TRAFF_UP);
247         ensure_equals("traffByType(6, 0) = 6 for UP", tariff.GetTraffByType(6, 0), 6);
248         ensure_equals("traffByType(5, 1) = 5 for UP", tariff.GetTraffByType(5, 1), 5);
249         ensure_equals("traffByType(4, 2) = 4 for UP", tariff.GetTraffByType(4, 2), 4);
250         ensure_equals("traffByType(3, 3) = 3 for UP", tariff.GetTraffByType(3, 3), 3);
251         ensure_equals("traffByType(2, 4) = 2 for UP", tariff.GetTraffByType(2, 4), 2);
252         ensure_equals("traffByType(1, 5) = 1 for UP", tariff.GetTraffByType(1, 5), 1);
253         ensure_equals("traffByType(0, 6) = 0 for UP", tariff.GetTraffByType(0, 6), 0);
254
255         td.tariffConf.traffType = TRAFF_DOWN;
256         tariff = td;
257
258         ensure("traffType = TRAFF_DOWN", tariff.GetTraffType() == TRAFF_DOWN);
259         ensure_equals("traffByType(6, 0) = 0 for DOWN", tariff.GetTraffByType(6, 0), 0);
260         ensure_equals("traffByType(5, 1) = 1 for DOWN", tariff.GetTraffByType(5, 1), 1);
261         ensure_equals("traffByType(4, 2) = 2 for DOWN", tariff.GetTraffByType(4, 2), 2);
262         ensure_equals("traffByType(3, 3) = 3 for DOWN", tariff.GetTraffByType(3, 3), 3);
263         ensure_equals("traffByType(2, 4) = 4 for DOWN", tariff.GetTraffByType(2, 4), 4);
264         ensure_equals("traffByType(1, 5) = 5 for DOWN", tariff.GetTraffByType(1, 5), 5);
265         ensure_equals("traffByType(0, 6) = 6 for DOWN", tariff.GetTraffByType(0, 6), 6);
266
267         td.tariffConf.traffType = TRAFF_MAX;
268         tariff = td;
269
270         ensure("traffType = TRAFF_MAX", tariff.GetTraffType() == TRAFF_MAX);
271         ensure_equals("traffByType(6, 0) = 6 for MAX", tariff.GetTraffByType(6, 0), 6);
272         ensure_equals("traffByType(5, 1) = 5 for MAX", tariff.GetTraffByType(5, 1), 5);
273         ensure_equals("traffByType(4, 2) = 4 for MAX", tariff.GetTraffByType(4, 2), 4);
274         ensure_equals("traffByType(3, 3) = 3 for MAX", tariff.GetTraffByType(3, 3), 3);
275         ensure_equals("traffByType(2, 4) = 4 for MAX", tariff.GetTraffByType(2, 4), 4);
276         ensure_equals("traffByType(1, 5) = 5 for MAX", tariff.GetTraffByType(1, 5), 5);
277         ensure_equals("traffByType(0, 6) = 6 for MAX", tariff.GetTraffByType(0, 6), 6);
278
279         td.tariffConf.traffType = TRAFF_UP_DOWN;
280         tariff = td;
281
282         ensure("traffType = TRAFF_UP_DOWN", tariff.GetTraffType() == TRAFF_UP_DOWN);
283         ensure_equals("traffByType(6, 0) = 6 for UP_DOWN", tariff.GetTraffByType(6, 0), 6);
284         ensure_equals("traffByType(5, 1) = 6 for UP_DOWN", tariff.GetTraffByType(5, 1), 6);
285         ensure_equals("traffByType(4, 2) = 6 for UP_DOWN", tariff.GetTraffByType(4, 2), 6);
286         ensure_equals("traffByType(3, 3) = 6 for UP_DOWN", tariff.GetTraffByType(3, 3), 6);
287         ensure_equals("traffByType(2, 4) = 6 for UP_DOWN", tariff.GetTraffByType(2, 4), 6);
288         ensure_equals("traffByType(1, 5) = 6 for UP_DOWN", tariff.GetTraffByType(1, 5), 6);
289         ensure_equals("traffByType(0, 6) = 6 for UP_DOWN", tariff.GetTraffByType(0, 6), 6);
290     }
291
292     template<>
293     template<>
294     void testobject::test<6>()
295     {
296         set_test_name("Check normal interval prices for day-night inversion");
297
298         TARIFF_DATA td("test");
299         td.tariffConf.fee = 1;
300         td.tariffConf.free = 2;
301         td.tariffConf.traffType = TRAFF_UP_DOWN;
302         td.tariffConf.passiveCost = 4;
303         td.dirPrice[0].mDay = 30;
304         td.dirPrice[0].hDay = 21;
305         td.dirPrice[0].mNight = 30;
306         td.dirPrice[0].hNight = 9;
307         td.dirPrice[0].priceDayA = 0;
308         td.dirPrice[0].priceDayB = 1;
309         td.dirPrice[0].priceNightA = 2;
310         td.dirPrice[0].priceNightB = 3;
311         td.dirPrice[0].threshold = 4;
312         td.dirPrice[0].singlePrice = 0;
313         td.dirPrice[0].noDiscount = 0;
314         TARIFF_IMPL tariff(td);
315
316         ensure_equals("0000 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 2); // Near 17:30, 0 < 4 NA
317         ensure_equals("0001 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 3); // Near 17:30, 6 > 4 NB
318         ensure_equals("0010 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA
319         ensure_equals("0011 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 1); // Near 22:30, 6 > 4 DB
320
321         td.dirPrice[0].singlePrice = 1;
322         tariff = td;
323
324         ensure_equals("0100 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA (ignore night)
325         ensure_equals("0101 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 1); // Near 17:30, 6 > 4 DB (ignore night)
326         ensure_equals("0110 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA (ignore night)
327         ensure_equals("0111 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 1); // Near 22:30, 6 > 4 DB (ignore night)
328
329         td.dirPrice[0].singlePrice = 0;
330         td.dirPrice[0].noDiscount = 1;
331         tariff = td;
332
333         ensure_equals("1000 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 2); // Near 17:30, 0 < 4 NA
334         ensure_equals("1001 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 2); // Near 17:30, 6 > 4 NA
335         ensure_equals("1010 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA
336         ensure_equals("1011 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 6 > 4 DA
337
338         td.dirPrice[0].singlePrice = 1;
339         td.dirPrice[0].noDiscount = 1;
340         tariff = td;
341
342         ensure_equals("1100 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA (ignore night)
343         ensure_equals("1101 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 6 > 4 DA (ignore night)
344         ensure_equals("1110 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA (ignore night)
345         ensure_equals("1111 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 6 > 4 DA (ignore night)
346     }
347 }