В UnitTest ++ framework , в модуле Checks.cpp есть 4 перегруженные версии CheckEqual.Каждая перегрузка принимает различное постоянство для ожидаемого или фактического.Затем все четыре просто вызывают CheckStringsEqual (), который принимает char const * как для ожидаемого, так и для фактического.Я могу удалить перегрузки, и все прекрасно скомпилируется, но модульные тесты завершаются неудачно, когда передается что-либо, кроме двух константных строк, когда строки объявляются с использованием синтаксиса массива, т.е.
char txt1[]="Hello";
Разъяснение Оригинальный UnitTest ++код демонстрирует это поведение, а не только мою реализацию.Кроме того, тот факт, что тесты не выполняются при снятии перегрузок, приводит меня в тупик.
Четыре перегрузки:
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 равен
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());
}
}
НаконецВот тесты, в которых некоторые из них терпят неудачу, если вы закомментируете все, кроме первого CheckEqual
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());
}