|
| 1 | +#include <array> |
| 2 | +#include <gtest/gtest-matchers.h> |
| 3 | +#include "example_problem.h" |
| 4 | +#include "utils.h" |
| 5 | + |
| 6 | +namespace { |
| 7 | + |
| 8 | +constexpr long kTime = 1655000000; |
| 9 | + |
| 10 | +struct ScoringParam { |
| 11 | + std::vector<std::string> default_scoring_args; |
| 12 | + std::array<Verdict, 10> verdicts; |
| 13 | +}; |
| 14 | + |
| 15 | +std::string ParamName(const ::testing::TestParamInfo<ScoringParam>& info) { |
| 16 | + std::string ret; |
| 17 | + for (auto& i : info.param.default_scoring_args) ret += i + '_'; |
| 18 | + for (auto& i : ret) { |
| 19 | + if (i == '-') i = '_'; |
| 20 | + } |
| 21 | + if (ret.empty()) { |
| 22 | + ret = "empty"; |
| 23 | + } else { |
| 24 | + ret.pop_back(); |
| 25 | + } |
| 26 | + return ret; |
| 27 | +} |
| 28 | + |
| 29 | +} |
| 30 | + |
| 31 | +class ExampleProblemDefaultScoring : public ExampleProblem, public testing::WithParamInterface<ScoringParam> {}; |
| 32 | +TEST_P(ExampleProblemDefaultScoring, Mode) { |
| 33 | + auto& param = GetParam(); |
| 34 | + SetUp(2, { |
| 35 | + {"123\n234\n", "123\n234\n"}, // match: AC for all |
| 36 | + {"123\n234", "123 \n234 \n\n"}, // trailing whitespaces / blank lines: AC except strict |
| 37 | + {" 123 234\n", "123 234\n"}, // preceding whitespaces: AC for white-diff/float-diff |
| 38 | + {"123 234\n", "123 234\n"}, // additional whitespaces: AC for white-diff/float-diff |
| 39 | + {" 1.0000001 1.0000001 ", "1.0 1.0\n"}, // AC for float-diff >1e-7 |
| 40 | + {" 1.0000001 1.0000001 \n a 1.0000001 -1", "1.0 1.0\na 1.0 -1\n"}, // AC for float-diff >1e-7 |
| 41 | + {" 1.00001 1.00001 ", "1.0 1.0\n"}, // AC for float-diff >1e-5 |
| 42 | + {" 100.00001 100.00001 ", "100.0 100.0\n"}, // AC for float-diff (absolute>1e-5) (absolute-relative/relative>1e-7) |
| 43 | + {" 100.00001 0.0100001\n", "100.0 0.01\n"}, // AC for float-diff (absolute-relative>1e-7) (absolute/relative>1e-5) |
| 44 | + {"1.0000001 1.0000001\n", "1.0 1\n"}, // unmatched on non-float: WA for all |
| 45 | + }, 2); |
| 46 | + AssertVerdictReporter reporter(Verdict::WA, true, false); |
| 47 | + sub.reporter = reporter.GetReporter(); |
| 48 | + auto orig_score = sub.reporter.ReportScoringResult; |
| 49 | + sub.reporter.ReportScoringResult = [&](const Submission& sub, const SubmissionResult& res, int subtask, int stage) { |
| 50 | + orig_score(sub, res, subtask, stage); |
| 51 | + ASSERT_EQ(res.td_results[subtask].verdict, param.verdicts[subtask]) << "Subtask " << subtask; |
| 52 | + }; |
| 53 | + sub.default_scoring_args = param.default_scoring_args; |
| 54 | + long id = SetupSubmission(sub, 5, Compiler::GCC_CPP_17, kTime, true, R"(#include <unistd.h> |
| 55 | +char buf[256]; |
| 56 | +int main(){ write(1, buf, read(0, buf, 256)); })", SpecjudgeType::NORMAL); |
| 57 | + RunAndTeardownSubmission(id); |
| 58 | +} |
| 59 | + |
| 60 | +constexpr Verdict AC = Verdict::AC; |
| 61 | +constexpr Verdict WA = Verdict::WA; |
| 62 | + |
| 63 | +INSTANTIATE_TEST_SUITE_P(OneSubmission, ExampleProblemDefaultScoring, |
| 64 | + testing::Values( |
| 65 | + (ScoringParam){{"strict"}, |
| 66 | + {{AC, WA, WA, WA, WA, WA, WA, WA, WA, WA}}}, |
| 67 | + (ScoringParam){{"line"}, |
| 68 | + {{AC, AC, WA, WA, WA, WA, WA, WA, WA, WA}}}, |
| 69 | + (ScoringParam){{}, |
| 70 | + {{AC, AC, WA, WA, WA, WA, WA, WA, WA, WA}}}, |
| 71 | + (ScoringParam){{"white-diff"}, |
| 72 | + {{AC, AC, AC, AC, WA, WA, WA, WA, WA, WA}}}, |
| 73 | + (ScoringParam){{"float-diff", "absolute-relative", "1e-9"}, |
| 74 | + {{AC, AC, AC, AC, WA, WA, WA, WA, WA, WA}}}, |
| 75 | + (ScoringParam){{"float-diff", "absolute", "1e-6"}, |
| 76 | + {{AC, AC, AC, AC, AC, AC, WA, WA, WA, WA}}}, |
| 77 | + (ScoringParam){{"float-diff", "absolute"}, |
| 78 | + {{AC, AC, AC, AC, AC, AC, WA, WA, WA, WA}}}, |
| 79 | + (ScoringParam){{"float-diff", "relative"}, |
| 80 | + {{AC, AC, AC, AC, AC, AC, WA, AC, WA, WA}}}, |
| 81 | + (ScoringParam){{"float-diff", "absolute-relative"}, |
| 82 | + {{AC, AC, AC, AC, AC, AC, WA, AC, AC, WA}}}, |
| 83 | + (ScoringParam){{"float-diff"}, |
| 84 | + {{AC, AC, AC, AC, AC, AC, WA, AC, AC, WA}}}, |
| 85 | + (ScoringParam){{"float-diff", "relative", "1e-4"}, |
| 86 | + {{AC, AC, AC, AC, AC, AC, AC, AC, AC, WA}}} |
| 87 | + ), |
| 88 | + ParamName); |
0 commit comments