Home =>  Articles =>  Test First Challenge: Getting Started

Test First Challenge: Getting Started
Charlie Poole
January, 2002

Bill Wake created the Test-first Challenge as a way for people to practice test-first. He provided a set of tests that drive the development of a simple spreadsheet application. A number of people who frequent the extreme programming list wrote code in response to Bill's tests, including me.

I'm using C++, so first off I had to spend some time initially getting CppUnit to work correctly on my system. It's a bit annoying how the assertEquals requires two objects of the same type. At least in VC 6.0, you can't use string constants to the comparison with string objects. I think it's because assertEquals is a template, and VC is not doing the matching 100% correctly. For now, I'm not trying to fix it, so I have to use String("Some string") in various places.

Even though I know Bill regrets using only one cell for all the tests, I didn't deal with it in part 1. My initial version for part 1 looks pretty much like everyone else's.


class Sheet
{
public:
    Sheet();
    virtual ~Sheet();
	
    String get( const String& cellName ); 
    String getLiteral( const String& cellName );
	
    void put( const String& cellName, const String& cellValue );
private:
    String m_content;
};

String Sheet::get( const String & )
{
    if ( m_content.isNumeric() )
        return m_content.trim();
    else
        return m_content;
}

String Sheet::getLiteral( const String& cellName )
{
    return m_content
}

void Sheet::put( const String & cellName, const String& cellValue )
{
    m_content = cellValue;
}

The isNumeric and trim functions were originally part of Sheet with slightly different names. All the functions used std::string directly. After all the tests passed, I decided to refactor by deriving a String class from std::string and making isNumeric and trim members. I confess that I didn't write tests for the String class but I think the existing tests cover it well enough.

Things get a bit more interesting in Part2.