]> git.saurik.com Git - wxWidgets.git/blobdiff - tests/strings/strings.cpp
close the file before removing it
[wxWidgets.git] / tests / strings / strings.cpp
index 66cbfb6389a7bf2da51e8e02b0f0ce37a25a047b..34ec5197df7a2d0494768252d40eaa94c3908459 100644 (file)
@@ -37,14 +37,20 @@ private:
         CPPUNIT_TEST( Format );
         CPPUNIT_TEST( Constructors );
         CPPUNIT_TEST( Extraction );
+        CPPUNIT_TEST( Trim );
         CPPUNIT_TEST( Find );
         CPPUNIT_TEST( Replace );
         CPPUNIT_TEST( Match );
         CPPUNIT_TEST( CaseChanges );
         CPPUNIT_TEST( Compare );
         CPPUNIT_TEST( CompareNoCase );
+        CPPUNIT_TEST( Contains );
         CPPUNIT_TEST( ToLong );
         CPPUNIT_TEST( ToULong );
+#ifdef wxLongLong_t
+        CPPUNIT_TEST( ToLongLong );
+        CPPUNIT_TEST( ToULongLong );
+#endif // wxLongLong_t
         CPPUNIT_TEST( ToDouble );
     CPPUNIT_TEST_SUITE_END();
 
@@ -53,14 +59,20 @@ private:
     void Format();
     void Constructors();
     void Extraction();
+    void Trim();
     void Find();
     void Replace();
     void Match();
     void CaseChanges();
     void Compare();
     void CompareNoCase();
+    void Contains();
     void ToLong();
     void ToULong();
+#ifdef wxLongLong_t
+    void ToLongLong();
+    void ToULongLong();
+#endif // wxLongLong_t
     void ToDouble();
 
     DECLARE_NO_COPY_CLASS(StringTestCase)
@@ -165,11 +177,10 @@ void StringTestCase::Extraction()
 
     wxString rest;
 
-    #define TEST_STARTS_WITH( prefix , correct_rest, result ) \
-        CPPUNIT_ASSERT( \
-            ( s.StartsWith( prefix, &rest ) == result ) && \
-            ( ( result == false ) || ( wxStrcmp( correct_rest , rest ) == 0 ) ) \
-        )
+    #define TEST_STARTS_WITH(prefix, correct_rest, result)                    \
+        CPPUNIT_ASSERT_EQUAL(result, s.StartsWith(prefix, &rest));            \
+        if ( result )                                                         \
+            CPPUNIT_ASSERT_EQUAL(wxString(correct_rest), rest)
 
     TEST_STARTS_WITH( _T("Hello"),           _T(", world!"),      true  );
     TEST_STARTS_WITH( _T("Hello, "),         _T("world!"),        true  );
@@ -180,6 +191,41 @@ void StringTestCase::Extraction()
     TEST_STARTS_WITH( _T("Hi"),              _T(""),              false );
 
     #undef TEST_STARTS_WITH
+
+    #define TEST_ENDS_WITH(suffix, correct_rest, result)                      \
+        CPPUNIT_ASSERT_EQUAL(result, s.EndsWith(suffix, &rest));              \
+        if ( result )                                                         \
+            CPPUNIT_ASSERT_EQUAL(wxString(correct_rest), rest)
+
+    TEST_ENDS_WITH( _T(""),                 _T("Hello, world!"), true  );
+    TEST_ENDS_WITH( _T("!"),                _T("Hello, world"),  true  );
+    TEST_ENDS_WITH( _T(", world!"),         _T("Hello"),         true  );
+    TEST_ENDS_WITH( _T("ello, world!"),     _T("H"),             true  );
+    TEST_ENDS_WITH( _T("Hello, world!"),    _T(""),              true  );
+    TEST_ENDS_WITH( _T("very long string"), _T(""),              false );
+    TEST_ENDS_WITH( _T("?"),                _T(""),              false );
+    TEST_ENDS_WITH( _T("Hello, world"),     _T(""),              false );
+    TEST_ENDS_WITH( _T("Gello, world!"),    _T(""),              false );
+
+    #undef TEST_ENDS_WITH
+}
+
+void StringTestCase::Trim()
+{
+    #define TEST_TRIM( str , dir , result )  \
+        CPPUNIT_ASSERT( wxString(str).Trim(dir) == result )
+
+    TEST_TRIM( _T("  Test  "),  true, _T("  Test") );
+    TEST_TRIM( _T("    "),      true, _T("")       );
+    TEST_TRIM( _T(" "),         true, _T("")       );
+    TEST_TRIM( _T(""),          true, _T("")       );
+
+    TEST_TRIM( _T("  Test  "),  false, _T("Test  ") );
+    TEST_TRIM( _T("    "),      false, _T("")       );
+    TEST_TRIM( _T(" "),         false, _T("")       );
+    TEST_TRIM( _T(""),          false, _T("")       );
+
+    #undef TEST_TRIM
 }
 
 void StringTestCase::Find()
@@ -374,62 +420,153 @@ void StringTestCase::CompareNoCase()
     CPPUNIT_CNCNEQ_ASSERT( s1, neq3 );
 }
 
-void StringTestCase::ToLong()
+void StringTestCase::Contains()
 {
-    long l;
-    static const struct ToLongData
+    static const struct ContainsData
     {
-        const wxChar *str;
-        long value;
-        bool ok;
-    } longData[] =
+        const wxChar *hay;
+        const wxChar *needle;
+        bool contains;
+    } containsData[] =
     {
-        { _T("1"), 1, true },
-        { _T("0"), 0, true },
-        { _T("a"), 0, false },
-        { _T("12345"), 12345, true },
-        { _T("-1"), -1, true },
-        { _T("--1"), 0, false },
+        { _T(""),       _T(""),         true  },
+        { _T(""),       _T("foo"),      false },
+        { _T("foo"),    _T(""),         true  },
+        { _T("foo"),    _T("f"),        true  },
+        { _T("foo"),    _T("o"),        true  },
+        { _T("foo"),    _T("oo"),       true  },
+        { _T("foo"),    _T("ooo"),      false },
+        { _T("foo"),    _T("oooo"),     false },
+        { _T("foo"),    _T("fooo"),     false },
     };
 
-    size_t n;
-    for ( n = 0; n < WXSIZEOF(longData); n++ )
+    for ( size_t n = 0; n < WXSIZEOF(containsData); n++ )
+    {
+        const ContainsData& cd = containsData[n];
+        CPPUNIT_ASSERT_EQUAL( cd.contains, wxString(cd.hay).Contains(cd.needle) );
+    }
+}
+
+// flags used in ToLongData.flags
+enum
+{
+    Number_Ok       = 0,
+    Number_Invalid  = 1,
+    Number_Unsigned = 2,    // if not specified, works for signed conversion
+    Number_Signed   = 4,    // if not specified, works for unsigned
+    Number_LongLong = 8,    // only for long long tests
+    Number_Long     = 16,   // only for long tests
+};
+
+static const struct ToLongData
+{
+    const wxChar *str;
+#ifdef wxLongLong_t
+    wxLongLong_t value;
+#else
+    long value;
+#endif // wxLongLong_t
+    int flags;
+
+    long LValue() const { return value; }
+    unsigned long ULValue() const { return value; }
+#ifdef wxLongLong_t
+    wxLongLong_t LLValue() const { return value; }
+    wxULongLong_t ULLValue() const { return (wxULongLong_t)value; }
+#endif // wxLongLong_t
+
+    bool IsOk() const { return !(flags & Number_Invalid); }
+} longData[] =
+{
+    { _T("1"), 1, Number_Ok },
+    { _T("0"), 0, Number_Ok },
+    { _T("a"), 0, Number_Invalid },
+    { _T("12345"), 12345, Number_Ok },
+    { _T("--1"), 0, Number_Invalid },
+
+    { _T("-1"), -1, Number_Signed | Number_Long },
+    // this is surprizing but consistent with strtoul() behaviour
+    { _T("-1"), ULONG_MAX, Number_Unsigned | Number_Long },
+
+    // this must overflow, even with 64 bit long
+    { _T("922337203685477580711"), 0, Number_Invalid },
+
+#ifdef wxLongLong_t
+    { _T("2147483648"), wxLL(2147483648), Number_LongLong },
+    { _T("-2147483648"), wxLL(-2147483648), Number_LongLong | Number_Signed },
+    { _T("9223372036854775808"), wxULL(9223372036854775808), Number_LongLong |
+                                                             Number_Unsigned },
+#endif // wxLongLong_t
+};
+
+void StringTestCase::ToLong()
+{
+    long l;
+    for ( size_t n = 0; n < WXSIZEOF(longData); n++ )
     {
         const ToLongData& ld = longData[n];
-        CPPUNIT_ASSERT_EQUAL( ld.ok, wxString(ld.str).ToLong(&l) );
-        if ( ld.ok )
-            CPPUNIT_ASSERT_EQUAL( ld.value, l );
+
+        if ( ld.flags & (Number_LongLong | Number_Unsigned) )
+            continue;
+
+        CPPUNIT_ASSERT_EQUAL( ld.IsOk(), wxString(ld.str).ToLong(&l) );
+        if ( ld.IsOk() )
+            CPPUNIT_ASSERT_EQUAL( ld.LValue(), l );
     }
 }
 
 void StringTestCase::ToULong()
 {
     unsigned long ul;
-    static const struct ToULongData
+    for ( size_t n = 0; n < WXSIZEOF(longData); n++ )
     {
-        const wxChar *str;
-        unsigned long value;
-        bool ok;
-    } ulongData[] =
+        const ToLongData& ld = longData[n];
+
+        if ( ld.flags & (Number_LongLong | Number_Signed) )
+            continue;
+
+        CPPUNIT_ASSERT_EQUAL( ld.IsOk(), wxString(ld.str).ToULong(&ul) );
+        if ( ld.IsOk() )
+            CPPUNIT_ASSERT_EQUAL( ld.ULValue(), ul );
+    }
+}
+
+#ifdef wxLongLong_t
+
+void StringTestCase::ToLongLong()
+{
+    wxLongLong_t l;
+    for ( size_t n = 0; n < WXSIZEOF(longData); n++ )
     {
-        { _T("1"), 1, true },
-        { _T("0"), 0, true },
-        { _T("a"), 0, false },
-        { _T("12345"), 12345, true },
-        // this is surprizing but consistent with strtoul() behaviour
-        { _T("-1"), ULONG_MAX, true },
-    };
+        const ToLongData& ld = longData[n];
 
-    size_t n;
-    for ( n = 0; n < WXSIZEOF(ulongData); n++ )
+        if ( ld.flags & (Number_Long | Number_Unsigned) )
+            continue;
+
+        CPPUNIT_ASSERT_EQUAL( ld.IsOk(), wxString(ld.str).ToLongLong(&l) );
+        if ( ld.IsOk() )
+            CPPUNIT_ASSERT_EQUAL( ld.LLValue(), l );
+    }
+}
+
+void StringTestCase::ToULongLong()
+{
+    wxULongLong_t ul;
+    for ( size_t n = 0; n < WXSIZEOF(longData); n++ )
     {
-        const ToULongData& uld = ulongData[n];
-        CPPUNIT_ASSERT_EQUAL( uld.ok, wxString(uld.str).ToULong(&ul) );
-        if ( uld.ok )
-            CPPUNIT_ASSERT_EQUAL( uld.value, ul );
+        const ToLongData& ld = longData[n];
+
+        if ( ld.flags & (Number_Long | Number_Signed) )
+            continue;
+
+        CPPUNIT_ASSERT_EQUAL( ld.IsOk(), wxString(ld.str).ToULongLong(&ul) );
+        if ( ld.IsOk() )
+            CPPUNIT_ASSERT_EQUAL( ld.ULLValue(), ul );
     }
 }
 
+#endif // wxLongLong_t
+
 void StringTestCase::ToDouble()
 {
     double d;