fix String utilities and testcases
authorMichael Andres <ma@suse.de>
Wed, 22 Oct 2008 10:07:10 +0000 (10:07 +0000)
committerMichael Andres <ma@suse.de>
Wed, 22 Oct 2008 10:07:10 +0000 (10:07 +0000)
tests/zypp/base/String_test.cc
zypp/base/String.cc
zypp/base/String.h

index 7f0ffb8..ff9f345 100644 (file)
@@ -1,9 +1,6 @@
-#include <string>
-#include <vector>
-#include <iterator>
-
 #include <boost/test/auto_unit_test.hpp>
 
+#include "zypp/base/LogTools.h"
 #include "zypp/base/String.h"
 
 using boost::unit_test::test_suite;
@@ -97,17 +94,17 @@ BOOST_AUTO_TEST_CASE(test_escape)
 
 BOOST_AUTO_TEST_CASE(convertions)
 {
-    BOOST_CHECK_EQUAL(str::numstring(42), "42");
-    BOOST_CHECK_EQUAL(str::numstring(42, 4), "  42");
-    BOOST_CHECK_EQUAL(str::numstring(42, -4), "42  ");
+    BOOST_CHECK_EQUAL(str::numstring(42),     "42");
+    BOOST_CHECK_EQUAL(str::numstring(42, 6),  "    42");
+    BOOST_CHECK_EQUAL(str::numstring(42, -6), "42    ");
 
-    BOOST_CHECK_EQUAL(str::hexstring(42), "0x0000002a");
-    BOOST_CHECK_EQUAL(str::hexstring(42, 4), "0x2a");
-    BOOST_CHECK_EQUAL(str::hexstring(42, -4), "0x2a");
+    BOOST_CHECK_EQUAL(str::hexstring(42),     "0x0000002a");
+    BOOST_CHECK_EQUAL(str::hexstring(42, 6),  "0x002a");
+    BOOST_CHECK_EQUAL(str::hexstring(42, -6), "0x2a  ");
 
-    BOOST_CHECK_EQUAL(str::octstring(42), "00052");
-    //BOOST_CHECK_EQUAL(str::octstring(42, 4), "0052");
-    //BOOST_CHECK_EQUAL(str::octstring(42, -4), "052");
+    BOOST_CHECK_EQUAL(str::octstring(42),     "00052");
+    BOOST_CHECK_EQUAL(str::octstring(42, 6),  "000052");
+    BOOST_CHECK_EQUAL(str::octstring(42, -6), "052   ");
 
     BOOST_CHECK_EQUAL(str::strtonum<int>("42"), 42);
 
@@ -118,27 +115,57 @@ BOOST_AUTO_TEST_CASE(convertions)
 
 BOOST_AUTO_TEST_CASE(operations)
 {
-    //BOOST_CHECK_EQUAL(str::ltrim("  foo "), "foo");
-    //BOOST_CHECK_EQUAL(str::rtrim(" f ffo  "), "f ffo");
-    BOOST_CHECK_EQUAL(str::trim(" f ffo  "), "f ffo");
-    BOOST_CHECK_EQUAL(str::trim("  f ffo  "), "f ffo");
+    BOOST_CHECK_EQUAL(str::ltrim(" \t f \t ffo \t "), "f \t ffo \t ");
+    BOOST_CHECK_EQUAL(str::rtrim(" \t f \t ffo \t "), " \t f \t ffo");
+    BOOST_CHECK_EQUAL(str::trim(" \t f \t ffo \t "),  "f \t ffo");
+
+    // strip first
+    {
+        string tostrip(" Oh! la la ");
+        string word( str::stripFirstWord(tostrip, true) ); // ltrim first
+        BOOST_CHECK_EQUAL(word, "Oh!");
+        BOOST_CHECK_EQUAL(tostrip, "la la ");
+    }
+    {
+        string tostrip(" Oh! la la ");
+        string word( str::stripFirstWord(tostrip, false) ); // no ltrim first
+        BOOST_CHECK_EQUAL(word, "");
+        BOOST_CHECK_EQUAL(tostrip, "Oh! la la ");
+    }
 
-    // strip
+    // strip last
     {
-        string tostrip("Oh! la la");
-        str::stripFirstWord(tostrip, false);        
-        BOOST_CHECK_EQUAL(tostrip, "la la");
+        string tostrip(" Oh! la la ");
+        string word( str::stripLastWord(tostrip, true) ); // rtrim first
+        BOOST_CHECK_EQUAL(word, "la");
+        BOOST_CHECK_EQUAL(tostrip, " Oh! la");
     }
-    // strip
     {
-        string tostrip("Oh! la la");
-        str::stripLastWord(tostrip, false);        
-        BOOST_CHECK_EQUAL(tostrip, "Oh! la");
+        string tostrip(" Oh! la la ");
+        string word( str::stripLastWord(tostrip, false) ); // no rtrim first
+        BOOST_CHECK_EQUAL(word, "");
+        BOOST_CHECK_EQUAL(tostrip, " Oh! la la");
     }
+}
 
-    BOOST_CHECK( ! str::hasPrefix("foolala", "oo"));
-    BOOST_CHECK( str::hasPrefix("foolala", "foo"));
+BOOST_AUTO_TEST_CASE(prefix_suffix)
+{
+  BOOST_CHECK( str::hasPrefix("abcXabcYabc", "abcX") );
+  BOOST_CHECK( str::hasSuffix("abcXabcYabc", "Yabc") );
 
+  BOOST_CHECK_EQUAL( str::stripPrefix("abcXabcYabc", "abcX"),  "abcYabc" );
+  BOOST_CHECK_EQUAL( str::stripSuffix("abcXabcYabc", "Yabc"),  "abcXabc" );
 
-}
+  BOOST_CHECK( ! str::hasPrefix("abcXabcYabc", "ac") );
+  BOOST_CHECK( ! str::hasSuffix("abcXabcYabc", "ac") );
 
+  BOOST_CHECK_EQUAL( str::stripPrefix("abcXabcYabc", "ac"),  "abcXabcYabc" );
+  BOOST_CHECK_EQUAL( str::stripSuffix("abcXabcYabc", "ac"),  "abcXabcYabc" );
+
+  BOOST_CHECK( str::startsWith("abcXabcYabc", "abc") );
+  BOOST_CHECK( str::endsWith("abcXabcYabc", "abc") );
+
+  BOOST_CHECK( str::contains("abcXabcYabc", "XabcY") );
+  BOOST_CHECK( ! str::contains("abcXabcYabc", "xabcy") );
+  BOOST_CHECK( str::containsCI("abcXabcYabc", "xabcy") );
+}
index 459e61f..4c35ded 100644 (file)
@@ -132,7 +132,7 @@ namespace zypp
 
       std::string ret( s );
 
-      if ( trim_r && L_TRIM )
+      if ( trim_r & L_TRIM )
         {
           std::string::size_type p = ret.find_first_not_of( " \t\n" );
           if ( p == std::string::npos )
@@ -141,7 +141,7 @@ namespace zypp
           ret = ret.substr( p );
         }
 
-      if ( trim_r && R_TRIM )
+      if ( trim_r & R_TRIM )
         {
           std::string::size_type p = ret.find_last_not_of( " \t\n" );
           if ( p == std::string::npos )
index 5530c24..1916ed6 100644 (file)
@@ -610,6 +610,16 @@ namespace zypp
     }
     //@}
 
+    /** \name Locate substring. */
+    //@{
+    /** Locate substring case sensitive. */
+    inline bool contains( const C_Str & str_r, const C_Str & val_r )
+    { return ::strstr( str_r, val_r ); }
+    /** Locate substring case insensitive. */
+    inline bool containsCI( const C_Str & str_r, const C_Str & val_r )
+    { return ::strcasestr( str_r, val_r ); }
+    //@}
+
     ///////////////////////////////////////////////////////////////////
     /** \name Trimming whitepace.
      * \todo optimize l/r trim.
@@ -640,10 +650,6 @@ namespace zypp
 
     std::string getline( std::istream & str, const Trim trim_r );
 
-    inline bool startsWith(const std::string& s, const char* str) { return s.find(str) == 0; }
-    inline bool endsWith(const std::string& s, const char* str) { return s.find(str) == s.size() - strlen(str); }
-    inline bool contains(const std::string& s, const char* str) { return s.find(str) != std::string::npos; }
-
     ///////////////////////////////////////////////////////////////////
 
     /** \name String prefix/suffix handling.
@@ -668,6 +674,13 @@ namespace zypp
         return std::string( str_r, str_r.size() - suffix_r.size() );
       return str_r.c_str();
     }
+
+    /** alias for \ref hasPrefix */
+    inline bool startsWith( const C_Str & str_r, const C_Str & prefix_r )
+    { return hasPrefix( str_r, prefix_r ); }
+    /** alias for \ref hasSuffix */
+    inline bool endsWith( const C_Str & str_r, const C_Str & prefix_r )
+    { return hasSuffix( str_r, prefix_r ); }
     //@}
     /////////////////////////////////////////////////////////////////
   } // namespace str