/** @file

    $Id$

    $Date$
    $Author$

    @copy &copy; Marc W&auml;ckerlin
    @license LGPL, see file <a href="license.html">COPYING</a>

    $Log$
    Revision 1.2  2004/12/16 13:09:31  marc
    possibility to evaluate and extract sub expressions

    Revision 1.1  2004/12/14 20:20:30  marc
    initial version


*/

#include <mrw/regexp.hpp>
#include <mrw/exception.hpp>

#include <cppunit/TestFixture.h>
#include <cppunit/ui/text/TestRunner.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>

class RegExpTest: public CppUnit::TestFixture { 
public:
  void CheckRegExp() {
    mrw::RegExp findHalloWelt("^Hallo.*Welt$");
    CPPUNIT_ASSERT(findHalloWelt("Hallo Meine Welt"));
    CPPUNIT_ASSERT(!findHalloWelt("xxx"));
    CPPUNIT_ASSERT(!findHalloWelt(""));
    CPPUNIT_ASSERT(!findHalloWelt(" Hallo Welt "));
    CPPUNIT_ASSERT(findHalloWelt("HalloWelt"));
    mrw::RegExp extractTest("^Guten (.*) (Herr|Frau) (.*)$", true);
    CPPUNIT_ASSERT(extractTest("Guten Tag Frau Zuercher"));
    CPPUNIT_ASSERT(extractTest[1]=="Tag" &&
                   extractTest[2]=="Frau" &&
                   extractTest[3]=="Zuercher");
  }
  void ExceptionTest() {
    mrw::RegExp extractTest("^Guten (.*) (Herr|Frau) (.*)$", true);
    CPPUNIT_ASSERT(extractTest("Guten Tag Herr Schweizer"));
    CPPUNIT_ASSERT(extractTest[1]=="Tag" &&
                   extractTest[2]=="Herr" &&
                   extractTest[3]=="Schweizer");
    std::string s = extractTest[4];
  }
  CPPUNIT_TEST_SUITE(RegExpTest);
  CPPUNIT_TEST(CheckRegExp);
  CPPUNIT_TEST_EXCEPTION(ExceptionTest, mrw::invalid_argument);
  CPPUNIT_TEST_SUITE_END();
};
CPPUNIT_TEST_SUITE_REGISTRATION(RegExpTest);

int main() {
  CppUnit::TextUi::TestRunner runner;
  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
  return runner.run() ? 0 : 1;
}
