In der UnitTest++ Rahmenwerk In dem Modul Checks.cpp gibt es 4 überladene Versionen von CheckEqual. Jede Überladung nimmt eine andere Konstante für expected oder actual. Dann rufen alle vier einfach CheckStringsEqual() auf, das char const* sowohl für expected als auch actual nimmt. Ich kann die Überladungen entfernen und alles lässt sich gut kompilieren, aber die Unit-Tests schlagen fehl, wenn etwas anderes als zwei const-Strings übergeben werden, wenn die Strings mit Array-Syntax deklariert werden, d.h.
char txt1[]="Hello";
Klärung Der ursprüngliche UnitTest++-Code weist dieses Verhalten auf, nicht nur meine Implementierung davon. Auch ist es die Tatsache, dass die Tests fehlschlagen, wenn die Überladungen entfernt werden, die mich stymied hat.
Die vier Überlastungen sind:
void CheckEqual(TestResults& results,
char const* expected,
char const* actual,
TestDetails const& details,
std::string const& msg) //msg defaults to ="" in .h
{
CheckStringsEqual(results, expected, actual, details, msg);
}
void CheckEqual(TestResults& results,
char* expected,
char* actual,
TestDetails const& details)
{
CheckStringsEqual(results, expected, actual, details);
}
void CheckEqual(TestResults& results,
char* expected,
char const* actual,
TestDetails const& details)
{
CheckStringsEqual(results, expected, actual, details);
}
void CheckEqual(TestResults& results,
char const* expected,
char* actual,
TestDetails const& details)
{
CheckStringsEqual(results, expected, actual, details);
}
CheckStringsEqual ist
void CheckStringsEqual(TestResults& results,
char const* expected,
char const* actual,
TestDetails const& details, std::string const& msg="")
{
using namespace std;
if (strcmp(expected, actual))
{
UnitTest::MemoryOutStream stream;
stream << msg;
stream << " Expected " << expected << " but was " << actual;
results.OnTestFailure(details, stream.GetText());
}
}
Schließlich sind hier die Tests, von denen einige fehlschlagen, wenn Sie alle bis auf den ersten CheckEqual auskommentieren
char txt1[] = "Hello"; // non-const on purpose so no folding of duplicate data
char txt2[] = "Hello";
TEST(CheckEqualsWithStringsWorksOnContentsNonConstNonConst)
{
char const* const p1 = txt1;
char const* const p2 = txt2;
TestResults results;
CheckEqual(results, p1, p2, TestDetails("", "", "", 0));
CHECK_EQUAL(0, results.GetFailureCount());
}
TEST(CheckEqualsWithStringsWorksOnContentsConstConst)
{
char* const p1 = txt1;
char* const p2 = txt2;
TestResults results;
CheckEqual(results, p1, p2, TestDetails("", "", "", 0));
CHECK_EQUAL(0, results.GetFailureCount());
}
TEST(CheckEqualsWithStringsWorksOnContentsNonConstConst)
{
char* const p1 = txt1;
char const* const p2 = txt2;
TestResults results;
CheckEqual(results, p1, p2, TestDetails("", "", "", 0));
CHECK_EQUAL(0, results.GetFailureCount());
}
TEST(CheckEqualsWithStringsWorksOnContentsConstNonConst)
{
char const* const p1 = txt1;
char* const p2 = txt2;
TestResults results;
CheckEqual(results, p1, p2, TestDetails("", "", "", 0));
CHECK_EQUAL(0, results.GetFailureCount());
}