2 Stimmen

UnitTest++ Warum werden CheckEqual()-Überladungen benötigt, die nicht const char* annehmen

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());
}

1voto

Die erste CheckEqual Funktion nimmt einen zusätzlichen Parameter und hat keinen Standardwert. Ich sehe, dass Ihr Code die Funktion ohne diesen Parameter aufruft std::string Parameter. Daher würde ich erwarten, dass der Compiler sagt, dass er keine aufzurufende Funktion findet.

Bei der gleichen Anzahl von Parametern bin ich mir nicht sicher, warum sie const auf diese Weise überlastet. Sie können jederzeit eine Nicht const variabel const , und wenn Sie es nicht ändern, sollten Sie dies tun ( CheckStringsEqual ändert sich nicht).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X