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 { 61 std::va_list args; 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': 202 gTestController.SetVerbose(false); 203 break; 204 case 'v': 205 gTestController.SetVerbose(true); 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': 223 gTestController.TurnOffExceptions(); 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) { 281 gTestController.SetCurrentContainer("algobase"); 282 cerr << "EH test : algobase" << endl; 283 test_algobase(); 284 } 285 if (run_all || run_algo) { 286 gTestController.SetCurrentContainer("algo"); 287 cerr << "EH test : algo" << endl; 288 test_algo(); 289 } 290 291 if (run_all || run_vector) { 292 gTestController.SetCurrentContainer("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) { 306 gTestController.SetCurrentContainer("list"); 307 cerr << "EH test : list" << endl; 308 test_list(); 309 } 310 311 #if defined( EH_SLIST_IMPLEMENTED ) 312 if (run_all || run_slist) { 313 gTestController.SetCurrentContainer("slist"); 314 cerr << "EH test : slist" << endl; 315 test_slist(); 316 } 317 #endif // EH_SLIST_IMPLEMENTED 318 319 if (run_all || run_deque) { 320 gTestController.SetCurrentContainer("deque"); 321 cerr << "EH test : deque" << endl; 322 test_deque(); 323 } 324 if (run_all || run_set) { 325 gTestController.SetCurrentContainer("set"); 326 cerr << "EH test : set" << endl; 327 test_set(); 328 gTestController.SetCurrentContainer("multiset"); 329 cerr << "EH test : multiset" << endl; 330 test_multiset(); 331 } 332 333 if (run_all || run_map) { 334 gTestController.SetCurrentContainer("map"); 335 cerr << "EH test : map" << endl; 336 test_map(); 337 gTestController.SetCurrentContainer("multimap"); 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) { 344 gTestController.SetCurrentContainer("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; 349 test_hash_multimap(); 350 } 351 352 if (run_all || run_hash_set) { 353 gTestController.SetCurrentContainer("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; 358 test_hash_multiset(); 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) { 366 gTestController.SetCurrentContainer("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) { 374 gTestController.SetCurrentContainer("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) { 381 gTestController.SetCurrentContainer("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) { 388 gTestController.SetCurrentContainer("valarray"); 389 cerr << "EH test : valarray" << endl; 390 test_valarray(); 391 } 392 #endif 393 } 394 395 gTestController.TrackAllocations( false ); 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 408