summaryrefslogtreecommitdiff
path: root/comphelper/qa
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2011-02-14 15:37:58 +0000
committerCaolán McNamara <caolanm@redhat.com>2011-02-14 20:52:53 +0000
commit8a55872a3ca73014ae63c3c4e00de7df50a5452e (patch)
treeb2188fbd1efaff487b5c6b0f046620eabae4b03f /comphelper/qa
parent6fd38fbdae654a3319b6bf808a415638dcdbbffe (diff)
Adjust this to use a Collator to do the string compare
And a break-iterator to break it up into string/digit sections. A bit over engineered I guess.
Diffstat (limited to 'comphelper/qa')
-rw-r--r--comphelper/qa/test_string.cxx160
1 files changed, 149 insertions, 11 deletions
diff --git a/comphelper/qa/test_string.cxx b/comphelper/qa/test_string.cxx
index ab13c8814b38..a5826ae3628d 100644
--- a/comphelper/qa/test_string.cxx
+++ b/comphelper/qa/test_string.cxx
@@ -30,6 +30,8 @@
#include "sal/config.h"
#include "comphelper/string.hxx"
+#include <cppuhelper/implbase1.hxx>
+#include <com/sun/star/i18n/CharType.hpp>
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
@@ -84,61 +86,197 @@ void TestString::test()
CPPUNIT_ASSERT(n3 == -1);
}
+using namespace ::com::sun::star;
+
+class testCollator : public cppu::WeakImplHelper1< i18n::XCollator >
+{
+public:
+ virtual sal_Int32 SAL_CALL compareSubstring(
+ const rtl::OUString& str1, sal_Int32 off1, sal_Int32 len1,
+ const rtl::OUString& str2, sal_Int32 off2, sal_Int32 len2) throw(uno::RuntimeException)
+ {
+ return str1.copy(off1, len1).compareTo(str2.copy(off2, len2));
+ }
+ virtual sal_Int32 SAL_CALL compareString(
+ const rtl::OUString& str1,
+ const rtl::OUString& str2) throw(uno::RuntimeException)
+ {
+ return str1.compareTo(str2);
+ }
+ virtual sal_Int32 SAL_CALL loadDefaultCollator(const lang::Locale&, sal_Int32)
+ throw(uno::RuntimeException) {return 0;}
+ virtual sal_Int32 SAL_CALL loadCollatorAlgorithm(const rtl::OUString&,
+ const lang::Locale&, sal_Int32) throw(uno::RuntimeException) {return 0;}
+ virtual void SAL_CALL loadCollatorAlgorithmWithEndUserOption(const rtl::OUString&,
+ const lang::Locale&, const uno::Sequence< sal_Int32 >&) throw(uno::RuntimeException) {}
+ virtual uno::Sequence< rtl::OUString > SAL_CALL listCollatorAlgorithms(const lang::Locale&)
+ throw(uno::RuntimeException)
+ {
+ return uno::Sequence< rtl::OUString >();
+ }
+ virtual uno::Sequence< sal_Int32 > SAL_CALL listCollatorOptions(const rtl::OUString&)
+ throw(uno::RuntimeException)
+ {
+ return uno::Sequence< sal_Int32 >();
+ }
+};
+
+#define IS_DIGIT(CHAR) (((CHAR) >= 48) && ((CHAR <= 57)))
+
+class testBreakIterator : public cppu::WeakImplHelper1< i18n::XBreakIterator >
+{
+public:
+ virtual sal_Int32 SAL_CALL nextCharacters( const rtl::OUString&, sal_Int32,
+ const lang::Locale&, sal_Int16, sal_Int32, sal_Int32& )
+ throw(uno::RuntimeException) {return -1;}
+ virtual sal_Int32 SAL_CALL previousCharacters( const rtl::OUString&, sal_Int32,
+ const lang::Locale&, sal_Int16, sal_Int32, sal_Int32& )
+ throw(uno::RuntimeException) {return -1;}
+
+ virtual i18n::Boundary SAL_CALL previousWord( const rtl::OUString&, sal_Int32,
+ const lang::Locale&, sal_Int16) throw(uno::RuntimeException)
+ { return i18n::Boundary(); }
+ virtual i18n::Boundary SAL_CALL nextWord( const rtl::OUString&, sal_Int32,
+ const lang::Locale&, sal_Int16) throw(uno::RuntimeException)
+ { return i18n::Boundary(); }
+ virtual i18n::Boundary SAL_CALL getWordBoundary( const rtl::OUString&, sal_Int32,
+ const lang::Locale&, sal_Int16, sal_Bool )
+ throw(uno::RuntimeException)
+ { return i18n::Boundary(); }
+
+ virtual sal_Bool SAL_CALL isBeginWord( const rtl::OUString&, sal_Int32,
+ const lang::Locale&, sal_Int16 ) throw(uno::RuntimeException)
+ { return false; }
+ virtual sal_Bool SAL_CALL isEndWord( const rtl::OUString&, sal_Int32,
+ const lang::Locale& , sal_Int16 ) throw(uno::RuntimeException)
+ { return false; }
+ virtual sal_Int16 SAL_CALL getWordType( const rtl::OUString&, sal_Int32,
+ const lang::Locale& ) throw(uno::RuntimeException)
+ { return 0; }
+
+ virtual sal_Int32 SAL_CALL beginOfSentence( const rtl::OUString&, sal_Int32,
+ const lang::Locale& ) throw(uno::RuntimeException)
+ { return 0; }
+ virtual sal_Int32 SAL_CALL endOfSentence( const rtl::OUString& rText, sal_Int32,
+ const lang::Locale& ) throw(uno::RuntimeException)
+ { return rText.getLength(); }
+
+ virtual i18n::LineBreakResults SAL_CALL getLineBreak( const rtl::OUString&, sal_Int32,
+ const lang::Locale&, sal_Int32,
+ const i18n::LineBreakHyphenationOptions&,
+ const i18n::LineBreakUserOptions&)
+ throw(uno::RuntimeException)
+ {
+ return i18n::LineBreakResults();
+ }
+
+ virtual sal_Int16 SAL_CALL getScriptType( const rtl::OUString&, sal_Int32 )
+ throw(uno::RuntimeException) { return -1; }
+ virtual sal_Int32 SAL_CALL beginOfScript( const rtl::OUString&, sal_Int32,
+ sal_Int16 ) throw(uno::RuntimeException) { return -1; }
+ virtual sal_Int32 SAL_CALL endOfScript( const rtl::OUString&, sal_Int32,
+ sal_Int16 ) throw(uno::RuntimeException) { return -1; }
+ virtual sal_Int32 SAL_CALL previousScript( const rtl::OUString&, sal_Int32,
+ sal_Int16 ) throw(uno::RuntimeException) { return -1; }
+ virtual sal_Int32 SAL_CALL nextScript( const rtl::OUString&, sal_Int32,
+ sal_Int16 ) throw(uno::RuntimeException) { return -1; }
+
+ virtual sal_Int32 SAL_CALL beginOfCharBlock( const rtl::OUString&, sal_Int32,
+ const lang::Locale&, sal_Int16 ) throw(uno::RuntimeException) { return -1; }
+ virtual sal_Int32 SAL_CALL endOfCharBlock( const rtl::OUString& rText, sal_Int32 nStartPos,
+ const lang::Locale&, sal_Int16 CharType ) throw(uno::RuntimeException)
+ {
+ const sal_Unicode *pStr = rText.getStr()+nStartPos;
+ for (sal_Int16 nI = nStartPos; nI < rText.getLength(); ++nI)
+ {
+ if (CharType == i18n::CharType::DECIMAL_DIGIT_NUMBER && !IS_DIGIT(*pStr))
+ return nI;
+ else if (CharType != i18n::CharType::DECIMAL_DIGIT_NUMBER && IS_DIGIT(*pStr))
+ return nI;
+ ++pStr;
+ }
+ return -1;
+ }
+ virtual sal_Int32 SAL_CALL previousCharBlock( const rtl::OUString&, sal_Int32,
+ const lang::Locale&, sal_Int16 ) throw(uno::RuntimeException) { return -1; }
+ virtual sal_Int32 SAL_CALL nextCharBlock( const rtl::OUString& rText, sal_Int32 nStartPos,
+ const lang::Locale&, sal_Int16 CharType ) throw(uno::RuntimeException)
+ {
+ const sal_Unicode *pStr = rText.getStr()+nStartPos;
+ for (sal_Int16 nI = nStartPos; nI < rText.getLength(); ++nI)
+ {
+ if (CharType == i18n::CharType::DECIMAL_DIGIT_NUMBER && IS_DIGIT(*pStr))
+ return nI;
+ else if (CharType != i18n::CharType::DECIMAL_DIGIT_NUMBER && !IS_DIGIT(*pStr))
+ return nI;
+ ++pStr;
+ }
+ return -1;
+ }
+};
+
void TestString::testNatural()
{
using namespace comphelper::string;
+
+ uno::Reference< i18n::XCollator > xCollator(new testCollator);
+ uno::Reference< i18n::XBreakIterator > xBI(new testBreakIterator);
+
// --- Some generic tests to ensure we do not alter original behavior
// outside what we want
CPPUNIT_ASSERT(
- compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("ABC"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("ABC")))) == 0
+ compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("ABC"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("ABC"))), xCollator, xBI, lang::Locale()) == 0
);
// Case sensitivity
CPPUNIT_ASSERT(
- compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("ABC"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("abc")))) < 0
+ compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("ABC"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("abc"))), xCollator, xBI, lang::Locale()) < 0
);
// Reverse
CPPUNIT_ASSERT(
- compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("abc"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("ABC")))) > 0
+ compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("abc"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("ABC"))), xCollator, xBI, lang::Locale()) > 0
);
// First shorter
CPPUNIT_ASSERT(
- compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("alongstring"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("alongerstring")))) > 0
+ compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("alongstring"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("alongerstring"))), xCollator, xBI, lang::Locale()) > 0
);
// Second shorter
CPPUNIT_ASSERT(
- compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("alongerstring"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("alongstring")))) < 0
+ compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("alongerstring"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("alongstring"))), xCollator, xBI, lang::Locale()) < 0
);
// -- Here we go on natural order, each one is followed by classic compare and the reverse comparison
// That's why we originally made the patch
CPPUNIT_ASSERT(
- compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("Heading 9"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("Heading 10")))) < 0
+ compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("Heading 9"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("Heading 10"))), xCollator, xBI, lang::Locale()) < 0
);
// Original behavior
CPPUNIT_ASSERT(
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("Heading 9"))).compareTo(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("Heading 10")))) > 0
);
CPPUNIT_ASSERT(
- compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("Heading 10"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("Heading 9")))) > 0
+ compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("Heading 10"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("Heading 9"))), xCollator, xBI, lang::Locale()) > 0
);
// Harder
CPPUNIT_ASSERT(
- compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("July, the 4th"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("July, the 10th")))) < 0
+ compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("July, the 4th"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("July, the 10th"))), xCollator, xBI, lang::Locale()) < 0
);
CPPUNIT_ASSERT(
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("July, the 4th"))).compareTo(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("July, the 10th")))) > 0
);
CPPUNIT_ASSERT(
- compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("July, the 10th"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("July, the 4th")))) > 0
+ compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("July, the 10th"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("July, the 4th"))), xCollator, xBI, lang::Locale()) > 0
);
// Hardest
CPPUNIT_ASSERT(
- compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("abc08"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("abc010")))) < 0
+ compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("abc08"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("abc010"))), xCollator, xBI, lang::Locale()) < 0
);
CPPUNIT_ASSERT(
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("abc08"))).compareTo(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("abc010")))) > 0
);
CPPUNIT_ASSERT(
- compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("abc010"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("abc08")))) > 0
+ compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("abc010"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("abc08"))), xCollator, xBI, lang::Locale()) > 0
+ );
+ CPPUNIT_ASSERT(
+ compareNatural(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("apple10apple"))), rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(("apple10apple"))), xCollator, xBI, lang::Locale()) == 0
);
}