ReactOS  0.4.13-dev-241-g63286c6
main.cpp
Go to the documentation of this file.
1 /***********************************************************************************
2  Main.cpp
3 
4  * Copyright (c) 1997
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  * Copyright (c) 1997
16  * Moscow Center for SPARC Technology
17  *
18  * Permission to use, copy, modify, distribute and sell this software
19  * and its documentation for any purpose is hereby granted without fee,
20  * provided that the above copyright notice appear in all copies and
21  * that both that copyright notice and this permission notice appear
22  * in supporting documentation. Moscow Center for SPARC Technology makes
23 no
24  * representations about the suitability of this software for any
25  * purpose. It is provided "as is" without express or implied warranty.
26 
27 ***********************************************************************************/
28 #include "Prefix.h"
29 #include "Tests.h"
30 
31 #if defined (EH_NEW_IOSTREAMS)
32 # include <iostream>
33 # else
34 # include <iostream.h>
35 #endif
36 
37 #if defined(macintosh)&&(!defined(__MRC__) && !defined(__SC__)) || defined (_MAC) && defined(__MWERKS__)
38 
39 # include <console.h>
40 # include <Types.h>
41 # include <Strings.h>
42 
43 # ifdef EH_NEW_HEADERS
44 # include <cstdio>
45 # include <cstring>
46 # include <cassert>
47 # else
48 # include <stdio.h>
49 # include <string.h>
50 # include <assert.h>
51 # endif
52 
53 # if defined (_STL_DEBUG)
54 
55 # if defined ( EH_USE_SGI_STL )
56 // Override assertion behavior
57 # include <cstdarg>
58 //# include <stldebug.h>
59 void STLPORT::__stl_debug_message(const char * format_str, ...)
60 {
62  va_start( args, format_str );
63  char msg[256];
64  std::vsnprintf(msg, sizeof(msg)/sizeof(*msg) - 1, format_str, args );
65  DebugStr( c2pstr(msg) );
66 }
67 # else
68 /*===================================================================================
69  __assertion_failed (override standard library function)
70 
71  EFFECTS: Breaks into the debugger and shows the assertion. This implementation
72  is Mac-specific; others could be added for other platforms.
73 ====================================================================================*/
74 extern "C"
75 {
76  void __assertion_failed(char *condition, char *testfilename, int lineno);
77  void __assertion_failed(char *condition, char *testfilename, int lineno)
78  {
79  char msg[256];
80  std::strncpy( msg, condition, 255 );
81  std::strncat( msg, ": ", 255 );
82  std::strncat( msg, testfilename, 255 );
83  std::strncat( msg, ", ", 255 );
84  char line[20];
85  std::sprintf( line, "%d", lineno );
86  std::strncat( msg, line, 255 );
87  DebugStr( c2pstr( msg ) );
88  }
89 }
90 # endif
91 
92 # endif
93 
94 #endif
95 
96 #include "nc_alloc.h"
97 
98 #if defined (EH_NEW_HEADERS)
99 # include <vector>
100 # include <cstring>
101 # else
102 # include <vector.h>
103 # include <string.h>
104 #endif
105 
106 #include "TestClass.h"
107 #include "LeakCheck.h"
108 #include "test_construct.h"
109 #ifdef __BORLANDC__
110 # include <except.h>
111 #endif
112 
113 # if defined(EH_USE_NAMESPACES)
114 namespace // dwa 1/21/00 - must use unnamed namespace here to avoid conflict under gcc using native streams
115 {
116  using namespace std;
117  // using std::cerr;
118  // using std::endl;
119 }
120 # endif
121 
122 
123 /*===================================================================================
124  usage (file-static helper)
125 
126  EFFECTS: Prints a message describing the command-line parameters
127 ====================================================================================*/
128 static void usage(const char* name)
129 {
130  cerr<<"Usage : "<<name<<" [-n <iterations>] [-s <size>] [-l] [-e] [-q]/[-v] [-t] [test_name...]\n";
131  cerr<<"\t[-n <iterations>] : number of test iterations, default==100;"<<endl;
132  cerr<<"\t[-s <size>] : base value for random container sizes, default==1000;"<<endl;
133  cerr<<"\t[-e] : don't throw exceptions, test for leak in normal conditions;"<<endl;
134 // This option was never actually used -- dwa 9/22/97
135 // cerr<<"\t[-i] : ignore leak errors;"<<endl;
136  cerr<<"\t[-q] : quiet mode;"<<endl;
137  cerr<<"\t[-v] : verbose mode;"<<endl;
138  cerr<<"\t[-t] : track each allocation;"<<endl;
139  cerr<<"\t[test name [test name...]] : run only some of the tests by name (default==all tests):"<<endl;
140  cerr<<"\t\tpossible test names are : algo vector bit_vector list slist deque set map hash_set hash_map rope string bitset valarray"<<endl;
141  EH_CSTD::exit(1);
142 }
143 
144 #ifdef EH_NEW_HEADERS
145 # include <set>
146 #else
147 # include <set.h>
148 #endif
149 
150 #if defined(_WIN32_WCE)
151 #include <fstream>
152 #endif
153 
154 int _STLP_CALL main(int argc, char** argv)
155 {
156 #if defined(_WIN32_WCE)
157  std::ofstream file( "\\eh_test.txt" );
158  std::streambuf* old_cout_buf = cout.rdbuf(file.rdbuf());
159  std::streambuf* old_cerr_buf = cerr.rdbuf(file.rdbuf());
160 #endif
161 #if defined( __MWERKS__ ) && defined( macintosh ) // Get command line.
162  argc = ccommand(&argv);
163  // Allow the i/o window to be repositioned.
164 // EH_STD::string s;
165 // getline(EH_STD::cin, s);
166 #endif
167  unsigned int niters=2;
168  bool run_all=true;
169  bool run_slist = false;
170  bool run_list = false;
171  bool run_vector = false;
172  bool run_bit_vector = false;
173  bool run_deque = false;
174  bool run_hash_map = false;
175  bool run_hash_set = false;
176  bool run_set = false;
177  bool run_map = false;
178  bool run_algo = false;
179  bool run_algobase = false;
180  bool run_rope = false;
181  bool run_string = false;
182  bool run_bitset = false;
183  bool run_valarray = false;
184 
185  int cur_argv;
186  char *p, *p1;
187 #if defined (EH_NEW_IOSTREAMS)
188  std::ios_base::sync_with_stdio(false);
189 #endif
190 
191  cerr << argv[0]<<" : Exception handling testsuite.\n";
192  cerr.flush();
193 
194  bool track_allocations = false;
195  // parse parameters :
196  // leak_test [-iterations] [-test] ...
197  for (cur_argv=1; cur_argv<argc; cur_argv++) {
198  p = argv[cur_argv];
199  if (*p == '-') {
200  switch (p[1]) {
201  case 'q':
203  break;
204  case 'v':
206  break;
207 #if 0 // This option was never actually used -- dwa 9/22/97
208  case 'i':
209  gTestController.IgnoreLeaks(true);
210  break;
211 #endif
212  case 'n':
213  p1 = argv[++cur_argv];
214  if (p1 && EH_CSTD::sscanf(p1, "%i", &niters)==1)
215  cerr <<" Doing "<<niters<<" iterations\n";
216  else
217  usage(argv[0]);
218  break;
219  case 't':
220  track_allocations = true;
221  break;
222  case 'e':
224  break;
225  case 's':
226  p1 = argv[++cur_argv];
227  if (p1 && EH_CSTD::sscanf(p1, "%i", &random_base)==1)
228  cerr <<" Setting "<<random_base<<" as base for random sizes.\n";
229  else
230  usage(argv[0]);
231  break;
232  default:
233  usage(argv[0]);
234  break;
235  }
236  } else {
237  run_all = false;
238  // test name
239  if (EH_CSTD::strcmp(p, "algo")==0) {
240  run_algo=true;
241  } else if (EH_CSTD::strcmp(p, "vector")==0) {
242  run_vector=true;
243  } else if (EH_CSTD::strcmp(p, "bit_vector")==0) {
244  run_bit_vector=true;
245  } else if (EH_CSTD::strcmp(p, "list")==0) {
246  run_list=true;
247  } else if (EH_CSTD::strcmp(p, "slist")==0) {
248  run_slist=true;
249  } else if (EH_CSTD::strcmp(p, "deque")==0) {
250  run_deque=true;
251  } else if (EH_CSTD::strcmp(p, "set")==0) {
252  run_set=true;
253  } else if (EH_CSTD::strcmp(p, "map")==0) {
254  run_map=true;
255  } else if (EH_CSTD::strcmp(p, "hash_set")==0) {
256  run_hash_set=true;
257  } else if (EH_CSTD::strcmp(p, "hash_map")==0) {
258  run_hash_map=true;
259  } else if (EH_CSTD::strcmp(p, "rope")==0) {
260  run_rope=true;
261  } else if (EH_CSTD::strcmp(p, "string")==0) {
262  run_string=true;
263  } else if (EH_CSTD::strcmp(p, "bitset")==0) {
264  run_bitset=true;
265  } else if (EH_CSTD::strcmp(p, "valarray")==0) {
266  run_valarray=true;
267  } else {
268  usage(argv[0]);
269  }
270 
271  }
272  }
273 
274  gTestController.TrackAllocations( track_allocations );
275 
276  // Over and over...
277  for ( unsigned i = 0; i < niters ; i++ )
278  {
279  cerr << "iteration #" << i << "\n";
280  if (run_all || run_algobase) {
282  cerr << "EH test : algobase" << endl;
283  test_algobase();
284  }
285  if (run_all || run_algo) {
287  cerr << "EH test : algo" << endl;
288  test_algo();
289  }
290 
291  if (run_all || run_vector) {
293  cerr << "EH test : vector" << endl;
294  test_vector();
295  }
296 
297 #if defined( EH_BIT_VECTOR_IMPLEMENTED )
298  if (run_all || run_bit_vector) {
299  gTestController.SetCurrentContainer("bit_vector");
300  cerr << "EH test : bit_vector" << endl;
301  test_bit_vector();
302  }
303 #endif
304 
305  if (run_all || run_list) {
307  cerr << "EH test : list" << endl;
308  test_list();
309  }
310 
311 #if defined( EH_SLIST_IMPLEMENTED )
312  if (run_all || run_slist) {
314  cerr << "EH test : slist" << endl;
315  test_slist();
316  }
317 #endif // EH_SLIST_IMPLEMENTED
318 
319  if (run_all || run_deque) {
321  cerr << "EH test : deque" << endl;
322  test_deque();
323  }
324  if (run_all || run_set) {
326  cerr << "EH test : set" << endl;
327  test_set();
329  cerr << "EH test : multiset" << endl;
330  test_multiset();
331  }
332 
333  if (run_all || run_map) {
335  cerr << "EH test : map" << endl;
336  test_map();
338  cerr << "EH test : multimap" << endl;
339  test_multimap();
340  }
341 
342 #if defined( EH_HASHED_CONTAINERS_IMPLEMENTED )
343  if (run_all || run_hash_map) {
345  cerr << "EH test : hash_map" << endl;
346  test_hash_map();
347  gTestController.SetCurrentContainer("hash_multimap");
348  cerr << "EH test : hash_multimap" << endl;
350  }
351 
352  if (run_all || run_hash_set) {
354  cerr << "EH test : hash_set" << endl;
355  test_hash_set();
356  gTestController.SetCurrentContainer("hash_multiset");
357  cerr << "EH test : hash_multiset" << endl;
359  }
360 #endif // EH_HASHED_CONTAINERS_IMPLEMENTED
361 
362 #if defined( EH_ROPE_IMPLEMENTED )
363  // CW1.8 can't compile this for some reason!
364 #if !( defined(__MWERKS__) && __MWERKS__ < 0x1900 )
365  if (run_all || run_rope) {
367  cerr << "EH test : rope" << endl;
368  test_rope();
369  }
370 #endif
371 #endif // EH_ROPE_IMPLEMENTED
372 #if defined( EH_STRING_IMPLEMENTED )
373  if (run_all || run_string) {
375  cerr << "EH test : string" << endl;
376  test_string();
377  }
378 #endif
379 #if defined( EH_BITSET_IMPLEMENTED )
380  if (run_all || run_bitset) {
382  cerr << "EH test : bitset" << endl;
383  test_bitset();
384  }
385 #endif
386 #if defined( EH_VALARRAY_IMPLEMENTED )
387  if (run_all || run_bitset) {
389  cerr << "EH test : valarray" << endl;
390  test_valarray();
391  }
392 #endif
393  }
394 
396 
397  cerr << "EH test : Done\n";
398 
399 #if defined(_WIN32_WCE)
400  cout.rdbuf(old_cout_buf);
401  cerr.rdbuf(old_cerr_buf);
402  file.close();
403 #endif
404 
405  return 0;
406 }
407 
#define vsnprintf
Definition: tif_win32.c:406
static int argc
Definition: ServiceArgs.c:12
void test_hash_set()
void test_multiset()
Definition: test_set.cpp:41
static void test_slist(void)
Definition: sync.c:301
void test_bit_vector()
static void usage(const char *name)
Definition: main.cpp:128
char * strncat(char *DstString, const char *SrcString, ACPI_SIZE Count)
Definition: utclib.c:605
char * strncpy(char *DstString, const char *SrcString, ACPI_SIZE Count)
Definition: utclib.c:427
TestController gTestController
Definition: nc_alloc.cpp:46
void test_vector()
Definition: test_vector.cpp:74
Definition: features.h:417
#define argv
Definition: mplay32.c:18
Definition: match.c:390
#define sprintf(buf, format,...)
Definition: sprintf.c:55
#define cout
Definition: iostream.cpp:38
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
void test_hash_map()
basic_ostream< _CharT, _Traits > &_STLP_CALL endl(basic_ostream< _CharT, _Traits > &__os)
Definition: _ostream.h:357
void test_hash_multimap()
void test_deque()
Definition: test_deque.cpp:47
GLenum condition
Definition: glext.h:9255
int _STLP_CALL main(int argc, char **argv)
Definition: main.cpp:154
void test_list()
Definition: test_list.cpp:64
void test_map()
Definition: test_map.cpp:98
Definition: parser.c:48
char * va_list
Definition: acmsvcex.h:78
_Check_return_ _CRTIMP int __cdecl sscanf(_In_z_ const char *_Src, _In_z_ _Scanf_format_string_ const char *_Format,...)
static const CHAR testfilename[]
Definition: api.c:35
static void TurnOffExceptions()
Definition: nc_alloc.h:180
basic_ofstream< char, char_traits< char > > ofstream
Definition: _iosfwd.h:132
_STLP_DECLSPEC _Stl_aligned_buffer< ostream > cerr
Definition: iostream.cpp:102
unsigned random_base
const char file[]
Definition: icontest.c:11
void test_hash_multiset()
void test_rope()
Definition: test_rope.cpp:49
static void SetCurrentContainer(const char *str)
Definition: nc_alloc.h:168
void test_set()
Definition: test_set.cpp:75
void test_multimap()
Definition: test_map.cpp:50
#define va_start(ap, A)
Definition: acmsvcex.h:91
#define msg(x)
Definition: auth_time.c:54
void test_string()
Definition: test_string.cpp:38
Definition: name.c:36
void test_algo()
Definition: test_algo.cpp:248
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
basic_streambuf< char, char_traits< char > > streambuf
Definition: _iosfwd.h:123
void exit(int exitcode)
Definition: _exit.c:33
GLfloat GLfloat p
Definition: glext.h:8902
#define args
Definition: format.c:66
static void TrackAllocations(bool)
Definition: nc_alloc.h:130
#define _STLP_CALL
Definition: _bc.h:131
static void SetVerbose(bool val)
Definition: nc_alloc.h:176
void test_algobase()
Definition: fci.c:126