diff --git a/include/final/fstring.h b/include/final/fstring.h index c8cb1957..e6c90cae 100644 --- a/include/final/fstring.h +++ b/include/final/fstring.h @@ -133,6 +133,7 @@ class FString const FString& operator >> (FString&); const FString& operator >> (std::wstring&); + const FString& operator >> (std::string&); const FString& operator >> (wchar_t&); const FString& operator >> (char&); const FString& operator >> (sInt16&); diff --git a/src/fstring.cpp b/src/fstring.cpp index 626b502c..18baa796 100644 --- a/src/fstring.cpp +++ b/src/fstring.cpp @@ -439,13 +439,14 @@ const FString FString::operator + (const wchar_t s[]) const FString FString::operator + (const std::string& s) { FString tmp(string); - wchar_t* wc_string = c_to_wc_str(s.c_str()); - if ( ! wc_string ) - return tmp; + if ( ! s.empty() ) + { + wchar_t* wc_string = c_to_wc_str(s.c_str()); + tmp._insert (length, uInt(std::wcslen(wc_string)), wc_string); + delete[] wc_string; + } - tmp._insert (length, uInt(std::wcslen(wc_string)), wc_string); - delete[] wc_string; return tmp; } @@ -453,13 +454,14 @@ const FString FString::operator + (const std::string& s) const FString FString::operator + (const char s[]) { FString tmp(string); - wchar_t* wc_string = c_to_wc_str(s); - if ( ! wc_string ) - return tmp; + if ( s ) + { + wchar_t* wc_string = c_to_wc_str(s); + tmp._insert (length, uInt(std::wcslen(wc_string)), wc_string); + delete[] wc_string; + } - tmp._insert (length, uInt(std::wcslen(wc_string)), wc_string); - delete[] wc_string; return tmp; } @@ -595,6 +597,13 @@ const FString& FString::operator >> (std::wstring& s) return *this; } +//---------------------------------------------------------------------- +const FString& FString::operator >> (std::string& s) +{ + s += toString(); + return *this; +} + //---------------------------------------------------------------------- const FString& FString::operator >> (wchar_t& c) { @@ -668,18 +677,18 @@ const FString& FString::operator >> (float& num) //---------------------------------------------------------------------- wchar_t& FString::operator [] (int pos) { + if ( pos < 0 ) + throw std::out_of_range(""); // Invalid index position + FString& s = *this; - assert ( (pos >= 0) && "Invalid index position!" ); return s[uInt(pos)]; } //---------------------------------------------------------------------- wchar_t& FString::operator [] (uInt pos) { - assert ( (pos < length) && "Invalid index position!" ); - if ( pos >= length ) - throw std::out_of_range(""); + throw std::out_of_range(""); // Invalid index position return string[pos]; } @@ -1414,9 +1423,6 @@ FString& FString::setFormatedNumber (uLong num, char separator) //---------------------------------------------------------------------- bool FString::operator < (const FString& s) const { - if ( ! s ) - return false; - if ( string && ! s.string ) return false; @@ -1477,9 +1483,6 @@ bool FString::operator <= (const FString& s) const if ( ! (string || s.string) ) return true; - if ( ! s ) - return false; - if ( string && ! s.string ) return false; @@ -1537,9 +1540,6 @@ bool FString::operator == (const FString& s) const if ( ! (string || s.string) ) return true; - if ( ! s ) - return false; - if ( bool(string) != bool(s.string) ) return false; @@ -1594,9 +1594,6 @@ bool FString::operator != (const FString& s) const if ( ! (string || s.string) ) return false; - if ( ! s ) - return true; - if ( bool(string) != bool(s.string) ) return true; @@ -1648,9 +1645,6 @@ bool FString::operator != (const char c) const //---------------------------------------------------------------------- bool FString::operator >= (const FString& s) const { - if ( ! s ) - return true; - if ( string && ! s.string ) return true; @@ -1711,9 +1705,6 @@ bool FString::operator > (const FString& s) const if ( ! (string || s.string) ) return false; - if ( ! s ) - return true; - if ( string && ! s.string ) return true; diff --git a/src/test/fstring-test.cpp b/src/test/fstring-test.cpp index b3742252..2fc990e3 100644 --- a/src/test/fstring-test.cpp +++ b/src/test/fstring-test.cpp @@ -63,36 +63,44 @@ class FStringTest : public CPPUNIT_NS::TestFixture void additionTest(); void caseTest(); void equalTest(); + void notEqualTest(); void lessEqualTest(); void lessTest(); void GreaterEqualTest(); void GreaterTest(); - void notEqualTest(); + void streamInsertionTest(); + void streamExtractionTest(); + void subscriptOperatorTest(); + void functionCallOperatorTest(); void exceptionTest(); private: FString* s; - // Adds code needed to register the test suite - CPPUNIT_TEST_SUITE (FStringTest); + // Adds code needed to register the test suite + CPPUNIT_TEST_SUITE (FStringTest); - CPPUNIT_TEST (NoArgumentTest); - CPPUNIT_TEST (initLengthTest); - CPPUNIT_TEST (copyConstructorTest); - CPPUNIT_TEST (assignmentTest); - CPPUNIT_TEST (additionAssignmentTest); - CPPUNIT_TEST (additionTest); - CPPUNIT_TEST (caseTest); - CPPUNIT_TEST (equalTest); - CPPUNIT_TEST (notEqualTest); - CPPUNIT_TEST (lessEqualTest); - CPPUNIT_TEST (lessTest); - CPPUNIT_TEST (GreaterEqualTest); - CPPUNIT_TEST (GreaterTest); - CPPUNIT_TEST (exceptionTest); + CPPUNIT_TEST (NoArgumentTest); + CPPUNIT_TEST (initLengthTest); + CPPUNIT_TEST (copyConstructorTest); + CPPUNIT_TEST (assignmentTest); + CPPUNIT_TEST (additionAssignmentTest); + CPPUNIT_TEST (additionTest); + CPPUNIT_TEST (caseTest); + CPPUNIT_TEST (equalTest); + CPPUNIT_TEST (notEqualTest); + CPPUNIT_TEST (lessEqualTest); + CPPUNIT_TEST (lessTest); + CPPUNIT_TEST (GreaterEqualTest); + CPPUNIT_TEST (GreaterTest); + CPPUNIT_TEST (streamInsertionTest); + CPPUNIT_TEST (streamExtractionTest); + CPPUNIT_TEST (subscriptOperatorTest); + CPPUNIT_TEST (functionCallOperatorTest); + CPPUNIT_TEST (exceptionTest); - // End of test suite definition - CPPUNIT_TEST_SUITE_END(); + // End of test suite definition + CPPUNIT_TEST_SUITE_END(); }; #pragma pack(pop) @@ -175,44 +183,49 @@ void FStringTest::initLengthTest() CPPUNIT_ASSERT ( s2.isEmpty() ); FString s3(x2); - CPPUNIT_ASSERT ( s2.getLength() == 10 ); - CPPUNIT_ASSERT ( ! s2.isNull() ); - CPPUNIT_ASSERT ( s2.isEmpty() ); + CPPUNIT_ASSERT ( s3.getLength() == 10 ); + CPPUNIT_ASSERT ( ! s3.isNull() ); + CPPUNIT_ASSERT ( s3.isEmpty() ); - FString s4(0, '-'); + FString s4(0, L'-'); CPPUNIT_ASSERT ( s4.getLength() == 0 ); CPPUNIT_ASSERT ( s4.isNull() ); CPPUNIT_ASSERT ( s4.isEmpty() ); - FString s5(0, char(0)); + FString s5(0, '-'); CPPUNIT_ASSERT ( s5.getLength() == 0 ); CPPUNIT_ASSERT ( s5.isNull() ); CPPUNIT_ASSERT ( s5.isEmpty() ); - FString s6(x1, '-'); - CPPUNIT_ASSERT ( s6.getLength() == 10 ); - CPPUNIT_ASSERT ( ! s6.isNull() ); - CPPUNIT_ASSERT ( ! s6.isEmpty() ); + FString s6(0, char(0)); + CPPUNIT_ASSERT ( s6.getLength() == 0 ); + CPPUNIT_ASSERT ( s6.isNull() ); + CPPUNIT_ASSERT ( s6.isEmpty() ); - FString s7(x2, '-'); + FString s7(x1, '-'); CPPUNIT_ASSERT ( s7.getLength() == 10 ); CPPUNIT_ASSERT ( ! s7.isNull() ); CPPUNIT_ASSERT ( ! s7.isEmpty() ); - FString s8(x1, L'-'); + FString s8(x2, '-'); CPPUNIT_ASSERT ( s8.getLength() == 10 ); CPPUNIT_ASSERT ( ! s8.isNull() ); CPPUNIT_ASSERT ( ! s8.isEmpty() ); - FString s9(x2, L'-'); + FString s9(x1, L'-'); CPPUNIT_ASSERT ( s9.getLength() == 10 ); CPPUNIT_ASSERT ( ! s9.isNull() ); CPPUNIT_ASSERT ( ! s9.isEmpty() ); - FString s10(x2, wchar_t(0)); + FString s10(x2, L'-'); CPPUNIT_ASSERT ( s10.getLength() == 10 ); CPPUNIT_ASSERT ( ! s10.isNull() ); - CPPUNIT_ASSERT ( s10.isEmpty() ); + CPPUNIT_ASSERT ( ! s10.isEmpty() ); + + FString s11(x2, wchar_t(0)); + CPPUNIT_ASSERT ( s11.getLength() == 10 ); + CPPUNIT_ASSERT ( ! s11.isNull() ); + CPPUNIT_ASSERT ( s11.isEmpty() ); } //---------------------------------------------------------------------- @@ -521,9 +534,11 @@ void FStringTest::lessEqualTest() const FString null_str1; const FString null_str2; + const FString empty(""); CPPUNIT_ASSERT ( ! (s1 <= null_str2) ); CPPUNIT_ASSERT ( null_str1 <= s2 ); CPPUNIT_ASSERT ( null_str1 <= null_str2 ); + CPPUNIT_ASSERT ( ! (s1 <= empty) ); } //---------------------------------------------------------------------- @@ -597,9 +612,11 @@ void FStringTest::GreaterEqualTest() const FString null_str1; const FString null_str2; + const FString empty(""); CPPUNIT_ASSERT ( s1 >= null_str2 ); CPPUNIT_ASSERT ( ! (null_str1 >= s2) ); CPPUNIT_ASSERT ( null_str1 >= null_str2 ); + CPPUNIT_ASSERT ( ! (s1 <= empty) ); } //---------------------------------------------------------------------- @@ -635,11 +652,173 @@ void FStringTest::GreaterTest() CPPUNIT_ASSERT ( ! (null_str1 > null_str2) ); } +//---------------------------------------------------------------------- +void FStringTest::streamInsertionTest() +{ + FString out; + out << FString("ABC"); + CPPUNIT_ASSERT ( out == L"ABC" ); + + out.clear(); + out << std::string("ABC"); + CPPUNIT_ASSERT ( out == L"ABC" ); + + out.clear(); + out << std::wstring(L"ABC"); + CPPUNIT_ASSERT ( out == L"ABC" ); + + out.clear(); + out << const_cast(L"ABC"); + CPPUNIT_ASSERT ( out == L"ABC" ); + + out.clear(); + out << const_cast("ABC"); + CPPUNIT_ASSERT ( out == L"ABC" ); + + out.clear(); + out << wchar_t(L'A'); + CPPUNIT_ASSERT ( out == L"A" ); + + out.clear(); + out << char('A'); + CPPUNIT_ASSERT ( out == L"A" ); + + out.clear(); + out << sInt16(INT_LEAST16_MAX); + CPPUNIT_ASSERT ( out == L"32767" ); + + out.clear(); + out << sInt16(INT_LEAST16_MIN); + CPPUNIT_ASSERT ( out == L"-32768" ); + + out.clear(); + out << int(1234567); + CPPUNIT_ASSERT ( out == L"1234567" ); + + out.clear(); + out << int(-1234567); + CPPUNIT_ASSERT ( out == L"-1234567" ); + + out.clear(); + out << uInt(12345678); + CPPUNIT_ASSERT ( out == L"12345678" ); + + out.clear(); + out << long(-34721053343141); + CPPUNIT_ASSERT ( out == L"-34721053343141" ); + + out.clear(); + out << uLong(4670148723459); + CPPUNIT_ASSERT ( out == L"4670148723459" ); + + out.clear(); + out << float(3.14159); + CPPUNIT_ASSERT ( out == L"3.14159" ); + + out.clear(); + out << double(3.1415926535); + CPPUNIT_ASSERT ( out == L"3.1415926535" ); + + out.clear(); + out << lDouble(3.141592653589793238L); + CPPUNIT_ASSERT ( out == L"3.14159265358979324" ); +} + +//---------------------------------------------------------------------- +void FStringTest::streamExtractionTest() +{ + FString in_1; + FString("ABC") >> in_1; + CPPUNIT_ASSERT ( in_1 == "ABC" ); + + std::wstring in_2; + FString("ABC") >> in_2; + CPPUNIT_ASSERT ( in_2 == L"ABC" ); + + std::string in_3; + FString("ABC") >> in_3; + CPPUNIT_ASSERT ( in_3 == "ABC" ); + + wchar_t in_4; + FString("A") >> in_4; + CPPUNIT_ASSERT ( in_4 == L'A' ); + + char in_5; + FString("A") >> in_5; + CPPUNIT_ASSERT ( in_5 == L'A' ); + + sInt16 in_6; + FString("-12345") >> in_6; + CPPUNIT_ASSERT ( in_6 == -12345 ); + + uInt16 in_7; + FString("33333") >> in_7; + CPPUNIT_ASSERT ( in_7 == 33333 ); + + int in_8; + FString("-12345678") >> in_8; + CPPUNIT_ASSERT ( in_8 == -12345678 ); + + uInt in_9; + FString("99999999") >> in_9; + CPPUNIT_ASSERT ( in_9 == 99999999 ); + + long in_10; + FString("-1234567890") >> in_10; + CPPUNIT_ASSERT ( in_10 == -1234567890 ); + + uLong in_11; + FString("9999999999999") >> in_11; + CPPUNIT_ASSERT ( in_11 == 9999999999999 ); + + float in_12; + FString("2.71828") >> in_12; + CPPUNIT_ASSERT ( in_12 == 2.71828f ); + + double in_13; + FString("2.7182818284590452353") >> in_13; + CPPUNIT_ASSERT ( in_13 == 2.7182818284590452353 ); +} + +//---------------------------------------------------------------------- +void FStringTest::subscriptOperatorTest() +{ + FString s(3); + CPPUNIT_ASSERT ( s[0] == L'\0' ); + CPPUNIT_ASSERT ( s[1] == L'\0' ); + CPPUNIT_ASSERT ( s[2] == L'\0' ); + s[0] = L'A'; + s[1] = L'B'; + s[2] = L'C'; + CPPUNIT_ASSERT ( s[0] == L'A' ); + CPPUNIT_ASSERT ( s[1] == L'B' ); + CPPUNIT_ASSERT ( s[2] == L'C' ); + CPPUNIT_ASSERT ( s == L"ABC" ); +} + +//---------------------------------------------------------------------- +void FStringTest::functionCallOperatorTest() +{ + FString str = L"test"; + CPPUNIT_ASSERT_EQUAL ( str, str() ); + + FString copy = str(); + copy << L"string"; + CPPUNIT_ASSERT ( str() == "test" ); + CPPUNIT_ASSERT ( copy == "teststring" ); +} + //---------------------------------------------------------------------- void FStringTest::exceptionTest() { CPPUNIT_ASSERT_THROW ( FString("abc").toULong() , std::invalid_argument ); + + CPPUNIT_ASSERT_THROW ( FString("abc")[3] + , std::out_of_range); + + CPPUNIT_ASSERT_THROW ( FString("abc")[-1] + , std::out_of_range); } // Put the test suite in the registry