| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 | 
							- ///////////////////////////////////////////////////////////////////////////////
 
- // Name:        tests/regex/wxregex.cpp
 
- // Purpose:     Test wxRegEx
 
- // Author:      Vadim Zeitlin, Mike Wetherell
 
- // Copyright:   Vadim Zeitlin, Mike Wetherell
 
- // Licence:     wxWindows licence
 
- ///////////////////////////////////////////////////////////////////////////////
 
- #include "testprec.h"
 
- #ifdef __BORLANDC__
 
- #   pragma hdrstop
 
- #endif
 
- #ifndef WX_PRECOMP
 
- #   include "wx/wx.h"
 
- #endif
 
- #if wxUSE_REGEX
 
- #include "wx/regex.h"
 
- #include "wx/tokenzr.h"
 
- #include <string>
 
- using CppUnit::Test;
 
- using CppUnit::TestCase;
 
- using CppUnit::TestSuite;
 
- using std::string;
 
- ///////////////////////////////////////////////////////////////////////////////
 
- // Compile Test
 
- class RegExCompileTestCase : public TestCase
 
- {
 
- public:
 
-     RegExCompileTestCase(const char *name, const wxString& pattern,
 
-                          bool correct, int flags)
 
-     :   TestCase(name),
 
-         m_pattern(pattern),
 
-         m_correct(correct),
 
-         m_flags(flags)
 
-     { }
 
- protected:
 
-     void runTest();
 
- private:
 
-     wxString m_pattern;
 
-     bool m_correct;
 
-     int m_flags;
 
- };
 
- void RegExCompileTestCase::runTest()
 
- {
 
-     wxRegEx re;
 
-     bool ok = re.Compile(m_pattern, m_flags);
 
-     if (m_correct)
 
-         CPPUNIT_ASSERT_MESSAGE("compile failed", ok);
 
-     else
 
-         CPPUNIT_ASSERT_MESSAGE("compile succeeded (should fail)", !ok);
 
- }
 
- ///////////////////////////////////////////////////////////////////////////////
 
- // Match Test
 
- class RegExMatchTestCase : public TestCase
 
- {
 
- public:
 
-     RegExMatchTestCase(const char *name, const wxString& pattern,
 
-                        const wxString& text, const char *expected,
 
-                        int flags)
 
-     :   TestCase(name),
 
-         m_pattern(pattern),
 
-         m_text(text),
 
-         m_expected(expected),
 
-         m_flags(flags)
 
-     { }
 
- protected:
 
-     void runTest();
 
- private:
 
-     wxString m_pattern;
 
-     wxString m_text;
 
-     const char *m_expected;
 
-     int m_flags;
 
- };
 
- void RegExMatchTestCase::runTest()
 
- {
 
-     int compileFlags = m_flags & ~(wxRE_NOTBOL | wxRE_NOTEOL);
 
-     int matchFlags = m_flags & (wxRE_NOTBOL | wxRE_NOTEOL);
 
-     wxRegEx re(m_pattern, compileFlags);
 
-     CPPUNIT_ASSERT_MESSAGE("compile failed", re.IsValid());
 
-     bool ok = re.Matches(m_text, matchFlags);
 
-     if (m_expected) {
 
-         CPPUNIT_ASSERT_MESSAGE("match failed", ok);
 
-         wxStringTokenizer tkz(wxString(m_expected, *wxConvCurrent),
 
-                               wxT("\t"), wxTOKEN_RET_EMPTY);
 
-         size_t i;
 
-         for (i = 0; i < re.GetMatchCount() && tkz.HasMoreTokens(); i++) {
 
-             wxString expected = tkz.GetNextToken();
 
-             wxString result = re.GetMatch(m_text, i);
 
-             wxString msgstr;
 
-             msgstr.Printf(wxT("\\%d == '%s' (expected '%s')"),
 
-                           (int)i, result.c_str(), expected.c_str());
 
-             CPPUNIT_ASSERT_MESSAGE((const char*)msgstr.mb_str(),
 
-                                    result == expected);
 
-         }
 
-         if ((m_flags & wxRE_NOSUB) == 0)
 
-             CPPUNIT_ASSERT(re.GetMatchCount() == i);
 
-     }
 
-     else {
 
-         CPPUNIT_ASSERT_MESSAGE("match succeeded (should fail)", !ok);
 
-     }
 
- }
 
- ///////////////////////////////////////////////////////////////////////////////
 
- // Replacement Test
 
- class RegExReplaceTestCase : public TestCase
 
- {
 
- public:
 
-     RegExReplaceTestCase(const char *name, const wxString& pattern,
 
-                          const wxString& text, const wxString& repl,
 
-                          const wxString& expected, size_t count, int flags)
 
-     :   TestCase(name),
 
-         m_pattern(pattern),
 
-         m_text(text),
 
-         m_repl(repl),
 
-         m_expected(expected),
 
-         m_count(count),
 
-         m_flags(flags)
 
-     { }
 
- protected:
 
-     void runTest();
 
- private:
 
-     wxString m_pattern;
 
-     wxString m_text;
 
-     wxString m_repl;
 
-     wxString m_expected;
 
-     size_t m_count;
 
-     int m_flags;
 
- };
 
- void RegExReplaceTestCase::runTest()
 
- {
 
-     wxRegEx re(m_pattern, m_flags);
 
-     wxString text(m_text);
 
-     size_t nRepl = re.Replace(&text, m_repl);
 
-     wxString msgstr;
 
-     msgstr.Printf(wxT("returns '%s' (expected '%s')"), text.c_str(), m_expected.c_str());
 
-     CPPUNIT_ASSERT_MESSAGE((const char*)msgstr.mb_str(), text == m_expected);
 
-     msgstr.Printf(wxT("matches %d times (expected %d)"), (int)nRepl, (int)m_count);
 
-     CPPUNIT_ASSERT_MESSAGE((const char*)msgstr.mb_str(), nRepl == m_count);
 
- }
 
- ///////////////////////////////////////////////////////////////////////////////
 
- // The suite
 
- class wxRegExTestSuite : public TestSuite
 
- {
 
- public:
 
-     wxRegExTestSuite() : TestSuite("wxRegExTestSuite") { }
 
-     static Test *suite();
 
- private:
 
-     void add(const char *pattern, bool correct, int flags = wxRE_DEFAULT);
 
-     void add(const char *pattern, const char *text,
 
-              const char *expected = NULL, int flags = wxRE_DEFAULT);
 
-     void add(const char *pattern, const char *text, const char *replacement,
 
-              const char *expected, size_t count, int flags = wxRE_DEFAULT);
 
-     static wxString FlagStr(int flags);
 
-     static wxString Conv(const char *str) { return wxString(str, *wxConvCurrent); }
 
- };
 
- // Build the suite (static)
 
- //
 
- Test *wxRegExTestSuite::suite()
 
- {
 
-     wxRegExTestSuite *suite = new wxRegExTestSuite;
 
-     // Compile tests
 
-     // pattern, expected result
 
-     suite->add("foo", true);
 
-     suite->add("foo(", false);
 
-     suite->add("foo(bar", false);
 
-     suite->add("foo(bar)", true);
 
-     suite->add("foo[", false);
 
-     suite->add("foo[bar", false);
 
-     suite->add("foo[bar]", true);
 
-     suite->add("foo{1", false);
 
-     suite->add("foo{1}", true);
 
-     suite->add("foo{1,2}", true);
 
-     suite->add("foo*", true);
 
-     suite->add("foo+", true);
 
-     suite->add("foo?", true);
 
-     // Match tests
 
-     // pattern, text, expected results (match, followed by submatches
 
-     // tab separated, or NULL for no match expected)
 
-     suite->add("foo", "bar");
 
-     suite->add("foo", "foobar", "foo");
 
-     suite->add("^foo", "foobar", "foo");
 
-     suite->add("^foo", "barfoo");
 
-     suite->add("bar$", "barbar", "bar");
 
-     suite->add("bar$", "barbar ");
 
-     suite->add("OoBa", "FoObAr", "oObA", wxRE_ICASE);
 
-     suite->add("^[A-Z].*$", "AA\nbb\nCC", "AA\nbb\nCC");
 
-     suite->add("^[A-Z].*$", "AA\nbb\nCC", "AA", wxRE_NEWLINE);
 
-     suite->add("^[a-z].*$", "AA\nbb\nCC", "bb", wxRE_NEWLINE);
 
-     suite->add("^[A-Z].*$", "AA\nbb\nCC", "CC", wxRE_NEWLINE | wxRE_NOTBOL);
 
-     suite->add("^[A-Z].*$", "AA\nbb\nCC", NULL, wxRE_NEWLINE | wxRE_NOTBOL | wxRE_NOTEOL);
 
-     suite->add("([[:alpha:]]+) ([[:alpha:]]+) ([[:digit:]]+).* ([[:digit:]]+)$",
 
-         "Fri Jul 13 18:37:52 CEST 2001",
 
-         "Fri Jul 13 18:37:52 CEST 2001\tFri\tJul\t13\t2001");
 
-     // Replace tests
 
-     // pattern, text, replacement, expected result and number of matches
 
-     const char *patn = "([a-z]+)[^0-9]*([0-9]+)";
 
-     suite->add(patn, "foo123", "bar", "bar", 1);
 
-     suite->add(patn, "foo123", "\\2\\1", "123foo", 1);
 
-     suite->add(patn, "foo_123", "\\2\\1", "123foo", 1);
 
-     suite->add(patn, "123foo", "bar", "123foo", 0);
 
-     suite->add(patn, "123foo456foo", "&&", "123foo456foo456foo", 1);
 
-     suite->add(patn, "123foo456foo", "\\0\\0", "123foo456foo456foo", 1);
 
-     suite->add(patn, "foo123foo123", "bar", "barbar", 2);
 
-     suite->add(patn, "foo123_foo456_foo789", "bar", "bar_bar_bar", 3);
 
-     return suite;
 
- }
 
- // Add a compile test
 
- //
 
- void wxRegExTestSuite::add(
 
-     const char *pattern,
 
-     bool correct,
 
-     int flags /*=wxRE_DEFAULT*/)
 
- {
 
-     addTest(new RegExCompileTestCase(
 
-                 (wxT("/") + Conv(pattern) + wxT("/") + FlagStr(flags)).mb_str(),
 
-                 Conv(pattern), correct, flags));
 
- }
 
- // Add a match test
 
- //
 
- void wxRegExTestSuite::add(
 
-     const char *pattern,
 
-     const char *text,
 
-     const char *expected /*=NULL*/,
 
-     int flags /*=wxRE_DEFAULT*/)
 
- {
 
-     wxString name;
 
-     name << wxT("'") << Conv(text) << wxT("' =~ /") << Conv(pattern) << wxT("/")
 
-          << FlagStr(flags);
 
-     name.Replace(wxT("\n"), wxT("\\n"));
 
-     addTest(new RegExMatchTestCase(name.mb_str(), Conv(pattern),
 
-                                    Conv(text), expected, flags));
 
- }
 
- // Add a replace test
 
- //
 
- void wxRegExTestSuite::add(
 
-     const char *pattern,
 
-     const char *text,
 
-     const char *replacement,
 
-     const char *expected,
 
-     size_t count,
 
-     int flags /*=wxRE_DEFAULT*/)
 
- {
 
-     wxString name;
 
-     name << wxT("'") << Conv(text) << wxT("' =~ s/") << Conv(pattern) << wxT("/")
 
-          << Conv(replacement) << wxT("/g") << FlagStr(flags);
 
-     name.Replace(wxT("\n"), wxT("\\n"));
 
-     addTest(new RegExReplaceTestCase(
 
-                     name.mb_str(), Conv(pattern), Conv(text),
 
-                     Conv(replacement), Conv(expected), count, flags));
 
- }
 
- // Display string for the flags
 
- //
 
- wxString wxRegExTestSuite::FlagStr(int flags)
 
- {
 
-     wxString str;
 
-     if (!flags)
 
-         return str;
 
-     for (int i = 0; (unsigned)flags >> i; i++) {
 
-         switch (flags & (1 << i)) {
 
-             case 0: break;
 
- #ifdef wxHAS_REGEX_ADVANCED
 
-             case wxRE_ADVANCED: str += wxT(" | wxRE_ADVANCED"); break;
 
- #endif
 
-             case wxRE_BASIC:    str += wxT(" | wxRE_BASIC"); break;
 
-             case wxRE_ICASE:    str += wxT(" | wxRE_ICASE"); break;
 
-             case wxRE_NOSUB:    str += wxT(" | wxRE_NOSUB"); break;
 
-             case wxRE_NEWLINE:  str += wxT(" | wxRE_NEWLINE"); break;
 
-             case wxRE_NOTBOL:   str += wxT(" | wxRE_NOTBOL"); break;
 
-             case wxRE_NOTEOL:   str += wxT(" | wxRE_NOTEOL"); break;
 
-             default: wxFAIL; break;
 
-         }
 
-     }
 
-     return wxT(" (") + str.Mid(3) + wxT(")");
 
- }
 
- // register in the unnamed registry so that these tests are run by default
 
- CPPUNIT_TEST_SUITE_REGISTRATION(wxRegExTestSuite);
 
- // also include in its own registry so that these tests can be run alone
 
- CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(wxRegExTestSuite, "wxRegExTestSuite");
 
- #endif // wxUSE_REGEX
 
 
  |