/** * Checker to compare output and answer in the form: * * Case 1: ... * Case 2: ... * ... * Case n: ... * */ #include "testlib.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define forn(i, n) for (int i = 0; i < int(n); i++) string token; vector readStreamCase(InStream& in, TResult pe, int testCase, bool& prereadCase) { if (!prereadCase) { string caseStr = in.readToken(); if (caseStr != "Case") quitf(pe, "Expected 'Case' but found '%s' [test case %d]", compress(caseStr).c_str(), testCase); } string numExpStr; stringstream ss; ss << testCase; ss >> numExpStr; numExpStr += ":"; string numStr = in.readToken(); if (numExpStr != numStr) quitf(pe, "Expected '%s' but found '%s' [test case %d]", compress(numExpStr).c_str(), compress(numStr).c_str(), testCase); vector result; while (!in.seekEof()) { in.readTokenTo(token); if (token == "Case") { prereadCase = true; break; } result.push_back(token); } return result; } string stringsToString(const vector& a) { if (a.empty()) return "\"\" [size=0]"; string elems; forn(i, a.size()) elems += a[i] + " "; return format("\"%s\" [size=%u]", compress(trim(elems)).c_str(), (unsigned int)(a.size())); } int main(int argc, char* argv[]) { setName("Tokens checker with testcase-support"); registerTestlibCmd(argc, argv); int testCase = 0; bool ansPrereadCase = false; bool oufPrereadCase = false; while (!ans.seekEof()) { testCase++; vector ja = readStreamCase(ans, _fail, testCase, ansPrereadCase); vector pa = readStreamCase(ouf, _pe, testCase, oufPrereadCase); if (ja != pa) { string js = stringsToString(ja); string ps = stringsToString(pa); quitf(_wa, "Sequences differ: jury has %s, but participant has %s [test case %d]", js.c_str(), ps.c_str(), testCase); } } quitf(_ok, "%d test cases(s)", testCase); }