]> git.stg.codes - stg.git/blob - tests/test_fee_charge_rules.cpp
Correct conversion of resetable structures.
[stg.git] / tests / test_fee_charge_rules.cpp
1 #include "tut/tut.hpp"
2
3 #include "stg/user_property.h"
4 #include "user_impl.h"
5
6 #include "testsettings.h"
7 #include "testtariffs.h"
8 #include "testadmin.h"
9 #include "teststore.h"
10 #include "testservices.h"
11
12 namespace tut
13 {
14     struct fee_charge_rules_data {
15     };
16
17     typedef test_group<fee_charge_rules_data> tg;
18     tg fee_charge_rules_test_group("Fee charge rules tests group");
19
20     typedef tg::object testobject;
21
22     class TEST_SETTINGS_LOCAL : public TEST_SETTINGS {
23         public:
24             TEST_SETTINGS_LOCAL(unsigned _feeChargeType)
25                 : feeChargeType(_feeChargeType)
26             {}
27
28             unsigned GetFeeChargeType() const { return feeChargeType; }
29
30         private:
31             unsigned feeChargeType;
32     };
33
34     template<>
35     template<>
36     void testobject::test<1>()
37     {
38         set_test_name("Check classic rules");
39
40         TEST_SETTINGS_LOCAL settings(0);
41         TEST_TARIFFS tariffs;
42         TEST_ADMIN admin;
43         TEST_STORE store;
44         TEST_SERVICES services;
45         USER_IMPL user(&settings, &store, &tariffs, &admin, NULL, services);
46
47         USER_PROPERTY<double> & cash(user.GetProperty().cash);
48         USER_PROPERTY<std::string> & tariffName(user.GetProperty().tariffName);
49
50         ensure_equals("user.cash == 0 (initial value)", user.GetProperty().cash, 0);
51         cash = 100;
52         ensure_equals("user.cash == 100 (explicitly set)", user.GetProperty().cash, 100);
53
54         tariffs.SetFee(50);
55         tariffName = "test";
56         ensure_equals("user.tariffName == 'test' (explicitly set)", user.GetProperty().tariffName.ConstData(), "test");
57         user.ProcessDayFee();
58         ensure_equals("user.cash == 50 (first fee charge)", user.GetProperty().cash, 50);
59         user.ProcessDayFee();
60         ensure_equals("user.cash == 0 (second fee charge)", user.GetProperty().cash, 0);
61         user.ProcessDayFee();
62         ensure_equals("user.cash == -50 (third fee charge)", user.GetProperty().cash, -50);
63         user.ProcessDayFee();
64         ensure_equals("user.cash == -100 (fourth fee charge)", user.GetProperty().cash, -100);
65     }
66
67     template<>
68     template<>
69     void testobject::test<2>()
70     {
71         set_test_name("Check second rules (allow fee if cash value is positive)");
72
73         TEST_SETTINGS_LOCAL settings(1);
74         TEST_TARIFFS tariffs;
75         TEST_ADMIN admin;
76         TEST_STORE store;
77         TEST_SERVICES services;
78         USER_IMPL user(&settings, &store, &tariffs, &admin, NULL, services);
79
80         USER_PROPERTY<double> & cash(user.GetProperty().cash);
81         USER_PROPERTY<double> & credit(user.GetProperty().credit);
82         USER_PROPERTY<std::string> & tariffName(user.GetProperty().tariffName);
83
84         ensure_equals("user.cash == 0 (initial value)", user.GetProperty().cash, 0);
85         ensure_equals("user.credit == 0 (initial value)", user.GetProperty().credit, 0);
86         cash = 100;
87         ensure_equals("user.cash == 100 (explicitly set)", user.GetProperty().cash, 100);
88
89         tariffs.SetFee(50);
90         tariffName = "test";
91         ensure_equals("user.tariffName == 'test' (explicitly set)", user.GetProperty().tariffName.ConstData(), "test");
92         user.ProcessDayFee();
93         ensure_equals("user.cash == 50 (first fee charge)", user.GetProperty().cash, 50);
94         user.ProcessDayFee();
95         ensure_equals("user.cash == 0 (second fee charge)", user.GetProperty().cash, 0);
96         user.ProcessDayFee();
97         ensure_equals("user.cash == -50 (third fee charge)", user.GetProperty().cash, -50);
98         user.ProcessDayFee();
99         ensure_equals("user.cash == -50 (not charging `cause value is negative)", user.GetProperty().cash, -50);
100         cash = 49;
101         ensure_equals("user.cash == 49 (explicitly set)", user.GetProperty().cash, 49);
102         user.ProcessDayFee();
103         ensure_equals("user.cash == -1 (charge to negative value)", user.GetProperty().cash, -1);
104         user.ProcessDayFee();
105         ensure_equals("user.cash == -1 (not charging `cause value is negative)", user.GetProperty().cash, -1);
106         credit = 50;
107         ensure_equals("user.credit == 50 (explicitly set)", user.GetProperty().credit, 50);
108         user.ProcessDayFee();
109         ensure_equals("user.cash == -51 (charging `cause value + credit gives us a positive value)", user.GetProperty().cash, -51);
110         user.ProcessDayFee();
111         ensure_equals("user.cash == -51 (not charging `cause credit now is not enoght)", user.GetProperty().cash, -51);
112     }
113
114     template<>
115     template<>
116     void testobject::test<3>()
117     {
118         set_test_name("Check third rules (allow fee if cash value is greater than fee)");
119
120         TEST_SETTINGS_LOCAL settings(2);
121         TEST_TARIFFS tariffs;
122         TEST_ADMIN admin;
123         TEST_STORE store;
124         TEST_SERVICES services;
125         USER_IMPL user(&settings, &store, &tariffs, &admin, NULL, services);
126
127         USER_PROPERTY<double> & cash(user.GetProperty().cash);
128         USER_PROPERTY<double> & credit(user.GetProperty().credit);
129         USER_PROPERTY<std::string> & tariffName(user.GetProperty().tariffName);
130
131         ensure_equals("user.cash == 0 (initial value)", user.GetProperty().cash, 0);
132         cash = 100;
133         ensure_equals("user.cash == 100 (explicitly set)", user.GetProperty().cash, 100);
134
135         tariffs.SetFee(50);
136         tariffName = "test";
137         ensure_equals("user.tariffName == 'test' (explicitly set)", user.GetProperty().tariffName.ConstData(), "test");
138         user.ProcessDayFee();
139         ensure_equals("user.cash == 50 (first fee charge)", user.GetProperty().cash, 50);
140         user.ProcessDayFee();
141         ensure_equals("user.cash == 0 (second fee charge)", user.GetProperty().cash, 0);
142         user.ProcessDayFee();
143         ensure_equals("user.cash == 0 (not charging `cause value is lower than fee)", user.GetProperty().cash, 0);
144         cash = 50;
145         ensure_equals("user.cash == 50 (explicitly set)", user.GetProperty().cash, 50);
146         tariffs.SetFee(51);
147         user.ProcessDayFee();
148         ensure_equals("user.cash == 50 (not charging `cause value is lower than fee)", user.GetProperty().cash, 50);
149         cash = 0;
150         ensure_equals("user.cash == 0 (explicitly set)", user.GetProperty().cash, 0);
151         credit = 51;
152         ensure_equals("user.credit == 51 (explicitly set)", user.GetProperty().credit, 51);
153         user.ProcessDayFee();
154         ensure_equals("user.cash == -51 (charging `cause value + credit gives us a value greater than fee)", user.GetProperty().cash, -51);
155         user.ProcessDayFee();
156         ensure_equals("user.cash == -51 (not charging `cause credit now is not enought)", user.GetProperty().cash, -51);
157     }
158 }