| /*********************************************************************************** |
| Main.cpp |
| |
| * Copyright (c) 1997 |
| * Mark of the Unicorn, Inc. |
| * |
| * Permission to use, copy, modify, distribute and sell this software |
| * and its documentation for any purpose is hereby granted without fee, |
| * provided that the above copyright notice appear in all copies and |
| * that both that copyright notice and this permission notice appear |
| * in supporting documentation. Mark of the Unicorn makes no |
| * representations about the suitability of this software for any |
| * purpose. It is provided "as is" without express or implied warranty. |
| |
| * Copyright (c) 1997 |
| * Moscow Center for SPARC Technology |
| * |
| * Permission to use, copy, modify, distribute and sell this software |
| * and its documentation for any purpose is hereby granted without fee, |
| * provided that the above copyright notice appear in all copies and |
| * that both that copyright notice and this permission notice appear |
| * in supporting documentation. Moscow Center for SPARC Technology makes |
| no |
| * representations about the suitability of this software for any |
| * purpose. It is provided "as is" without express or implied warranty. |
| |
| ***********************************************************************************/ |
| #include "Prefix.h" |
| #include "Tests.h" |
| |
| #if defined (EH_NEW_IOSTREAMS) |
| # include <iostream> |
| # else |
| # include <iostream.h> |
| #endif |
| |
| #if defined(macintosh)&&(!defined(__MRC__) && !defined(__SC__)) || defined (_MAC) && defined(__MWERKS__) |
| |
| # include <console.h> |
| # include <Types.h> |
| # include <Strings.h> |
| |
| # ifdef EH_NEW_HEADERS |
| # include <cstdio> |
| # include <cstring> |
| # include <cassert> |
| # else |
| # include <stdio.h> |
| # include <string.h> |
| # include <assert.h> |
| # endif |
| |
| # if defined (_STL_DEBUG) |
| |
| # if defined ( EH_USE_SGI_STL ) |
| // Override assertion behavior |
| # include <cstdarg> |
| //# include <stldebug.h> |
| void STLPORT::__stl_debug_message(const char * format_str, ...) |
| { |
| std::va_list args; |
| va_start( args, format_str ); |
| char msg[256]; |
| std::vsnprintf(msg, sizeof(msg)/sizeof(*msg) - 1, format_str, args ); |
| DebugStr( c2pstr(msg) ); |
| } |
| # else |
| /*=================================================================================== |
| __assertion_failed (override standard library function) |
| |
| EFFECTS: Breaks into the debugger and shows the assertion. This implementation |
| is Mac-specific; others could be added for other platforms. |
| ====================================================================================*/ |
| extern "C" |
| { |
| void __assertion_failed(char *condition, char *testfilename, int lineno); |
| void __assertion_failed(char *condition, char *testfilename, int lineno) |
| { |
| char msg[256]; |
| std::strncpy( msg, condition, 255 ); |
| std::strncat( msg, ": ", 255 ); |
| std::strncat( msg, testfilename, 255 ); |
| std::strncat( msg, ", ", 255 ); |
| char line[20]; |
| std::sprintf( line, "%d", lineno ); |
| std::strncat( msg, line, 255 ); |
| DebugStr( c2pstr( msg ) ); |
| } |
| } |
| # endif |
| |
| # endif |
| |
| #endif |
| |
| #include "nc_alloc.h" |
| |
| #if defined (EH_NEW_HEADERS) |
| # include <vector> |
| # include <cstring> |
| # else |
| # include <vector.h> |
| # include <string.h> |
| #endif |
| |
| #include "TestClass.h" |
| #include "LeakCheck.h" |
| #include "test_construct.h" |
| #ifdef __BORLANDC__ |
| # include <except.h> |
| #endif |
| |
| # if defined(EH_USE_NAMESPACES) |
| namespace // dwa 1/21/00 - must use unnamed namespace here to avoid conflict under gcc using native streams |
| { |
| using namespace std; |
| // using std::cerr; |
| // using std::endl; |
| } |
| # endif |
| |
| |
| /*=================================================================================== |
| usage (file-static helper) |
| |
| EFFECTS: Prints a message describing the command-line parameters |
| ====================================================================================*/ |
| static void usage(const char* name) |
| { |
| cerr<<"Usage : "<<name<<" [-n <iterations>] [-s <size>] [-l] [-e] [-q]/[-v] [-t] [test_name...]\n"; |
| cerr<<"\t[-n <iterations>] : number of test iterations, default==100;"<<endl; |
| cerr<<"\t[-s <size>] : base value for random container sizes, default==1000;"<<endl; |
| cerr<<"\t[-e] : don't throw exceptions, test for leak in normal conditions;"<<endl; |
| // This option was never actually used -- dwa 9/22/97 |
| // cerr<<"\t[-i] : ignore leak errors;"<<endl; |
| cerr<<"\t[-q] : quiet mode;"<<endl; |
| cerr<<"\t[-v] : verbose mode;"<<endl; |
| cerr<<"\t[-t] : track each allocation;"<<endl; |
| cerr<<"\t[test name [test name...]] : run only some of the tests by name (default==all tests):"<<endl; |
| cerr<<"\t\tpossible test names are : algo vector bit_vector list slist deque set map hash_set hash_map rope string bitset valarray"<<endl; |
| EH_CSTD::exit(1); |
| } |
| |
| #ifdef EH_NEW_HEADERS |
| # include <set> |
| #else |
| # include <set.h> |
| #endif |
| |
| #if defined(_WIN32_WCE) |
| #include <fstream> |
| #endif |
| |
| int _STLP_CALL main(int argc, char** argv) |
| { |
| #if defined(_WIN32_WCE) |
| std::ofstream file( "\\eh_test.txt" ); |
| std::streambuf* old_cout_buf = cout.rdbuf(file.rdbuf()); |
| std::streambuf* old_cerr_buf = cerr.rdbuf(file.rdbuf()); |
| #endif |
| #if defined( __MWERKS__ ) && defined( macintosh ) // Get command line. |
| argc = ccommand(&argv); |
| // Allow the i/o window to be repositioned. |
| // EH_STD::string s; |
| // getline(EH_STD::cin, s); |
| #endif |
| unsigned int niters=2; |
| bool run_all=true; |
| bool run_slist = false; |
| bool run_list = false; |
| bool run_vector = false; |
| bool run_bit_vector = false; |
| bool run_deque = false; |
| bool run_hash_map = false; |
| bool run_hash_set = false; |
| bool run_set = false; |
| bool run_map = false; |
| bool run_algo = false; |
| bool run_algobase = false; |
| bool run_rope = false; |
| bool run_string = false; |
| bool run_bitset = false; |
| bool run_valarray = false; |
| |
| int cur_argv; |
| char *p, *p1; |
| #if defined (EH_NEW_IOSTREAMS) |
| std::ios_base::sync_with_stdio(false); |
| #endif |
| |
| cerr << argv[0]<<" : Exception handling testsuite.\n"; |
| cerr.flush(); |
| |
| bool track_allocations = false; |
| // parse parameters : |
| // leak_test [-iterations] [-test] ... |
| for (cur_argv=1; cur_argv<argc; cur_argv++) { |
| p = argv[cur_argv]; |
| if (*p == '-') { |
| switch (p[1]) { |
| case 'q': |
| gTestController.SetVerbose(false); |
| break; |
| case 'v': |
| gTestController.SetVerbose(true); |
| break; |
| #if 0 // This option was never actually used -- dwa 9/22/97 |
| case 'i': |
| gTestController.IgnoreLeaks(true); |
| break; |
| #endif |
| case 'n': |
| p1 = argv[++cur_argv]; |
| if (p1 && EH_CSTD::sscanf(p1, "%i", &niters)==1) |
| cerr <<" Doing "<<niters<<" iterations\n"; |
| else |
| usage(argv[0]); |
| break; |
| case 't': |
| track_allocations = true; |
| break; |
| case 'e': |
| gTestController.TurnOffExceptions(); |
| break; |
| case 's': |
| p1 = argv[++cur_argv]; |
| if (p1 && EH_CSTD::sscanf(p1, "%i", &random_base)==1) |
| cerr <<" Setting "<<random_base<<" as base for random sizes.\n"; |
| else |
| usage(argv[0]); |
| break; |
| default: |
| usage(argv[0]); |
| break; |
| } |
| } else { |
| run_all = false; |
| // test name |
| if (EH_CSTD::strcmp(p, "algo")==0) { |
| run_algo=true; |
| } else if (EH_CSTD::strcmp(p, "vector")==0) { |
| run_vector=true; |
| } else if (EH_CSTD::strcmp(p, "bit_vector")==0) { |
| run_bit_vector=true; |
| } else if (EH_CSTD::strcmp(p, "list")==0) { |
| run_list=true; |
| } else if (EH_CSTD::strcmp(p, "slist")==0) { |
| run_slist=true; |
| } else if (EH_CSTD::strcmp(p, "deque")==0) { |
| run_deque=true; |
| } else if (EH_CSTD::strcmp(p, "set")==0) { |
| run_set=true; |
| } else if (EH_CSTD::strcmp(p, "map")==0) { |
| run_map=true; |
| } else if (EH_CSTD::strcmp(p, "hash_set")==0) { |
| run_hash_set=true; |
| } else if (EH_CSTD::strcmp(p, "hash_map")==0) { |
| run_hash_map=true; |
| } else if (EH_CSTD::strcmp(p, "rope")==0) { |
| run_rope=true; |
| } else if (EH_CSTD::strcmp(p, "string")==0) { |
| run_string=true; |
| } else if (EH_CSTD::strcmp(p, "bitset")==0) { |
| run_bitset=true; |
| } else if (EH_CSTD::strcmp(p, "valarray")==0) { |
| run_valarray=true; |
| } else { |
| usage(argv[0]); |
| } |
| |
| } |
| } |
| |
| gTestController.TrackAllocations( track_allocations ); |
| |
| // Over and over... |
| for ( unsigned i = 0; i < niters ; i++ ) |
| { |
| cerr << "iteration #" << i << "\n"; |
| if (run_all || run_algobase) { |
| gTestController.SetCurrentContainer("algobase"); |
| cerr << "EH test : algobase" << endl; |
| test_algobase(); |
| } |
| if (run_all || run_algo) { |
| gTestController.SetCurrentContainer("algo"); |
| cerr << "EH test : algo" << endl; |
| test_algo(); |
| } |
| |
| if (run_all || run_vector) { |
| gTestController.SetCurrentContainer("vector"); |
| cerr << "EH test : vector" << endl; |
| test_vector(); |
| } |
| |
| #if defined( EH_BIT_VECTOR_IMPLEMENTED ) |
| if (run_all || run_bit_vector) { |
| gTestController.SetCurrentContainer("bit_vector"); |
| cerr << "EH test : bit_vector" << endl; |
| test_bit_vector(); |
| } |
| #endif |
| |
| if (run_all || run_list) { |
| gTestController.SetCurrentContainer("list"); |
| cerr << "EH test : list" << endl; |
| test_list(); |
| } |
| |
| #if defined( EH_SLIST_IMPLEMENTED ) |
| if (run_all || run_slist) { |
| gTestController.SetCurrentContainer("slist"); |
| cerr << "EH test : slist" << endl; |
| test_slist(); |
| } |
| #endif // EH_SLIST_IMPLEMENTED |
| |
| if (run_all || run_deque) { |
| gTestController.SetCurrentContainer("deque"); |
| cerr << "EH test : deque" << endl; |
| test_deque(); |
| } |
| if (run_all || run_set) { |
| gTestController.SetCurrentContainer("set"); |
| cerr << "EH test : set" << endl; |
| test_set(); |
| gTestController.SetCurrentContainer("multiset"); |
| cerr << "EH test : multiset" << endl; |
| test_multiset(); |
| } |
| |
| if (run_all || run_map) { |
| gTestController.SetCurrentContainer("map"); |
| cerr << "EH test : map" << endl; |
| test_map(); |
| gTestController.SetCurrentContainer("multimap"); |
| cerr << "EH test : multimap" << endl; |
| test_multimap(); |
| } |
| |
| #if defined( EH_HASHED_CONTAINERS_IMPLEMENTED ) |
| if (run_all || run_hash_map) { |
| gTestController.SetCurrentContainer("hash_map"); |
| cerr << "EH test : hash_map" << endl; |
| test_hash_map(); |
| gTestController.SetCurrentContainer("hash_multimap"); |
| cerr << "EH test : hash_multimap" << endl; |
| test_hash_multimap(); |
| } |
| |
| if (run_all || run_hash_set) { |
| gTestController.SetCurrentContainer("hash_set"); |
| cerr << "EH test : hash_set" << endl; |
| test_hash_set(); |
| gTestController.SetCurrentContainer("hash_multiset"); |
| cerr << "EH test : hash_multiset" << endl; |
| test_hash_multiset(); |
| } |
| #endif // EH_HASHED_CONTAINERS_IMPLEMENTED |
| |
| #if defined( EH_ROPE_IMPLEMENTED ) |
| // CW1.8 can't compile this for some reason! |
| #if !( defined(__MWERKS__) && __MWERKS__ < 0x1900 ) |
| if (run_all || run_rope) { |
| gTestController.SetCurrentContainer("rope"); |
| cerr << "EH test : rope" << endl; |
| test_rope(); |
| } |
| #endif |
| #endif // EH_ROPE_IMPLEMENTED |
| #if defined( EH_STRING_IMPLEMENTED ) |
| if (run_all || run_string) { |
| gTestController.SetCurrentContainer("string"); |
| cerr << "EH test : string" << endl; |
| test_string(); |
| } |
| #endif |
| #if defined( EH_BITSET_IMPLEMENTED ) |
| if (run_all || run_bitset) { |
| gTestController.SetCurrentContainer("bitset"); |
| cerr << "EH test : bitset" << endl; |
| test_bitset(); |
| } |
| #endif |
| #if defined( EH_VALARRAY_IMPLEMENTED ) |
| if (run_all || run_bitset) { |
| gTestController.SetCurrentContainer("valarray"); |
| cerr << "EH test : valarray" << endl; |
| test_valarray(); |
| } |
| #endif |
| } |
| |
| gTestController.TrackAllocations( false ); |
| |
| cerr << "EH test : Done\n"; |
| |
| #if defined(_WIN32_WCE) |
| cout.rdbuf(old_cout_buf); |
| cerr.rdbuf(old_cerr_buf); |
| file.close(); |
| #endif |
| |
| return 0; |
| } |
| |