root/library/tests/shared_ptr_test.cpp @ 589

Revision 589, 2.1 kB (checked in by vbarta, 15 years ago)

testing debug check only in debug build

RevLine 
[419]1#include "shared_ptr.h"
2#include "UnitTest++.h"
[565]3#include <stdexcept>
[419]4#include <vector>
5
[477]6class Foo {
[419]7private:
[477]8        int x;
[419]9
10public:
[477]11        Foo ( int x ) : x ( x ) { }
[419]12
[477]13        int get_x() const {
14                return x;
15        }
[419]16
[477]17        void set_x ( int nx ) {
18                x = nx;
19        }
[419]20};
21
22typedef std::vector<bdm::shared_ptr<Foo> > TFooVector;
23
[570]24typedef std::vector<bdm::shared_ptr<const Foo> > TConstFooVector;
25
[477]26TEST ( test_shared_ptr ) {
27        TFooVector v;
[419]28
[477]29        bdm::shared_ptr<Foo> zero;
30        CHECK_EQUAL ( 0l, zero.use_count() );
31        bdm::shared_ptr<Foo> z2 ( zero );
32        CHECK_EQUAL ( 0l, z2.use_count() );
[419]33
[477]34        bdm::shared_ptr<Foo> one ( new Foo ( 1 ) );
35        v.push_back ( one );
36        CHECK ( !one.unique() );
[419]37
[477]38        v.push_back ( one );
39        v.push_back ( bdm::shared_ptr<Foo> ( new Foo ( 2 ) ) );
40        CHECK_EQUAL ( static_cast<TFooVector::size_type> ( 3 ), v.size() );
[419]41
[477]42        CHECK ( v[0] == v[1] );
43        CHECK ( v[1] != v[2] );
[421]44
[477]45        Foo c ( * ( v[0] ) );
46        CHECK_EQUAL ( 1, c.get_x() );
[419]47
[477]48        Foo *p = v[1].get();
49        CHECK_EQUAL ( 1, p->get_x() );
50        p->set_x ( 12 );
51        CHECK_EQUAL ( 12, one->get_x() );
52
53        CHECK ( v[2].unique() );
54        CHECK_EQUAL ( 2, v[2]->get_x() );
[419]55}
[565]56
[570]57TEST ( test_shared_ptr_const ) {
58        TConstFooVector v;
59
60        bdm::shared_ptr<const Foo> zero;
61        CHECK_EQUAL ( 0l, zero.use_count() );
62        bdm::shared_ptr<const Foo> z2 ( zero );
63        CHECK_EQUAL ( 0l, z2.use_count() );
64
65        bdm::shared_ptr<const Foo> one ( new Foo ( 1 ) );
66        v.push_back ( one );
67        CHECK ( !one.unique() );
68
69        v.push_back ( one );
70        v.push_back ( bdm::shared_ptr<const Foo> ( new Foo ( 2 ) ) );
71        CHECK_EQUAL ( static_cast<TConstFooVector::size_type> ( 3 ), v.size() );
72
73        CHECK ( v[0] == v[1] );
74        CHECK ( v[1] != v[2] );
75
76        Foo c ( * ( v[0] ) );
77        CHECK_EQUAL ( 1, c.get_x() );
78
79        const Foo *p = v[1].get();
80        CHECK_EQUAL ( 1, p->get_x() );
81
82        CHECK ( v[2].unique() );
83        CHECK_EQUAL ( 2, v[2]->get_x() );
84
85        bdm::shared_ptr<Foo> non_const;
86        bdm::shared_ptr<const Foo> another ( non_const );
87        CHECK ( !non_const.unique() );
88}
89
[589]90// tested runtime check is only in debug version
91#ifndef NDEBUG
[565]92TEST ( test_shared_ptr_error ) {
93        bdm::shared_ptr<Foo> empty;
94        try {
95                Foo x(*empty);
96                CHECK ( false );
97        } catch ( std::runtime_error &exc ) {
98                CHECK ( exc.what() );
99        }
100}
[589]101#endif
Note: See TracBrowser for help on using the browser.