GCC Code Coverage Report


Directory: ./
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 91.2% 31 / 0 / 34
Functions: 100.0% 4 / 0 / 4
Branches: 55.6% 40 / 0 / 72

test/cpv_local/game/mahjong_parser.cpp
Line Branch Exec Source
1 // competitive-verifier: STANDALONE
2
3 #include "../../../src/game/mahjong/parser/lib.hpp"
4 #include "../base.hpp"
5
6 using namespace tifa_libs;
7 using namespace tifa_libs::literals;
8
9 vecp<u32, vec<mahjong_card>> mahjong_hand_data{
10 {5, {1_mjs, 2_mjs, 5_mjs, 6_mjs, 8_mjs, 9_mjs, 1_mjm, 2_mjm, 5_mjm, 6_mjm, 8_mjm, 9_mjm, 1_mjp, 2_mjp}},
11 {4, {1_mjs, 1_mjs, 4_mjs, 4_mjs, 7_mjs, 7_mjs, 1_mjm, 1_mjm, 4_mjm, 4_mjm, 7_mjm, 7_mjm, 1_mjp, 1_mjp}},
12 {3, {1_mjs, 1_mjs, 1_mjs, 1_mjs, 4_mjs, 4_mjs, 7_mjs, 7_mjs, 1_mjm, 1_mjm, 4_mjm, 4_mjm, 7_mjm, 7_mjm}},
13 {2, {1_mjs, 1_mjs, 1_mjs, 1_mjs, 2_mjs, 2_mjs, 2_mjs, 2_mjs, 1_mjm, 1_mjm, 4_mjm, 4_mjm, 7_mjm, 7_mjm}},
14 {1, {1_mjs, 1_mjs, 1_mjs, 1_mjs, 2_mjs, 2_mjs, 2_mjs, 2_mjs, 1_mjm, 1_mjm, 1_mjm, 1_mjm, 4_mjm, 4_mjm}},
15 {2, {1_mjs, 1_mjs, 1_mjs, 1_mjs, 2_mjs, 2_mjs, 2_mjs, 2_mjs, 1_mjm, 1_mjm, 1_mjm, 1_mjm, 4_mjm, 5_mjm}},
16 {3, {1_mjs, 1_mjs, 1_mjs, 1_mjs, 4_mjs, 4_mjs, 4_mjs, 4_mjs, 1_mjm, 1_mjm, 1_mjm, 1_mjm, 4_mjm, 5_mjm}},
17 {4, {1_mjs, 1_mjs, 1_mjs, 1_mjs, 4_mjs, 5_mjs, 8_mjs, 9_mjs, 1_mjm, 2_mjm, 5_mjm, 6_mjm, 8_mjm, 9_mjm}},
18 {3, {1_mjs, 1_mjs, 1_mjs, 1_mjs, 4_mjs, 4_mjs, 4_mjs, 4_mjs, 1_mjm, 2_mjm, 5_mjm, 6_mjm, 8_mjm, 9_mjm}},
19 {3, {1_mjs, 1_mjs, 1_mjs, 1_mjs, 2_mjs, 2_mjs, 2_mjs, 2_mjs, 1_mjm, 2_mjm, 5_mjm, 6_mjm, 8_mjm, 9_mjm}},
20 {5, {1_mjs, 1_mjs, 1_mjs, 1_mjs, 4_mjs, 4_mjs, 4_mjs, 4_mjs, 1_mjm, 4_mjm, 7_mjm, 1_mjp, 4_mjp, 7_mjp}},
21 {3, {1_mjz, 1_mjz, 1_mjz, 1_mjz, 2_mjz, 2_mjz, 2_mjz, 2_mjz, 3_mjz, 3_mjz, 3_mjz, 3_mjz, 4_mjz, 4_mjz}},
22 {3, {1_mjz, 1_mjz, 1_mjz, 1_mjz, 2_mjz, 2_mjz, 2_mjz, 2_mjz, 3_mjz, 3_mjz, 3_mjz, 3_mjz, 4_mjz, 7_mjz}},
23 {2, {1_mjm, 1_mjm, 1_mjm, 1_mjm, 1_mjz, 1_mjz, 1_mjz, 1_mjz, 2_mjz, 2_mjz, 2_mjz, 2_mjz, 3_mjz, 3_mjz}},
24 {3, {1_mjm, 1_mjm, 1_mjm, 1_mjm, 1_mjz, 1_mjz, 1_mjz, 1_mjz, 2_mjz, 2_mjz, 2_mjz, 2_mjz, 3_mjz, 4_mjz}},
25 {1, {1_mjs, 1_mjs, 1_mjs, 2_mjs, 2_mjs, 2_mjs, 3_mjs, 3_mjs, 3_mjs, 4_mjs, 4_mjs, 4_mjs, 1_mjz, 2_mjz}},
26 {1, {1_mjs, 1_mjs, 1_mjs, 2_mjs, 2_mjs, 2_mjs, 3_mjs, 3_mjs, 3_mjs, 4_mjs, 4_mjs, 4_mjs, 1_mjp, 2_mjp}},
27 {0, {1_mjs, 1_mjs, 1_mjs, 2_mjs, 2_mjs, 2_mjs, 3_mjs, 3_mjs, 3_mjs, 4_mjs, 4_mjs, 4_mjs, 1_mjp, 1_mjp}},
28 {9, {2_mjm, 5_mjm, 8_mjm, 2_mjp, 5_mjp, 8_mjp, 2_mjs, 5_mjs, 8_mjs, 1_mjz, 2_mjz, 3_mjz, 4_mjz, 7_mjz}},
29 };
30
31 19 void test(u32 n) {
32
1/2
✓ Branch 2 taken 19 times.
✗ Branch 3 not taken.
19 auto [step, hand] = mahjong_hand_data[n];
33
34
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
19 auto parsed = mahjong_parser<14>(hand);
35
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
140 bool win = any_of(parsed, [](auto CR hand) { return hand.win(); });
36
37 250 auto f = [](auto& v) {
38 250 vec<strn> ans;
39
2/2
✓ Branch 7 taken 859 times.
✓ Branch 8 taken 250 times.
1109 for (auto [melds, c] : v) {
40 859 auto card = mahjong_card::decode(c);
41 859 strn meld_str;
42
9/12
✓ Branch 0 taken 46 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 74 times.
✓ Branch 3 taken 26 times.
✓ Branch 4 taken 228 times.
✓ Branch 5 taken 161 times.
✓ Branch 6 taken 46 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 78 times.
✓ Branch 9 taken 182 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
859 switch (melds) {
43
1/2
✓ Branch 1 taken 46 times.
✗ Branch 2 not taken.
46 case MELDS_MJ::mian: meld_str = "mian"; break;
44
1/2
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
18 case MELDS_MJ::bianl: meld_str = "bianl"; break;
45
1/2
✓ Branch 1 taken 74 times.
✗ Branch 2 not taken.
74 case MELDS_MJ::bianr: meld_str = "bianr"; break;
46
1/2
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
26 case MELDS_MJ::kan: meld_str = "kan"; break;
47
1/2
✓ Branch 1 taken 228 times.
✗ Branch 2 not taken.
228 case MELDS_MJ::orphan: meld_str = "orphan"; break;
48
1/2
✓ Branch 1 taken 161 times.
✗ Branch 2 not taken.
161 case MELDS_MJ::pair: meld_str = "pair"; break;
49
1/2
✓ Branch 1 taken 46 times.
✗ Branch 2 not taken.
46 case MELDS_MJ::pair0: meld_str = "pair0"; break;
50 case MELDS_MJ::bonus: meld_str = "bonus"; break;
51
1/2
✓ Branch 1 taken 78 times.
✗ Branch 2 not taken.
78 case MELDS_MJ::chow: meld_str = "chow"; break;
52
1/2
✓ Branch 1 taken 182 times.
✗ Branch 2 not taken.
182 case MELDS_MJ::pung: meld_str = "pung"; break;
53 case MELDS_MJ::kong: meld_str = "kong"; break;
54 }
55
2/4
✓ Branch 1 taken 859 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 859 times.
✗ Branch 5 not taken.
859 ans.push_back(std::format("({}:{}{})", meld_str, card.rank, card.suit));
56 }
57 250 return ans;
58 };
59 19 vvec<strn> prepared, waiting;
60
2/2
✓ Branch 4 taken 125 times.
✓ Branch 5 taken 19 times.
144 for (auto CR hand : parsed) {
61
2/4
✓ Branch 1 taken 125 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 125 times.
✗ Branch 5 not taken.
125 prepared.push_back(f(hand.prepared));
62
2/4
✓ Branch 1 taken 125 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 125 times.
✗ Branch 5 not taken.
125 waiting.push_back(f(hand.waiting));
63 }
64
65
4/8
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 19 times.
✗ Branch 8 not taken.
✓ Branch 13 taken 19 times.
✗ Branch 14 not taken.
19 check(win, !step, check_param(n), check_param(prepared), check_param(waiting));
66 19 }
67
68 1 int main() {
69
2/2
✓ Branch 0 taken 19 times.
✓ Branch 1 taken 1 time.
20 for (u32 i = 0; i <= 18; ++i) {
70
3/6
✓ Branch 4 taken 19 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 19 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 19 times.
✗ Branch 11 not taken.
19 timer_(test(i));
71 }
72 1 }
73