1 /***********************************************************************************
2 TestClass.h
3
4 * Copyright (c) 1997-1998
5 * Mark of the Unicorn, Inc.
6 *
7 * Permission to use, copy, modify, distribute and sell this software
8 * and its documentation for any purpose is hereby granted without fee,
9 * provided that the above copyright notice appear in all copies and
10 * that both that copyright notice and this permission notice appear
11 * in supporting documentation. Mark of the Unicorn makes no
12 * representations about the suitability of this software for any
13 * purpose. It is provided "as is" without express or implied warranty.
14
15 SUMMARY: TestClass simulates a class that uses resources. It is designed to
16 cause exceptions when it is constructed or copied.
17
18 ***********************************************************************************/
19 #ifndef INCLUDED_MOTU_TestClass
20 #define INCLUDED_MOTU_TestClass 1
21
22 # include "Prefix.h"
23
24 # include <functional>
25 # include <utility>
26 # include <climits>
27
28 #include <iosfwd>
29 #include "random_number.h"
30 #include "nc_alloc.h"
31
32 class TestClass
33 {
34 public:
35 inline TestClass();
36 inline TestClass( int value );
37 inline TestClass( const TestClass& rhs );
38 inline ~TestClass();
39
40 inline TestClass& operator=( const TestClass& rhs );
41 inline int value() const;
42
43 inline TestClass operator!() const;
44
45 bool operator==( const TestClass& rhs ) const
46 {
47 return value() == rhs.value();
48 }
49
50 bool operator<( const TestClass& rhs ) const {
51 return value() < rhs.value();
52 }
53
54 protected:
55 static inline unsigned int get_random(unsigned range = UINT_MAX);
56 private:
57 inline void Init( int value );
58
59 #if TESTCLASS_DEEP_DATA
60 int *p;
61 #else
62 int v;
63 #endif
64 };
65
66 #if defined( __MWERKS__ ) && __MWERKS__ <= 0x3000 && !__SGI_STL
67 # if defined( __MSL__ ) && __MSL__ < 0x2406
68 # include <iterator.h>
69 __MSL_FIX_ITERATORS__(TestClass);
70 __MSL_FIX_ITERATORS__(const TestClass);
71 typedef EH_STD::pair<const TestClass, TestClass> pair_testclass_testclass;
72 __MSL_FIX_ITERATORS__( pair_testclass_testclass );
73 __MSL_FIX_ITERATORS__( const pair_testclass_testclass );
74 # endif
75 #endif
76
Init(int value)77 inline void TestClass::Init( int value )
78 {
79 #if TESTCLASS_DEEP_DATA
80 p = new int( value );
81 #else
82 simulate_constructor();
83 v = value;
84 #endif
85 }
86
TestClass()87 inline TestClass::TestClass()
88 {
89 Init( int(get_random()) );
90 }
91
TestClass(int value)92 inline TestClass::TestClass( int value )
93 {
94 Init( value );
95 }
96
TestClass(const TestClass & rhs)97 inline TestClass::TestClass( const TestClass& rhs )
98 {
99 Init( rhs.value() );
100 }
101
~TestClass()102 inline TestClass::~TestClass()
103 {
104 #if TESTCLASS_DEEP_DATA
105 delete p;
106 #else
107 simulate_destructor();
108 #endif
109 }
110
111 inline TestClass& TestClass::operator=( const TestClass& rhs )
112 {
113 #if TESTCLASS_DEEP_DATA
114 int *newP = new int( rhs.value() );
115 delete p;
116 p = newP;
117 #else
118 simulate_possible_failure();
119 v = rhs.value();
120 #endif
121 return *this;
122 }
123
value()124 inline int TestClass::value() const
125 {
126 #if TESTCLASS_DEEP_DATA
127 return *p;
128 #else
129 return v;
130 #endif
131 }
132
133 inline TestClass TestClass::operator!() const
134 {
135 return TestClass( value()+1 );
136 }
137
138 inline bool operator>( const TestClass& lhs, const TestClass& rhs ) {
139 return rhs < lhs;
140 }
141
142 inline bool operator>=( const TestClass& lhs, const TestClass& rhs ) {
143 return !(lhs < rhs);
144 }
145
146 inline bool operator<=( const TestClass& lhs, const TestClass& rhs ) {
147 return !(rhs < lhs);
148 }
149
150 inline bool operator != ( const TestClass& lhs, const TestClass& rhs ) {
151 return lhs.value() != rhs.value();
152 }
153
get_random(unsigned range)154 inline unsigned int TestClass::get_random( unsigned range )
155 {
156 return random_number( range );
157 }
158
159 extern std::ostream& operator << ( std::ostream& s, const TestClass&);
160
161 #endif // INCLUDED_MOTU_TestClass
162