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

Revision 1064, 7.8 kB (checked in by mido, 14 years ago)

astyle applied all over the library

  • Property svn:eol-style set to native
RevLine 
[344]1#include <string>
[544]2#include <vector>
[418]3#include <string.h>
[386]4#include "base/user_info.h"
[717]5#include "../test_util.h"
[418]6#include "UnitTest++.h"
[244]7
8using namespace std;
[254]9using namespace bdm;
[244]10
[471]11class Passenger : public root {
[351]12public:
13
[1064]14    Passenger() {
15    }
[351]16};
17
[471]18class Human : public Passenger {
[351]19public:
[1064]20    string name;
[351]21
[1064]22    Human() {
23        name = "none";
24    }
[351]25
[1064]26    virtual void from_setting ( const Setting &set ) {
27        UI::get ( name, set, "name" );
28    }
[351]29
[1064]30    virtual void to_setting ( Setting &set ) const {
31        Setting &name_setting = set.add ( "name", Setting::TypeString );
32        name_setting = name;
33    }
[351]34
[1064]35    string to_string()  const {
36        return name;
37    }
[351]38};
39
[471]40UIREGISTER ( Human );
[351]41
[471]42class Robot : public Passenger {
[351]43public:
[1064]44    int number;
45    Array<string> software;
[351]46
[1064]47    Robot() : software() {
48        number = -1;
49    }
[351]50
[1064]51    virtual void from_setting ( const Setting &set ) {
52        UI::get ( number, set, "number" );
53        UI::get ( software, set, "software" );
54    }
[351]55
[1064]56    virtual void to_setting ( Setting &set ) const {
57        Setting &number_setting = set.add ( "number", Setting::TypeInt );
58        number_setting = number;
[351]59
[1064]60        UI::save ( software, set, "software" );
61    }
[351]62
[1064]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    }
[351]70};
71
[471]72UIREGISTER ( Robot );
[351]73
[471]74class Transport : public root {
[344]75public:
[1064]76    int year;
77    string manufacturer;
[344]78
[1064]79    Transport() : year ( 1900 ), manufacturer ( "unknown" ) {
80    }
[344]81
[1064]82    Transport ( int year, string manufacturer ) :
83        year ( year ), manufacturer ( manufacturer ) {
84    }
[344]85
[1064]86    virtual void from_setting ( const Setting &set ) {
87        UI::get ( year, set, "year" );
88        UI::get ( manufacturer, set, "manufacturer" );
89    }
[344]90
[1064]91    virtual void to_setting ( Setting &set ) const {
92        Setting &year_setting = set.add ( "year", Setting::TypeInt );
93        year_setting = year;
[344]94
[1064]95        Setting &manufacturer_setting = set.add ( "manufacturer", Setting::TypeString );
96        manufacturer_setting = manufacturer;
97    }
[942]98
[1064]99    virtual string to_string() const
100    {
101        return "the method to_string() is not implemented";
102    }
[244]103};
104
[471]105class Car : public Transport {
[344]106public:
[1064]107    int kilometers;
108    Array<shared_ptr<Passenger> > passengers;
[344]109
[1064]110    Car() : Transport() {
111        kilometers = 0;
112    }
[344]113
114
[1064]115    Car ( int year, string manufacturer, int kilometers )
116        : Transport ( year, manufacturer ), kilometers ( kilometers ) {
117    }
[344]118
[1064]119    virtual void from_setting ( const Setting &set ) {
120        Transport::from_setting ( set );
[344]121
[1064]122        UI::get ( kilometers, set, "kilometers" );
123        UI::get ( passengers, set, "passengers" );
124    }
[351]125
[1064]126    virtual void to_setting ( Setting &set ) const {
127        Transport::to_setting ( set );
[344]128
[1064]129        Setting &kilometers_setting = set.add ( "kilometers", Setting::TypeInt );
130        kilometers_setting = kilometers;
[344]131
[1064]132        UI::save ( passengers, set, "passengers" );
133    }
[351]134
[1064]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    }
[244]145};
146
[471]147UIREGISTER ( Car );
[344]148
[471]149class Bike : public Transport {
[344]150public:
[1064]151    bool electricLights;
152    mat matr;
[344]153
[1064]154    Bike() : Transport(), matr ( "2,2;3,4" ) {
155        electricLights = false;
156    }
[344]157
[1064]158    Bike ( int year, string manufacturer, bool electricLights )
159        : Transport ( year, manufacturer ), electricLights ( electricLights ) {
160    }
[344]161
[1064]162    ~Bike() {
163    }
[344]164
[1064]165    void from_setting ( const Setting &set ) {
166        Transport::from_setting ( set );
[344]167
[1064]168        int elights;
169        if ( UI::get ( elights, set, "electricLights", UI::optional ) ) {
170            electricLights = !!elights;
171        }
[344]172
[1064]173        UI::get ( matr, set, "matr" );
174    }
[344]175
[1064]176    void to_setting ( Setting &set ) const {
177        Transport::to_setting ( set );
[344]178
[1064]179        Setting &electricLights_setting = set.add ( "electricLights", Setting::TypeBoolean );
180        electricLights_setting = electricLights;
[344]181
[1064]182        UI::save ( matr, set, "matr" );
183    }
[344]184
[1064]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    }
[244]191};
192
[471]193UIREGISTER ( Bike );
[244]194
[544]195class Teleport : public Transport {
196public:
[1064]197    void to_setting ( Setting &set ) const {
198        set.add ( "this throws", Setting::TypeNone );
199    }
[544]200};
201
202UIREGISTER ( Teleport );
203
[689]204TEST ( load_test ) {
[1064]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() );
[351]208
[1064]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() );
[351]212
[1064]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() );
[418]215
[1064]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() );
[418]218
[1064]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() );
[544]224}
[542]225
[689]226TEST ( load_error_test ) {
[1064]227    UIFile in ( "user_info_valid.cfg" );
[544]228
[1064]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    }
[544]235
[1064]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    }
[544]242
[1064]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    }
[418]250}
251
[689]252TEST ( save_test ) {
[1064]253    UIFile in ( "user_info_valid.cfg" );
254    shared_ptr<Transport> pepikovo ( UI::build<Transport> ( in, "pepikovo", UI::compulsory ) );
[418]255
[1064]256    Car audi ( 1968, "zyl", 200 );
257    Car liaz ( 1989, "skoda", 1000 );
258    Bike author ( 2001, "noname", false );
259    UIFile out;
[351]260
[1064]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" );
[351]266
[1064]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 );
[244]270}
[544]271
[689]272
273TEST ( save_error_test ) {
[1064]274    UIFile out;
[544]275
[1064]276    Teleport teleport;
277    try {
278        UI::save ( &teleport, out, "unsaveable" );
279        CHECK ( false );
280    } catch ( UIException &exc ) {
281        CHECK ( exc.what() );
282    }
[544]283}
Note: See TracBrowser for help on using the browser.