GCC Code Coverage Report


Directory: ./
File: src/util/tsort.test.cc
Date: 2025-09-01 06:19:01
Exec Total Coverage
Lines: 55 55 100.0%
Functions: 12 12 100.0%
Branches: 72 91 79.1%

Line Branch Exec Source
1 #include "na64util/tsort.hh"
2
3 #include <gtest/gtest.h>
4
5 namespace na64dp {
6
7 8 TEST(TopologicalSort, resolvesTrivialCase) {
8 2 util::DAG<char> g;
9
1/1
✓ Branch 1 taken 1 times.
2 g.add('A', 'B');
10
1/1
✓ Branch 1 taken 1 times.
2 auto r = g.sorted();
11
3/5
✓ Branch 2 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
2 ASSERT_EQ(r.size(), 2);
12
2/3
✓ Branch 2 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
2 EXPECT_EQ(r[0], 'A');
13
2/3
✓ Branch 2 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
2 EXPECT_EQ(r[1], 'B');
14 2 }
15
16 8 TEST(TopologicalSort, resolvesDiamondCase) {
17 2 util::DAG<char> g;
18
1/1
✓ Branch 1 taken 1 times.
2 g.add('A', 'B');
19
1/1
✓ Branch 1 taken 1 times.
2 g.add('A', 'C');
20
1/1
✓ Branch 1 taken 1 times.
2 g.add('B', 'D');
21
1/1
✓ Branch 1 taken 1 times.
2 g.add('C', 'D');
22
1/1
✓ Branch 1 taken 1 times.
2 auto r = g.sorted();
23
24 #if 0
25 std::cout << " result:";
26 for( auto c : r ) {
27 std::cout << " " << c;
28 }
29 std::cout << std::endl;
30 #endif
31
32
3/5
✓ Branch 2 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
2 ASSERT_EQ(r.size(), 4);
33
2/3
✓ Branch 2 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
2 EXPECT_EQ(r[0], 'A');
34 #if 0
35 EXPECT_THAT((std::array{ 'B', 'C' }), Contains(r[1]));
36 EXPECT_THAT((std::array{ 'B', 'C' }), Contains(r[2]));
37 #else // ^^^ TODO: for gtest >=1.10
38
3/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 8 not taken.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
2 EXPECT_TRUE( (('B' == r[1] && 'C' == r[2]))
39 || (('C' == r[1] && 'B' == r[2]))
40 2 );
41 #endif
42
2/3
✓ Branch 2 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
2 EXPECT_EQ(r[3], 'D');
43 2 }
44
45 8 TEST(TopologicalSort, resolvesComplexCase) {
46 2 util::DAG<char> g;
47 // TODO: messed with "product" and "dependency" -- must be vice-versa
48 struct {
49 char product;
50 char deps[4];
51 2 } deps[] = {
52 {'Q', "I",},
53 {'R', "I",},
54 {'S', "IJK",},
55 {'T', "L",},
56 {'U', "TN",},
57 {'V', "NG",},
58 {'H', "D",},
59 {'I', "D",},
60 {'J', "DE",},
61 {'K', "E",},
62 {'L', "E",},
63 {'M', "EF",},
64 {'N', "F",},
65 {'O', "FG",},
66 {'P', "G",},
67 {'D', "B",},
68 {'E', "B",},
69 {'F', "BC",},
70 {'G', "C",},
71 {'B', "A",},
72 {'C', "A",},
73 {'\0', ""},
74 };
75
76 2 std::map<char, std::string> chck;
77
2/2
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 1 times.
44 for(auto c = deps; '\0' != c->product; ++c) {
78
2/2
✓ Branch 0 taken 29 times.
✓ Branch 1 taken 21 times.
100 for( auto cc = c->deps; '\0' != *cc; ++cc ) {
79
1/1
✓ Branch 1 taken 29 times.
58 g.add(*cc, c->product);
80 }
81
2/2
✓ Branch 1 taken 21 times.
✓ Branch 4 taken 21 times.
42 chck[c->product] = c->deps;
82 }
83
84
1/1
✓ Branch 1 taken 1 times.
2 auto r = g.sorted();
85
2/4
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
2 ASSERT_TRUE(g.empty());
86
3/5
✓ Branch 2 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
2 ASSERT_EQ(r.size(), 22);
87
88 4 std::string produced;
89
2/2
✓ Branch 5 taken 22 times.
✓ Branch 6 taken 1 times.
46 for( auto c : r ) {
90
1/1
✓ Branch 1 taken 22 times.
44 auto it = chck.find(c);
91
2/2
✓ Branch 2 taken 21 times.
✓ Branch 3 taken 1 times.
44 if(it != chck.end()) {
92
2/2
✓ Branch 6 taken 29 times.
✓ Branch 7 taken 21 times.
100 for( auto dep : it->second ) {
93 58 bool wasNotProduced = produced.find(dep) == std::string::npos;
94
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 29 times.
58 EXPECT_FALSE( wasNotProduced ) << "product '" << c
95 58 << "' depends on '" << dep << "' but it was not produced";
96 }
97 }
98
1/1
✓ Branch 1 taken 22 times.
44 produced += c;
99 }
100
101 #if 0
102 std::cout << " result:";
103 for( auto c : r ) {
104 std::cout << " " << c;
105 }
106 std::cout << std::endl;
107 #endif
108
109 #if 0
110 ASSERT_EQ(r.size(), 7);
111 EXPECT_EQ(r[0], '0');
112 // ...
113 EXPECT_EQ(r[6], '6');
114 #else // ^^^ TODO: for gtest >=1.10
115 // ...
116 #endif
117 2 }
118
119 8 TEST(TopologicalSort, resolvesSpecialCase) {
120 // somehow caused troubles
121 2 util::DAG<std::string> g;
122
123
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
8 g.add( "naming" , "GEMMonitor/APVTiming" );
124
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
8 g.add( "MuMegaLayout", "GEMMonitor/APVTiming" );
125
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
8 g.add( "naming" , "GEMMonitor/APVPedestals");
126
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
8 g.add( "MuMegaLayout", "GEMMonitor/APVPedestals");
127
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
8 g.add( "naming" , "p348reco/CaloCellCalib" );
128
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
8 g.add( "naming" , "placements" );
129
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
8 g.add( "naming" , "MuMegaLayout" );
130
3/3
✓ Branch 1 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 7 taken 1 times.
6 g.add( "naming" , "masterTimeSource" );
131
132
1/1
✓ Branch 1 taken 1 times.
2 auto r = g.sorted();
133
1/2
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
2 EXPECT_TRUE(g.empty());
134 2 }
135
136 }
137
138
139
140