root/library/tests/testsuite/user_info_test.cpp @ 942

Revision 942, 7.1 kB (checked in by mido, 14 years ago)

the functionality of user info was improved, it supports an initialization of root descendant via UI::get directly, however it is save only for static attributes, for dynamically allocated attributes UI::build should be called to handle with intahrence issues

  • Property svn:eol-style set to native
Line 
1#include <string>
2#include <vector>
3#include <string.h>
4#include "base/user_info.h"
5#include "../test_util.h"
6#include "UnitTest++.h"
7
8using namespace std;
9using namespace bdm;
10
11class Passenger : public root {
12public:
13
14        Passenger() {
15        }
16};
17
18class Human : public Passenger {
19public:
20        string name;
21
22        Human() {
23                name = "none";
24        }
25
26        virtual void from_setting ( const Setting &set ) {
27                UI::get ( name, set, "name" );
28        }
29
30        virtual void to_setting ( Setting &set ) const {
31                Setting &name_setting = set.add ( "name", Setting::TypeString );
32                name_setting = name;
33        }
34
35        string to_string()  const {
36                return name;
37        }
38};
39
40UIREGISTER ( Human );
41
42class Robot : public Passenger {
43public:
44        int number;
45        Array<string> software;
46
47        Robot() : software() {
48                number = -1;
49        }
50
51        virtual void from_setting ( const Setting &set ) {
52                UI::get ( number, set, "number" );
53                UI::get ( software, set, "software" );
54        }
55
56        virtual void to_setting ( Setting &set ) const {
57                Setting &number_setting = set.add ( "number", Setting::TypeInt );
58                number_setting = number;
59
60                UI::save ( software, set, "software" );
61        }
62
63        string to_string()  const {
64                stringstream stream;
65                stream << number;
66                for ( int i = 0; i < software.length(); i++ )
67                        stream << "_" + software ( i );
68                return stream.str();
69        }
70};
71
72UIREGISTER ( Robot );
73
74class Transport : public root {
75public:
76        int year;
77        string manufacturer;
78
79        Transport() : year ( 1900 ), manufacturer ( "unknown" ) {
80        }
81
82        Transport ( int year, string manufacturer ) :
83                        year ( year ), manufacturer ( manufacturer ) {
84        }
85
86        virtual void from_setting ( const Setting &set ) {
87                UI::get ( year, set, "year" );
88                UI::get ( manufacturer, set, "manufacturer" );
89        }
90
91        virtual void to_setting ( Setting &set ) const {
92                Setting &year_setting = set.add ( "year", Setting::TypeInt );
93                year_setting = year;
94
95                Setting &manufacturer_setting = set.add ( "manufacturer", Setting::TypeString );
96                manufacturer_setting = manufacturer;
97        }
98
99        virtual string to_string() const
100        {
101                return "the method to_string() is not implemented";
102        }
103};
104
105class Car : public Transport {
106public:
107        int kilometers;
108        Array<shared_ptr<Passenger> > passengers;
109
110        Car() : Transport() {
111                kilometers = 0;
112        }
113
114
115        Car ( int year, string manufacturer, int kilometers )
116                        : Transport ( year, manufacturer ), kilometers ( kilometers ) {
117        }
118
119        virtual void from_setting ( const Setting &set ) {
120                Transport::from_setting ( set );
121
122                UI::get ( kilometers, set, "kilometers" );
123                UI::get ( passengers, set, "passengers" );
124        }
125
126        virtual void to_setting ( Setting &set ) const {
127                Transport::to_setting ( set );
128
129                Setting &kilometers_setting = set.add ( "kilometers", Setting::TypeInt );
130                kilometers_setting = kilometers;
131
132                UI::save ( passengers, set, "passengers" );
133        }
134
135        string to_string()  const {
136                stringstream stream;
137                stream << "A car made in " << year << " by " << manufacturer << ", having " << kilometers << " kilometers on the clock.";
138                if ( passengers.length() ) {
139                        stream << "The names of passengers are as follows: ";
140                        for ( int i = 0; i < passengers.length(); i++ )
141                                stream << passengers ( i )->to_string() << " ";
142                }
143                return stream.str();
144        }
145};
146
147UIREGISTER ( Car );
148
149class Bike : public Transport {
150public:
151        bool electricLights;
152        mat matr;
153
154        Bike() : Transport(), matr ( "2,2;3,4" ) {
155                electricLights = false;
156        }
157
158        Bike ( int year, string manufacturer, bool electricLights )
159                        : Transport ( year, manufacturer ), electricLights ( electricLights ) {
160        }
161
162        ~Bike() {
163        }
164
165        void from_setting ( const Setting &set ) {
166                Transport::from_setting ( set );
167
168                int elights;
169                if ( UI::get ( elights, set, "electricLights", UI::optional ) ) {
170                        electricLights = !!elights;
171                }
172
173                UI::get ( matr, set, "matr" );
174        }
175
176        void to_setting ( Setting &set ) const {
177                Transport::to_setting ( set );
178
179                Setting &electricLights_setting = set.add ( "electricLights", Setting::TypeBoolean );
180                electricLights_setting = electricLights;
181
182                UI::save ( matr, set, "matr" );
183        }
184
185        string to_string()  const {
186                stringstream stream;
187                stream << "a bike made in " << year << " by " << manufacturer;
188                if ( electricLights ) stream << " with electric lights included";
189                return stream.str();
190        }
191};
192
193UIREGISTER ( Bike );
194
195class Teleport : public Transport {
196public:
197        void to_setting ( Setting &set ) const {
198                set.add ( "this throws", Setting::TypeNone );
199        }
200};
201
202UIREGISTER ( Teleport );
203
204TEST ( load_test ) {
205        UIFile in ( "user_info_valid.cfg" );
206        shared_ptr<Transport> pepikovo ( UI::build<Transport> ( in, "pepikovo", UI::compulsory ) );
207        CHECK_EQUAL ( string ( "A car made in 1998 by audi, having 25000 kilometers on the clock.The names of passengers are as follows: Karlos Novak -1_CygWin_Matlab_Aimsun Karlosik Novacek " ), pepikovo->to_string() );
208
209        Transport pepikovo_static;
210        UI::get( pepikovo_static, in, "pepikovo", UI::compulsory );
211        CHECK_EQUAL ( string ( "the method to_string() is not implemented" ), pepikovo_static.to_string() );
212       
213        shared_ptr<Transport> jardovo ( UI::build<Transport> ( in, "jardovo", UI::compulsory ) );
214        CHECK_EQUAL ( string ( "A car made in 1992 by liaz, having 1555000 kilometers on the clock." ), jardovo->to_string() );
215
216        shared_ptr<Transport> ondrejovo ( UI::build<Transport> ( in, "ondrejovo", UI::compulsory ) );
217        CHECK_EQUAL ( string ( "a bike made in 1996 by author with electric lights included" ), ondrejovo->to_string() );
218
219        shared_ptr<Transport> elisky ( UI::build<Transport> ( in, "elisky", UI::compulsory ) );
220        CHECK_EQUAL ( string ( "A car made in 1992 by liaz, having 1555000 kilometers on the clock." ), elisky->to_string() );
221
222        shared_ptr<Transport> kati ( UI::build<Transport> ( in, "kati", UI::compulsory ) );
223        CHECK_EQUAL ( string ( "A car made in 1980 by vecernicek, having 250000 kilometers on the clock." ), kati->to_string() );
224}
225
226TEST ( load_error_test ) {
227        UIFile in ( "user_info_valid.cfg" );
228
229        try {
230                shared_ptr<Robot> failing ( UI::build<Robot> ( in, "elisky", UI::compulsory ) );
231                CHECK ( false );
232        } catch ( UIClassException &exc ) {
233                CHECK ( exc.what() );
234        }
235
236        try {
237                shared_ptr<Robot> failing ( UI::build<Robot> ( in, "kati", UI::compulsory ) );
238                CHECK ( false );
239        } catch ( UIException &exc ) {
240                CHECK ( exc.what() );
241        }
242
243        UIFile erroneous ( "user_info_erroneous.cfg" );
244        try {
245                shared_ptr<Transport> jardovo ( UI::build<Transport> ( erroneous, "jardovo", UI::compulsory ) );
246                CHECK ( false );
247        } catch ( UISettingException &exc ) {
248                CHECK ( exc.what() );
249        }
250}
251
252TEST ( save_test ) {
253        UIFile in ( "user_info_valid.cfg" );
254        shared_ptr<Transport> pepikovo ( UI::build<Transport> ( in, "pepikovo", UI::compulsory ) );
255
256        Car audi ( 1968, "zyl", 200 );
257        Car liaz ( 1989, "skoda", 1000 );
258        Bike author ( 2001, "noname", false );
259        UIFile out;
260
261        UI::save ( &audi, out, "marty" );
262        UI::save ( &liaz, out, "bohousovo" );
263        UI::save ( &author, out, "karlovo" );
264        UI::save ( pepikovo, out, "pepikovo" );
265        out.save ( "user_info_output.cfg" );
266
267        string expected ( load_test_file ( "user_info_matrix.cfg" ) );
268        string actual ( load_test_file ( "user_info_output.cfg" ) );
269        CHECK_EQUAL ( expected, actual );
270}
271
272
273TEST ( save_error_test ) {
274        UIFile out;
275
276        Teleport teleport;
277        try {
278                UI::save ( &teleport, out, "unsaveable" );
279                CHECK ( false );
280        } catch ( UIException &exc ) {
281                CHECK ( exc.what() );
282        }
283}
Note: See TracBrowser for help on using the browser.