#include "data.h" #include "test.h" #include "pl.h" #include "util.h" #include "win.h" Test::Test(const char* name_) : name(name_) {} #define CAT(a, b) a##b #define APPLY(a, ...) a(__VA_ARGS__) #define TESTS struct APPLY(CAT, tests_, __COUNTER__) #define TEST(id) }; struct id : public Test { id() : Test(#id) #define FAIL(...) do { Sprintf(error, __VA_ARGS__); return; } while (0) TESTS { TEST(StrcpyWithSmallerDestination) { char src[15], dst[10]; Sprintf(src, "abcdefghijklmn"); Strcpy(dst, src); if (dst[8] != 'i') FAIL("dst[8] is not 'i', but '%c'", dst[8]); if (dst[9] != 0) FAIL("dst is not NUL-terminated"); } TEST(EpisodeDataFromWeb) { ElvDataA e; DlvDataA d; FromWeb(10, e, d); if (wcscmp(e.title, L"Pro Soccer Player Blackmail Case") != 0) FAIL("title is not correct"); if (wcscmp(d.date, L"March 11, 1996") != 0) FAIL("date is not correct"); } TEST(EpisodeDataFromProlog) { ElvDataA e; DlvDataA d; FromProlog(10, e); FromProlog(10, d); if (wcscmp(e.title, L"Pro Soccer Player Blackmail Case") != 0) FAIL("title is not correct"); if (wcscmp(d.date, L"March 11, 1996") != 0) FAIL("date is not correct"); } TEST(IO) { ElvDataA e1_0, e2_0; FromProlog(6, e1_0); FromProlog(10, e2_0); { FileView fv{L"tmp.dat", sizeof(ElvDataA)*2}; Write(fv, e1_0); Write(reinterpret_cast(static_cast(fv)+1), e2_0); } { FileView fv{L"tmp.dat", sizeof(ElvDataA)}; ElvDataA* e1 = Read(fv); if (e1_0.rating != e1->rating) FAIL("rating is different (%d/%d)", e1_0.rating, e1->rating); if (e1_0.bWatched != e1->bWatched) FAIL("bWatched is different"); if (e1_0.bTVOriginal != e1->bTVOriginal) FAIL("bTVOriginal is different"); if (wcscmp(e1_0.sRating, e1->sRating) != 0) FAIL("sRating is different"); if (wcscmp(e1_0.siEp, e1->siEp) != 0) FAIL("siEp is different"); if (wcscmp(e1_0.title, e1->title) != 0) FAIL("title is different"); } { FileView fv{L"tmp.dat", sizeof(ElvDataA)*2}; ElvDataA* e2 = Read(reinterpret_cast(static_cast(fv)+1)); if (e2_0.rating != e2->rating) FAIL("rating is different (%d/%d)", e2_0.rating, e2->rating); if (e2_0.bWatched != e2->bWatched) FAIL("bWatched is different"); if (e2_0.bTVOriginal != e2->bTVOriginal) FAIL("bTVOriginal is different"); if (wcscmp(e2_0.sRating, e2->sRating) != 0) FAIL("sRating is different"); if (wcscmp(e2_0.siEp, e2->siEp) != 0) FAIL("siEp is different"); if (wcscmp(e2_0.title, e2->title) != 0) FAIL("title is different"); } //DeleteFile(L"tmp.dat"); } TEST(MigrateElvDataFromPrologToDisk) { int cEp; if (!Pl("episode_data","episode_count",&cEp)) return; { FileView fv{L"tmp.dat", sizeof(ElvDataA)*8192}; unsigned char* p = fv; for (int iEp = 1; iEp <= cEp; iEp++) { ElvDataA e; FromProlog(iEp, e); Write(p, e); p += sizeof(e); } } { FileView fv{L"tmp.dat", sizeof(ElvDataA)*8192}; ElvDataA* ve = reinterpret_cast(fv.view); ElvDataA& e = ve[9]; if (wcscmp(e.title, L"Pro Soccer Player Blackmail Case") != 0) FAIL("title is not correct"); } //DeleteFile(L"tmp.dat"); } }; int RunTests() { const Test tests[] = { StrcpyWithSmallerDestination{}, //EpisodeDataFromWeb{}, EpisodeDataFromProlog{}, IO{}, MigrateElvDataFromPrologToDisk{}, }; printf("Results (%llu tests):\n", sizeof(tests)/sizeof(*tests)); int cFailed = 0; for (const Test& t : tests) { const char* msg; if (t.error[0]) { msg = t.error; cFailed++; } else msg = const_cast("SUCCESS"); printf("%s: %s\n", t.name, msg); } printf("%d tests failed.\n", cFailed); return cFailed; }