Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef TEST_BIGINT_H
- #define TEST_BIGINT_H
- #include "BigInt.h"
- #include <iostream>
- #include <iomanip>
- #endif
- // ******************* Test_BigInt.cpp ***********************
- #include "Test_BigInt.h"
- #define BOOST_TEST_MODULE BigInt test
- #include <boost/test/unit_test.hpp>
- class KeepRunning
- {
- public:
- ~KeepRunning()
- {
- std::cout << "Press ENTER to continue...";
- std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
- }
- };
- BOOST_AUTO_TEST_CASE( BigInt_test )
- {
- using std::cout;
- using std::cin;
- using std::endl;
- using std::string;
- KeepRunning kr;
- std::ostringstream oss;
- std::string s;
- BigInt biDefault;
- oss << biDefault;
- s = "0";
- BOOST_CHECK( oss.str() == s );
- // constructor with unsigned long
- unsigned long n = 4294967295;
- BigInt bi1A( n );
- oss.str( "" );
- oss << bigintbin << bi1A;
- s = "b11111111111111111111111111111111";
- BOOST_CHECK( oss.str() == s );
- n = 65537;
- BigInt bi1B( n );
- oss.str( "" );
- oss << bigintbin << bi1B;
- s = "b10000000000000001";
- BOOST_CHECK( oss.str() == s );
- n = 1;
- BigInt bi1C( n );
- oss.str( "" );
- oss << bigintbin << bi1C;
- s = "b1";
- BOOST_CHECK( oss.str() == s );
- n = 0;
- BigInt bi1D( n );
- oss.str( "" );
- oss << bigintbin << bi1D;
- s = "b0";
- BOOST_CHECK( oss.str() == s );
- // *********************************************************************
- // constructor with signed long
- signed long m = -2147483647;
- BigInt bi2A( m );
- oss.str( "" );
- oss << bigintbin << bi2A;
- s = "b-1111111111111111111111111111111";
- BOOST_CHECK( oss.str() == s );
- // negative number with the largest possible magnitude
- m = -2147483647;
- --m;
- BigInt bi2B( m );
- oss.str( "" );
- oss << bigintbin << bi2B;
- s = "b-10000000000000000000000000000000";
- BOOST_CHECK( oss.str() == s );
- m = -65537;
- BigInt bi2C( m );
- oss.str( "" );
- oss << bigintbin << bi2C;
- s = "b-10000000000000001";
- BOOST_CHECK( oss.str() == s );
- m = -1;
- BigInt bi2D( m );
- oss.str( "" );
- oss << bigintbin << bi2D;
- s = "b-1";
- BOOST_CHECK( oss.str() == s );
- // *********************************************************************
- // constructor with int
- int a = 16;
- BigInt bi3A( a );
- oss.str( "" );
- oss << bigintbin << bi3A;
- s = "b10000";
- BOOST_CHECK( oss.str() == s );
- a = -16;
- BigInt bi3B( a );
- oss.str( "" );
- oss << bigintbin << bi3B;
- s = "b-10000";
- BOOST_CHECK( oss.str() == s );
- // *********************************************************************
- // constructor with string as binary
- string strParameter( "b1110" );
- BigInt biBinA( strParameter );
- oss.str( "" );
- oss << bigintbin << biBinA;
- s = "b1110";
- BOOST_CHECK( oss.str() == s );
- strParameter = "b+1110";
- BigInt biBinB( strParameter );
- oss.str( "" );
- oss << bigintbin << biBinB;
- s = "b1110";
- BOOST_CHECK( oss.str() == s );
- strParameter = "b-1110";
- BigInt biBinC( strParameter );
- oss.str( "" );
- oss << bigintbin << biBinC;
- s = "b-1110";
- BOOST_CHECK( oss.str() == s );
- strParameter = "b0001";
- BigInt biBinD( strParameter );
- oss.str( "" );
- oss << bigintbin << biBinD;
- s = "b1";
- BOOST_CHECK( oss.str() == s );
- strParameter = "B-0001";
- BigInt biBinE( strParameter );
- oss.str( "" );
- oss << bigintbin << biBinE;
- s = "b-1";
- BOOST_CHECK( oss.str() == s );
- strParameter = "B0";
- BigInt biBinF( strParameter );
- oss.str( "" );
- oss << bigintbin << biBinF;
- s = "b0";
- BOOST_CHECK( oss.str() == s );
- strParameter = "B-0";
- BigInt biBinG( strParameter );
- oss.str( "" );
- oss << bigintbin << biBinG;
- s = "b0";
- BOOST_CHECK( oss.str() == s );
- // *********************************************************************
- // constructor with string as decimal
- strParameter = "d14";
- BigInt biDecA( strParameter );
- oss.str( "" );
- oss << bigintbin << biDecA;
- s = "b1110";
- BOOST_CHECK( oss.str() == s );
- strParameter = "d+14";
- BigInt biDecB( strParameter );
- oss.str( "" );
- oss << bigintbin << biDecB;
- s = "b1110";
- BOOST_CHECK( oss.str() == s );
- strParameter = "d-14";
- BigInt biDecC( strParameter );
- oss.str( "" );
- oss << bigintbin << biDecC;
- s = "b-1110";
- BOOST_CHECK( oss.str() == s );
- strParameter = "d0001";
- BigInt biDecD( strParameter );
- oss.str( "" );
- oss << bigintbin << biDecD;
- s = "b1";
- BOOST_CHECK( oss.str() == s );
- strParameter = "D-0001";
- BigInt biDecE( strParameter );
- oss.str( "" );
- oss << bigintbin << biDecE;
- s = "b-1";
- BOOST_CHECK( oss.str() == s );
- strParameter = "D0";
- BigInt biDecF( strParameter );
- oss.str( "" );
- oss << bigintbin << biDecF;
- s = "b0";
- BOOST_CHECK( oss.str() == s );
- strParameter = "D-0";
- BigInt biDecG( strParameter );
- oss.str( "" );
- oss << bigintbin << biDecG;
- s = "b0";
- BOOST_CHECK( oss.str() == s );
- strParameter = "14";
- BigInt biDecH( strParameter );
- oss.str( "" );
- oss << bigintbin << biDecH;
- s = "b1110";
- BOOST_CHECK( oss.str() == s );
- strParameter = "+14";
- BigInt biDecI( strParameter );
- oss.str( "" );
- oss << bigintbin << biDecI;
- s = "b1110";
- BOOST_CHECK( oss.str() == s );
- strParameter = "-14";
- BigInt biDecJ( strParameter );
- oss.str( "" );
- oss << bigintbin << biDecJ;
- s = "b-1110";
- BOOST_CHECK( oss.str() == s );
- strParameter = "-0007";
- BigInt biDecK( strParameter );
- oss.str( "" );
- oss << bigintbin << biDecK;
- s = "b-111";
- BOOST_CHECK( oss.str() == s );
- strParameter = "-0";
- BigInt biDecL( strParameter );
- oss.str( "" );
- oss << bigintbin << biDecL;
- s = "b0";
- BOOST_CHECK( oss.str() == s );
- strParameter = "+0";
- BigInt biDecM( strParameter );
- oss.str( "" );
- oss << bigintbin << biDecM;
- s = "b0";
- BOOST_CHECK( oss.str() == s );
- strParameter = "-4294967295";
- BigInt biDecN( strParameter );
- oss.str( "" );
- oss << bigintbin << biDecN;
- s = "b-11111111111111111111111111111111";
- BOOST_CHECK( oss.str() == s );
- // *********************************************************************
- // constructor with string as hexadecimal
- strParameter = "x14";
- BigInt biHexA( strParameter );
- oss.str( "" );
- oss << bigintbin << biHexA;
- s = "b10100";
- BOOST_CHECK( oss.str() == s );
- strParameter = "x+14";
- BigInt biHexB( strParameter );
- oss.str( "" );
- oss << bigintbin << biHexB;
- s = "b10100";
- BOOST_CHECK( oss.str() == s );
- strParameter = "X-14";
- BigInt biHexC( strParameter );
- oss.str( "" );
- oss << bigintbin << biHexC;
- s = "b-10100";
- BOOST_CHECK( oss.str() == s );
- strParameter = "X0001";
- BigInt biHexD( strParameter );
- oss.str( "" );
- oss << bigintbin << biHexD;
- s = "b1";
- BOOST_CHECK( oss.str() == s );
- strParameter = "X-000A";
- BigInt biHexE( strParameter );
- oss.str( "" );
- oss << bigintbin << biHexE;
- s = "b-1010";
- BOOST_CHECK( oss.str() == s );
- strParameter = "X0";
- BigInt biHexF( strParameter );
- oss.str( "" );
- oss << bigintbin << biHexF;
- s = "b0";
- BOOST_CHECK( oss.str() == s );
- strParameter = "x-0";
- BigInt biHexG( strParameter );
- oss.str( "" );
- oss << bigintbin << biHexG;
- s = "b0";
- BOOST_CHECK( oss.str() == s );
- strParameter = "xaF";
- BigInt biHexH( strParameter );
- oss.str( "" );
- oss << bigintbin << biHexH;
- s = "b10101111";
- BOOST_CHECK( oss.str() == s );
- strParameter = "X-aF";
- BigInt biHexI( strParameter );
- oss.str( "" );
- oss << bigintbin << biHexI;
- s = "b-10101111";
- BOOST_CHECK( oss.str() == s );
- strParameter = "x-ffffffff";
- BigInt biHexL( strParameter );
- oss.str( "" );
- oss << bigintbin << biHexL;
- s = "b-11111111111111111111111111111111";
- BOOST_CHECK( oss.str() == s );
- // constructor with bad string
- bool isBad = false;
- try
- {
- BigInt badBigInt( "b+h" );
- }
- catch ( const std::invalid_argument& e )
- {
- isBad = true;
- BOOST_CHECK( e.what() == string( "Invalid BigInt string=b+h" ) );
- }
- BOOST_CHECK( isBad == true );
- // constructor with string using implicit conversion from char* to string
- BigInt bi5A( "b1110" );
- oss.str( "" );
- oss << bigintbin << bi5A;
- s = "b1110";
- BOOST_CHECK( oss.str() == s );
- BigInt bi5B( "b-1110" );
- oss.str( "" );
- oss << bigintbin << bi5B;
- s = "b-1110";
- BOOST_CHECK( oss.str() == s );
- BigInt bi5C( "b-0000101" );
- oss.str( "" );
- oss << bigintbin << bi5C;
- s = "b-101";
- BOOST_CHECK( oss.str() == s );
- // assignment operators
- BigInt biAssignment;
- unsigned long k1 = 16;
- biAssignment = k1;
- oss.str( "" );
- oss << bigintbin << biAssignment;
- s = "b10000";
- BOOST_CHECK( oss.str() == s );
- signed long k2 = -16;
- biAssignment = k2;
- oss.str( "" );
- oss << bigintbin << biAssignment;
- s = "b-10000";
- BOOST_CHECK( oss.str() == s );
- int k3 = -15;
- biAssignment = k3;
- oss.str( "" );
- oss << bigintbin << biAssignment;
- s = "b-1111";
- BOOST_CHECK( oss.str() == s );
- std::string k4( "255" );
- biAssignment = k4;
- oss.str( "" );
- oss << bigintbin << biAssignment;
- s = "b11111111";
- BOOST_CHECK( oss.str() == s );
- biAssignment = "0011";
- oss.str( "" );
- oss << bigintbin << biAssignment;
- s = "b1011";
- BOOST_CHECK( oss.str() == s );
- // assignment with a bad BigInt string
- isBad = false;
- try
- {
- // This should cause implicit construction of rhs to fail
- biAssignment = "qw78";
- }
- catch ( const std::invalid_argument& e )
- {
- isBad = true;
- BOOST_CHECK( e.what() == string( "Invalid BigInt string=qw78" ) );
- }
- BOOST_CHECK( isBad == true );
- // comparison operators
- BOOST_CHECK( BigInt( "999" ) < BigInt( "1000" ) );
- BOOST_CHECK( BigInt( "-1" ) < BigInt( "0" ) );
- BOOST_CHECK( BigInt( "-11" ) < BigInt( "-10" ) );
- BOOST_CHECK( -11 < BigInt( "-10" ) );
- BOOST_CHECK( BigInt( "-11" ) < -10 );
- BOOST_CHECK( BigInt( "999" ) <= BigInt( "1000" ) );
- BOOST_CHECK( BigInt( "1000" ) <= BigInt( "1000" ) );
- BOOST_CHECK( BigInt( "-1" ) <= BigInt( "0" ) );
- BOOST_CHECK( BigInt( "-0" ) <= BigInt( "0" ) );
- BOOST_CHECK( BigInt( "-11" ) <= BigInt( "10" ) );
- BOOST_CHECK( BigInt( "111" ) <= BigInt( "111" ) );
- BOOST_CHECK( 999 <= BigInt( "1000" ) );
- BOOST_CHECK( BigInt( "1000" ) <= 1000 );
- BOOST_CHECK( BigInt( "b111" ) == BigInt( "b111" ) );
- BOOST_CHECK( 7 == BigInt( "b111" ) );
- BOOST_CHECK( BigInt( "b111" ) == 7 );
- BOOST_CHECK( BigInt( "b111" ) != BigInt( "b110" ) );
- BOOST_CHECK( 7 != BigInt( "b110" ) );
- BOOST_CHECK( BigInt( "b111" ) != BigInt( "b-111" ) );
- BOOST_CHECK( BigInt( "b111" ) != -7 );
- BOOST_CHECK( BigInt( "1001" ) > BigInt( "1000" ) );
- BOOST_CHECK( 1001 > BigInt( "1000" ) );
- BOOST_CHECK( BigInt( "-1000" ) > BigInt( "-1001" ) );
- BOOST_CHECK( BigInt( "-1000" ) > -1001 );
- BOOST_CHECK( BigInt( "0" ) > BigInt( "-1" ) );
- BOOST_CHECK( BigInt( "1001" ) >= BigInt( "1000" ) );
- BOOST_CHECK( 1001 >= BigInt( "1000" ) );
- BOOST_CHECK( BigInt( "-1000" ) >= BigInt( "-1001" ) );
- BOOST_CHECK( BigInt( "-1000" ) >= -1001 );
- BOOST_CHECK( 0 >= BigInt( "-1" ) );
- BOOST_CHECK( BigInt( "0" ) >= BigInt( "-1" ) );
- BOOST_CHECK( BigInt( "0" ) >= -1 );
- // unary operators + and -
- BOOST_CHECK( BigInt( "b1001" ) == +BigInt( "b1001" ) );
- BOOST_CHECK( -BigInt( "-1001" ) == BigInt( "1001" ) );
- BOOST_CHECK( BigInt( "0" ) == -BigInt( "0" ) );
- // conversion functions
- string sampleDecString( "368" ); // 0x170
- string hexString( BigInt::decToHex( sampleDecString ) );
- BOOST_CHECK( hexString == "170" );
- sampleDecString = "369"; // 0x171
- hexString = BigInt::decToHex( sampleDecString );
- BOOST_CHECK( hexString == "171" );
- sampleDecString = "1000"; // 0x3E8
- hexString = BigInt::decToHex( sampleDecString );
- BOOST_CHECK( hexString == "3e8" );
- sampleDecString = "0000"; // 0x0
- hexString = BigInt::decToHex( sampleDecString );
- BOOST_CHECK( hexString == "0" );
- sampleDecString = "4294967295"; // 0xFFFFFFFF
- hexString = BigInt::decToHex( sampleDecString );
- BOOST_CHECK( hexString == "ffffffff" );
- sampleDecString = "5"; // 0x5
- hexString = BigInt::decToHex( sampleDecString );
- BOOST_CHECK( hexString == "5" );
- sampleDecString = "55"; // 0x37
- hexString = BigInt::decToHex( sampleDecString );
- BOOST_CHECK( hexString == "37" );
- // compound assignment +=
- BigInt result;
- BigInt bi6A( "111" );
- result += bi6A;
- BOOST_CHECK( result == bi6A );
- result += -bi6A;
- BOOST_CHECK( result == BigInt( 0 ) );
- result += BigInt( "xFFFF" );
- result += BigInt( "x1" );
- BOOST_CHECK( result == BigInt( "x10000" ) );
- result += BigInt( "x-10001" );
- BOOST_CHECK( result == BigInt( "x-1" ) );
- result += 256;
- BOOST_CHECK( result == BigInt( "xff" ) );
- result += -2147483647;
- BOOST_CHECK( result == BigInt( "x-7fffff00" ) );
- result = 3;
- result += BigInt( -2 );
- BOOST_CHECK( result == BigInt( 1 ) );
- result = 3;
- result += BigInt( -5 );
- BOOST_CHECK( result == BigInt( -2 ) );
- result = -2;
- result += -5;
- BOOST_CHECK( result == BigInt( -7 ) );
- result = -5;
- result += -2;
- BOOST_CHECK( result == BigInt( -7 ) );
- // compound assignment -=
- result = 3;
- result -= 2;
- BOOST_CHECK( result == BigInt( "1" ) );
- result -= 2;
- BOOST_CHECK( result == BigInt( "-1" ) );
- result -= -1;
- BOOST_CHECK( result == BigInt( "0" ) );
- // compound assignment *=
- BigInt resultMult( "b101001" );
- BigInt bi8A( "b111" );
- resultMult *= bi8A;
- BOOST_CHECK( resultMult == BigInt( "b100011111" ) );
- resultMult = "b101001";
- resultMult *= -bi8A;
- BOOST_CHECK( resultMult == BigInt( "b-100011111" ) );
- resultMult = "b-101001";
- resultMult *= -bi8A;
- BOOST_CHECK( resultMult == BigInt( "b100011111" ) );
- resultMult *= 0;
- BOOST_CHECK( resultMult == BigInt( 0 ) );
- // compound assignment /=
- BigInt resultQuotient( 10 );
- resultQuotient /= 2;
- BOOST_CHECK( resultQuotient == BigInt( 5 ) );
- resultQuotient = 11;
- resultQuotient /= 2;
- BOOST_CHECK( resultQuotient == BigInt( 5 ) );
- resultQuotient = 9;
- resultQuotient /= 2;
- BOOST_CHECK( resultQuotient == BigInt( 4 ) );
- resultQuotient = 9;
- resultQuotient /= 10;
- BOOST_CHECK( resultQuotient == BigInt( 0 ) );
- // compound assignment %=
- BigInt resultRemainder = 10;
- resultRemainder %= 5;
- BOOST_CHECK( resultRemainder == BigInt( 0 ) );
- resultRemainder = 11;
- resultRemainder %= 5;
- BOOST_CHECK( resultRemainder == BigInt( 1 ) );
- resultRemainder = 9;
- resultRemainder %= 5;
- BOOST_CHECK( resultRemainder == BigInt( 4 ) );
- // divisionAndRemainder()
- BigInt quotient;
- BigInt remainder;
- BigInt dividend( "b10001101" );
- BigInt divisor( "b111" );
- dividend.divisionAndRemainder( divisor, quotient, remainder );
- BOOST_CHECK( quotient == BigInt( "b10100" ) && remainder == BigInt( "b1" ) );
- dividend = "b111000";
- divisor = "b111";
- dividend.divisionAndRemainder( divisor, quotient, remainder );
- BOOST_CHECK( quotient == BigInt( "b1000" ) && remainder == 0 );
- dividend = 307;
- divisor = 5;
- dividend.divisionAndRemainder( divisor, quotient, remainder );
- BOOST_CHECK( quotient == BigInt( 61 ) && remainder == BigInt( 2 ) );
- dividend = "xffff";
- divisor = "xff";
- dividend.divisionAndRemainder( divisor, quotient, remainder );
- BOOST_CHECK( quotient == BigInt( "x101" ) && remainder == BigInt( "x0" ) );
- dividend = "xff";
- divisor = "xffff";
- dividend.divisionAndRemainder( divisor, quotient, remainder );
- BOOST_CHECK( quotient == BigInt( "x0" ) && remainder == BigInt( "xff" ) );
- dividend = "0";
- divisor = "16";
- dividend.divisionAndRemainder( divisor, quotient, remainder );
- BOOST_CHECK( quotient == BigInt( "x0" ) && remainder == BigInt( "x0" ) );
- dividend = "15";
- divisor = "16";
- dividend.divisionAndRemainder( divisor, quotient, remainder );
- BOOST_CHECK( quotient == BigInt( "x0" ) && remainder == BigInt( "xf" ) );
- dividend = "16";
- divisor = "16";
- dividend.divisionAndRemainder( divisor, quotient, remainder );
- BOOST_CHECK( quotient == BigInt( "x1" ) && remainder == BigInt( "x0" ) );
- dividend = "17";
- divisor = "16";
- dividend.divisionAndRemainder( divisor, quotient, remainder );
- BOOST_CHECK( quotient == BigInt( "x1" ) && remainder == BigInt( "x1" ) );
- // division by zero
- isBad = false;
- try
- {
- dividend = 8;
- divisor = 0;
- dividend.divisionAndRemainder( divisor, quotient, remainder );
- }
- catch ( const std::domain_error& e )
- {
- isBad = true;
- BOOST_CHECK( e.what() == string( "Division by zero" ) );
- }
- BOOST_CHECK( isBad == true );
- // binary arithmetic operators
- BigInt resultBinaryArith;
- resultBinaryArith = BigInt( -2 ) + BigInt( 5 );
- BOOST_CHECK( resultBinaryArith == BigInt( 3 ) );
- resultBinaryArith = BigInt( -2 ) + 5;
- BOOST_CHECK( resultBinaryArith == BigInt( 3 ) );
- resultBinaryArith = 5 + BigInt( -2 );
- BOOST_CHECK( resultBinaryArith == BigInt( 3 ) );
- resultBinaryArith = BigInt( -2 ) - BigInt( 5 );
- BOOST_CHECK( resultBinaryArith == BigInt( -7 ) );
- resultBinaryArith = BigInt( -2 ) - 5;
- BOOST_CHECK( resultBinaryArith == BigInt( -7 ) );
- resultBinaryArith = -5 - BigInt( -2 );
- BOOST_CHECK( resultBinaryArith == BigInt( -3 ) );
- resultBinaryArith = BigInt( -2 ) * BigInt( 5 );
- BOOST_CHECK( resultBinaryArith == BigInt( -10 ) );
- resultBinaryArith = BigInt( -2 ) * BigInt( -5 );
- BOOST_CHECK( resultBinaryArith == BigInt( 10 ) );
- resultBinaryArith = BigInt( -2 ) * -5;
- BOOST_CHECK( resultBinaryArith == BigInt( 10 ) );
- resultBinaryArith = -5 * BigInt( -2 );
- BOOST_CHECK( resultBinaryArith == BigInt( 10 ) );
- resultBinaryArith = BigInt( 4 ) / BigInt( 5 );
- BOOST_CHECK( resultBinaryArith == BigInt( 0 ) );
- resultBinaryArith = BigInt( 5 ) / BigInt( 5 );
- BOOST_CHECK( resultBinaryArith == BigInt( 1 ) );
- resultBinaryArith = BigInt( 6 ) / BigInt( 5 );
- BOOST_CHECK( resultBinaryArith == BigInt( 1 ) );
- resultBinaryArith = BigInt( 6 ) / 5;
- BOOST_CHECK( resultBinaryArith == BigInt( 1 ) );
- resultBinaryArith = 6 / BigInt( 5 );
- BOOST_CHECK( resultBinaryArith == BigInt( 1 ) );
- resultBinaryArith = BigInt( 4 ) % BigInt( 5 );
- BOOST_CHECK( resultBinaryArith == BigInt( 4 ) );
- resultBinaryArith = BigInt( 5 ) % BigInt( 5 );
- BOOST_CHECK( resultBinaryArith == BigInt( 0 ) );
- resultBinaryArith = BigInt( 6 ) % BigInt( 5 );
- BOOST_CHECK( resultBinaryArith == BigInt( 1 ) );
- resultBinaryArith = BigInt( 6 ) % 5;
- BOOST_CHECK( resultBinaryArith == BigInt( 1 ) );
- resultBinaryArith = 4 % BigInt( 5 );
- BOOST_CHECK( resultBinaryArith == BigInt( 4 ) );
- // increment and decrement operators
- BigInt increment( -1 );
- BigInt resultInc;
- resultInc = ++increment;
- BOOST_CHECK( resultInc == BigInt( 0 ) && increment == BigInt( 0 ) );
- resultInc = ++increment;
- BOOST_CHECK( resultInc == BigInt( 1 ) && increment == BigInt( 1 ) );
- resultInc = 0;
- increment = -1;
- resultInc = increment++;
- BOOST_CHECK( resultInc == BigInt( -1 ) && increment == BigInt( 0 ) );
- resultInc = increment++;
- BOOST_CHECK( resultInc == BigInt( 0 ) && increment == BigInt( 1 ) );
- BigInt decrement( 1 );
- BigInt resultDec;
- resultDec = --decrement;
- BOOST_CHECK( resultDec == BigInt( 0 ) && decrement == BigInt( 0 ) );
- resultDec = --decrement;
- BOOST_CHECK( resultDec == BigInt( -1 ) && decrement == BigInt( -1 ) );
- decrement = 0;
- resultDec = decrement--;
- BOOST_CHECK( resultDec == BigInt( 0 ) && decrement == BigInt( -1 ) );
- resultDec = decrement--;
- BOOST_CHECK( resultDec == BigInt( -1 ) && decrement == BigInt( -2 ) );
- // swap()
- BigInt biSwap1( "20" );
- BigInt biSwap2( "-5" );
- biSwap1.swap( biSwap2 );
- BOOST_CHECK( biSwap1 == -5 && biSwap2 == 20 );
- // conversion from binary string to decimal string
- string decFromBinStr( BigInt::binToDec( "11111111" ) );
- BOOST_CHECK( decFromBinStr == string( "255" ) );
- decFromBinStr = BigInt::binToDec( "11111111111111111111111111111111" );
- BOOST_CHECK( decFromBinStr == string( "4294967295" ) );
- decFromBinStr = BigInt::binToDec( "000000001111" );
- BOOST_CHECK( decFromBinStr == string( "15" ) );
- // conversion from hex string to decimal string
- string decFromHexStr( BigInt::hexToDec( "ffff" ) );
- BOOST_CHECK( decFromHexStr == string( "65535" ) );
- decFromHexStr = BigInt::hexToDec( "000000ffff" );
- BOOST_CHECK( decFromHexStr == string( "65535" ) );
- // conversion from binary string to hex string
- string hexFromBinStr( BigInt::binToHex( "1111000001011010" ) ); // 0xf05a
- BOOST_CHECK( hexFromBinStr == string( "f05a" ) );
- hexFromBinStr = BigInt::binToHex( "1111010" ); // 0x7A;
- BOOST_CHECK( hexFromBinStr == string( "7a" ) );
- hexFromBinStr = BigInt::binToHex( "11111" );
- BOOST_CHECK( hexFromBinStr == string( "1f" ) );
- hexFromBinStr = BigInt::binToHex( "000001111" );
- BOOST_CHECK( hexFromBinStr == string( "f" ) );
- hexFromBinStr = BigInt::binToHex( "000000000" );
- BOOST_CHECK( hexFromBinStr == string( "0" ) );
- // conversion from hex string to binary string
- string binFromHexStr( BigInt::hexToBin( "000A" ) );
- BOOST_CHECK( binFromHexStr == string( "1010" ) );
- // conversion from decimal string to binary string
- string binFromDecStr( BigInt::decToBin( "0000015" ) );
- BOOST_CHECK( binFromDecStr == string( "1111" ) );
- // conversion from decimal string to hex string
- string hexFromDecStr( BigInt::decToHex( "0000255" ) );
- BOOST_CHECK( hexFromDecStr == string( "ff" ) );
- // output manipulators
- BigInt outMan = "b1010";
- oss.str( "" );
- oss << bigintdefault << outMan;
- BOOST_CHECK( oss.str() == string( "10" ) );
- oss.str( "" );
- oss << bigintshowbase << outMan;
- BOOST_CHECK( oss.str() == string( "10" ) );
- oss.str( "" );
- oss << biginthex << outMan;
- BOOST_CHECK( oss.str() == string( "xa" ) );
- oss.str( "" );
- oss << bigintupper << outMan;
- BOOST_CHECK( oss.str() == string( "XA" ) );
- oss.str( "" );
- oss << bigintbin << outMan;
- BOOST_CHECK( oss.str() == string( "B1010" ) );
- oss.str( "" );
- oss << bigintlower << outMan;
- BOOST_CHECK( oss.str() == string( "b1010" ) );
- oss.str( "" );
- oss << bigintnoshowbase << outMan;
- BOOST_CHECK( oss.str() == string( "1010" ) );
- oss.str( "" );
- oss << biginthex << outMan;
- BOOST_CHECK( oss.str() == string( "a" ) );
- oss.str( "" );
- oss << bigintdec << outMan;
- BOOST_CHECK( oss.str() == string( "10" ) );
- // isValidBigIntString()
- s = "";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "b";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "B";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "x";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "X";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "d";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "D";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "+";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "-";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "b+";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "b-";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "x+";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "x-";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "d+";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "d-";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "b2";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "xg";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "da";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "+a";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "-a";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "b-2";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "x-g";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "d-a";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "+2a";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "-2a";
- BOOST_CHECK( ! BigInt::isValidBigIntString( s ) );
- s = "b101";
- BOOST_CHECK( BigInt::isValidBigIntString( s ) );
- s = "b+101";
- BOOST_CHECK( BigInt::isValidBigIntString( s ) );
- s = "b-110";
- BOOST_CHECK( BigInt::isValidBigIntString( s ) );
- s = "b1101";
- BOOST_CHECK( BigInt::isValidBigIntString( s ) );
- s = "x+107af";
- BOOST_CHECK( BigInt::isValidBigIntString( s ) );
- s = "x-107af";
- BOOST_CHECK( BigInt::isValidBigIntString( s ) );
- s = "x107af";
- BOOST_CHECK( BigInt::isValidBigIntString( s ) );
- s = "d-12390";
- BOOST_CHECK( BigInt::isValidBigIntString( s ) );
- s = "d12390";
- BOOST_CHECK( BigInt::isValidBigIntString( s ) );
- s = "-456";
- BOOST_CHECK( BigInt::isValidBigIntString( s ) );
- s = "+456";
- BOOST_CHECK( BigInt::isValidBigIntString( s ) );
- s = "12389";
- BOOST_CHECK( BigInt::isValidBigIntString( s ) );
- // input operator >>
- BigInt biInput1( 5 );
- std::istringstream iss;
- iss.str( "" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 5 && iss.fail() && iss.eof() );
- iss.clear();
- iss.str( "b+tt" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 5 && iss.fail() && iss.eof() );
- iss.clear();
- iss.str( "b+ss 234" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 5 && iss.fail() && ! iss.eof() );
- iss.clear();
- iss.str( "1234" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 1234 && ! iss.fail() && iss.eof() );
- BigInt biInput2 = "50";
- BigInt biInput3 = "75";
- iss.clear();
- iss.str( "b-1010 xff " );
- iss >> biInput1 >> biInput2 >> biInput3;
- BOOST_CHECK( biInput1 == -10 && biInput2 ==255 && biInput3 == 75 && iss.fail() && iss.eof() );
- // input stream manipulators
- // bigintdefault
- biInput1 = 0;
- iss.clear();
- iss >> bigintdefault;
- iss.str( "b1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 10 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "b-1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == -10 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "x1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 4112 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "x-1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == -4112 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "d1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 1010 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "d-1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == -1010 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 1010 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "-1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == -1010 && ! iss.fail() && iss.eof() );
- // bigintdecimal ( should be the same as bigintdefault )
- biInput1 = 0;
- iss.clear();
- iss >> bigintdec;
- iss.str( "b1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 10 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "b-1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == -10 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "x1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 4112 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "x-1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == -4112 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "d1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 1010 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "d-1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == -1010 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 1010 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "-1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == -1010 && ! iss.fail() && iss.eof() );
- // bigintbin
- biInput1 = 0;
- iss.clear();
- iss >> bigintbin;
- iss.str( "b1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 10 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "b-1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == -10 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "x1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 4112 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "x-1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == -4112 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "d1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 1010 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "d-1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == -1010 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 10 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "-1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == -10 && ! iss.fail() && iss.eof() );
- // biginthex
- biInput1 = 0;
- iss.clear();
- iss >> biginthex;
- iss.str( "b1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 10 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "b-1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == -10 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "x1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 4112 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "x-1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == -4112 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "d1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 1010 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "d-1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == -1010 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == 4112 && ! iss.fail() && iss.eof() );
- biInput1 = 0;
- iss.clear();
- iss.str( "-1010" );
- iss >> biInput1;
- BOOST_CHECK( biInput1 == -4112 && ! iss.fail() && iss.eof() );
- // factorial function
- string factorial_100String( "9332621544394415268169923885626670049071596826438162146859296389521759999322991"
- "5608941463976156518286253697920827223758251185210916864000000000000000000000000" );
- BigInt resultFactorial_100;
- resultFactorial_100 = factorial( 100 );
- oss.str( "" );
- oss << bigintnoshowbase << bigintdec << resultFactorial_100;
- BOOST_CHECK( factorial_100String == oss.str() );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement