| 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 |