• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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