UnitTest++ Зачем нужны перегрузки CheckEqual(), которые принимают неконстантный char*

В фреймворке UnitTest++ в модуле Checks.cpp есть 4 перегруженные версии CheckEqual. Каждая перегрузка принимает различную константу для ожидаемой или фактической. Затем все четыре просто вызывают CheckStringsEqual(), который принимает char const* как для ожидаемого, так и для фактического значения. Я могу удалить перегрузки, и все компилируется нормально, но модульные тесты терпят неудачу при передаче чего-либо, кроме двух строк 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());
}

person Tod    schedule 28.03.2011    source источник


Ответы (1)


Первая функция CheckEqual принимает дополнительный параметр и не имеет значения по умолчанию. Я вижу, что ваш код вызывает его без этого параметра std::string. Поэтому я ожидаю, что компилятор скажет, что не может найти функцию для вызова.

С таким же количеством параметров я не уверен, почему они будут const перегружены таким образом. Вы всегда можете сделать не-const переменную const, и если вы ее не меняете, вы должны сделать это (CheckStringsEqual ее не меняет).

person Community    schedule 29.03.2011
comment
Извини, я забыл, что возился с тем первым звонком. В файле .h этот последний параметр по умолчанию имеет значение =. Ради этого обсуждения мы можем игнорировать этот параметр, так как исходный код UnitTest++ не имел его. Я также должен уточнить, почему я спрашиваю, почему код UnitTest++ должен это делать (т. Е. Даже если я изменил некоторые вещи, исходный код демонстрирует описанное поведение). - person Tod; 30.03.2011