Recursive Descent Parser Test
RecentChanges Edit Search GoodStyle
Referenced By: RecursiveDescentParser, RecursiveDescentParserCpp, RecursiveDescentParserHpp

I wrote a parser to solve math expressions like "3.0 ^(4 - 5)", or "3 / 8". Below my sig is test.h, the file containing a tiny test framework - smaller than NanoCppUnit. Using it and TestDrivenDevelopment?, I produced the test suite and the parser, appearing in RecursiveDescentParserCpp and RecursiveDescentParserHpp.

--PhlIp

// a NanoCppUnit in one header...

#ifndef TEST_

#   include <list>
#   include <iostream>
#   include <sstream>
#   define WIN32_LEAN_AND_MEAN
#   include <windows.h>
#   include <math.h>

    using std::cout;
    using std::endl;
    using std::stringstream;

    class
TestCase
{
  public:
    typedef std::list<TestCase *> TestCases_t;
    TestCases_t static cases;  //  TODO  make me private

    TestCase()  {  cases.push_back(this);  }
    virtual void setUp() {}
    virtual void runCase() = 0;
    virtual void tearDown() {}
    static bool runTests();

  protected:
    static bool all_tests_passed;
};

    bool
TestCase::runTests()
{
    TestCase::TestCases_t::iterator it(TestCase::cases.begin());

    for ( ;  it != TestCase::cases.end();  ++it )
        {
        TestCase & aCase = **it;
        aCase.setUp();
        aCase.runCase();
        aCase.tearDown();
        }
    return TestCase::all_tests_passed;
}

#define TEST_(suite, target)             \
    struct suite##target:  virtual suite \
    { void runCase(); }     \
    a##suite##target;                    \
    void suite##target::runCase()

#define CPPUNIT_ASSERT_EQUAL(sample, result)          \
    if ((sample) != (result))  {  stringstream out;   \
        out << __FILE__ << "(" << __LINE__ << ") : "; \
        out << #sample << "(" << (sample) << ") != "; \
        out << #result << "(" << (result) << ")";     \
        cout << out.str() << endl;                    \
        OutputDebugStringA(out.str().c_str());        \
        OutputDebugStringA("\n");                     \
        all_tests_passed = false;                     \
        __asm { int 3 }  }

bool tolerance(double Subject, double Reference)
{
    return fabs(Subject - Reference) < (0.001 + fabs(Subject)) / 100;
}

#define CPPUNIT_ASSERT_CLOSE(sample, result)          \
    if (!tolerance(sample, result))  {  stringstream out;   \
        out << __FILE__ << "(" << __LINE__ << ") : "; \
        out << #sample << "(" << (sample) << ") != "; \
        out << #result << "(" << (result) << ")";     \
        cout << out.str() << endl;                    \
        OutputDebugStringA(out.str().c_str());        \
        OutputDebugStringA("\n");                     \
        all_tests_passed = false;                     \
        __asm { int 3 }  }

#endif