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