// basictests.cpp : basic unit tests // /** * Copyright (C) 2009 10gen Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ #include "stdafx.h" #include "dbtests.h" #include "../util/base64.h" #include "../util/array.h" namespace BasicTests { class Rarely { public: void run() { int first = 0; int second = 0; int third = 0; for( int i = 0; i < 128; ++i ) { incRarely( first ); incRarely2( second ); ONCE ++third; } ASSERT_EQUALS( 1, first ); ASSERT_EQUALS( 1, second ); ASSERT_EQUALS( 1, third ); } private: void incRarely( int &c ) { RARELY ++c; } void incRarely2( int &c ) { RARELY ++c; } }; class Base64Tests { public: void roundTrip( string s ){ ASSERT_EQUALS( s , base64::decode( base64::encode( s ) ) ); } void roundTrip( const unsigned char * _data , int len ){ const char *data = (const char *) _data; string s = base64::encode( data , len ); string out = base64::decode( s ); ASSERT_EQUALS( out.size() , static_cast(len) ); bool broke = false; for ( int i=0; i 1000000 ); ASSERT( t.micros() < 2000000 ); t.reset(); sleepmillis( 1727 ); ASSERT( t.millis() >= 1000 ); ASSERT( t.millis() <= 2000 ); } }; class AssertTests { public: int x; AssertTests(){ x = 0; } string foo(){ x++; return ""; } void run(){ uassert( -1 , foo() , 1 ); ASSERT_EQUALS( 0 , x ); try { uassert( -1 , foo() , 0 ); } catch ( ... ){} ASSERT_EQUALS( 1 , x ); } }; namespace ArrayTests { class basic1 { public: void run(){ FastArray a(100); a.push_back( 5 ); a.push_back( 6 ); ASSERT_EQUALS( 2 , a.size() ); FastArray::iterator i = a.begin(); ASSERT( i != a.end() ); ASSERT_EQUALS( 5 , *i ); ++i; ASSERT( i != a.end() ); ASSERT_EQUALS( 6 , *i ); ++i; ASSERT( i == a.end() ); } }; }; class ThreadSafeStringTest { public: void run(){ ThreadSafeString s; s = "eliot"; ASSERT_EQUALS( s , "eliot" ); ASSERT( s != "eliot2" ); ThreadSafeString s2 = s; ASSERT_EQUALS( s2 , "eliot" ); { string foo; { ThreadSafeString bar; bar = "eliot2"; foo = bar; } ASSERT_EQUALS( "eliot2" , foo ); } } }; class LexNumCmp { public: void run() { ASSERT_EQUALS( 0, lexNumCmp( "a", "a" ) ); ASSERT_EQUALS( -1, lexNumCmp( "a", "aa" ) ); ASSERT_EQUALS( 1, lexNumCmp( "aa", "a" ) ); ASSERT_EQUALS( -1, lexNumCmp( "a", "b" ) ); ASSERT_EQUALS( 1, lexNumCmp( "100", "50" ) ); ASSERT_EQUALS( -1, lexNumCmp( "50", "100" ) ); ASSERT_EQUALS( 1, lexNumCmp( "b", "a" ) ); ASSERT_EQUALS( 0, lexNumCmp( "aa", "aa" ) ); ASSERT_EQUALS( -1, lexNumCmp( "aa", "ab" ) ); ASSERT_EQUALS( 1, lexNumCmp( "ab", "aa" ) ); ASSERT_EQUALS( 1, lexNumCmp( "0", "a" ) ); ASSERT_EQUALS( 1, lexNumCmp( "a0", "aa" ) ); ASSERT_EQUALS( -1, lexNumCmp( "a", "0" ) ); ASSERT_EQUALS( -1, lexNumCmp( "aa", "a0" ) ); ASSERT_EQUALS( 0, lexNumCmp( "0", "0" ) ); ASSERT_EQUALS( 0, lexNumCmp( "10", "10" ) ); ASSERT_EQUALS( -1, lexNumCmp( "1", "10" ) ); ASSERT_EQUALS( 1, lexNumCmp( "10", "1" ) ); ASSERT_EQUALS( 1, lexNumCmp( "11", "10" ) ); ASSERT_EQUALS( -1, lexNumCmp( "10", "11" ) ); ASSERT_EQUALS( 1, lexNumCmp( "f11f", "f10f" ) ); ASSERT_EQUALS( -1, lexNumCmp( "f10f", "f11f" ) ); ASSERT_EQUALS( -1, lexNumCmp( "f11f", "f111" ) ); ASSERT_EQUALS( 1, lexNumCmp( "f111", "f11f" ) ); ASSERT_EQUALS( -1, lexNumCmp( "f12f", "f12g" ) ); ASSERT_EQUALS( 1, lexNumCmp( "f12g", "f12f" ) ); ASSERT_EQUALS( 1, lexNumCmp( "aa{", "aab" ) ); ASSERT_EQUALS( 1, lexNumCmp( "aa{", "aa1" ) ); ASSERT_EQUALS( -1, lexNumCmp( "a1{", "a11" ) ); ASSERT_EQUALS( 1, lexNumCmp( "a1{a", "a1{" ) ); ASSERT_EQUALS( -1, lexNumCmp( "a1{", "a1{a" ) ); ASSERT_EQUALS( 1, lexNumCmp("21", "11") ); ASSERT_EQUALS( -1, lexNumCmp("11", "21") ); ASSERT_EQUALS( -1 , lexNumCmp( "a.0" , "a.1" ) ); ASSERT_EQUALS( -1 , lexNumCmp( "a.0.b" , "a.1" ) ); } }; class All : public Suite { public: All() : Suite( "basic" ){ } void setupTests(){ add< Rarely >(); add< Base64Tests >(); add< stringbuildertests::simple1 >(); add< stringbuildertests::simple2 >(); add< stringbuildertests::reset1 >(); add< stringbuildertests::reset2 >(); add< sleeptest >(); add< AssertTests >(); add< ArrayTests::basic1 >(); add< LexNumCmp >(); } } myall; } // namespace BasicTests