_STRING
text_test_interpreter::successes(const test_result& result) const
{
    _STRING Result("Successes: ");
    _APPEND(Result, _yak_itoa(result.success_count()));
    _APPEND(Result, "\n");
    return Result;
}
void UnitTest_XMLWriter::element(_STRING name, _STRING value)
{
    start(name);
    _APPEND(document, ">");
    tagOpen = false;
    _APPEND(document, escape(value));
    close();
}
//the header for the report
_STRING
text_test_interpreter::header(const test_result& result) const
{
    _STRING Result("\nTest output begins\nNumber of tests: ");
    _APPEND(Result, _yak_itoa(result.total_test_count()));
    _APPEND(Result, "\n");
    return Result;

}
_STRING
text_test_interpreter::errors(const test_result& result) const
{
    _STRING Result("Errors: ");
    _APPEND(Result, _yak_itoa(result.errors().size()));
    _APPEND(Result, "\n");
    _APPEND(Result, problem_vector_string(result.errors()));
    _APPEND(Result, "\n");
    return Result;
}
void UnitTest_XMLWriter::close()
{
    if (tagOpen)
    {
        _APPEND(document, " />");
    }
    else
    {
        _APPEND(document, "</");
        _APPEND(document, openTags.back());
        _APPEND(document, ">");
    }
    tagOpen = false;
    openTags.pop_back();
}
unsigned UnitTest_XMLWriter::start(_STRING name)
{
    if (tagOpen)
    {
        _APPEND(document, ">");
    }
    openTags.push_back(name);
    tagOpen = true;
    _APPEND(document, "<");
    _APPEND(document, name);
    // Add attributes
    while (!attributes.empty())
    {
        _APPEND(document, " ");
        _APPEND(document, attributes.back());
        attributes.pop_back();
        _APPEND(document, "=\"");
        _APPEND(document, attributes.back());
        attributes.pop_back();
        _APPEND(document, "\"");
    }
    return openTags.size() - 1;
}