@@ -1137,13 +1137,13 @@ namespace unittest {
11371137
11381138 SECTION (" Traverse 3 backwards" ) {
11391139 // [1+0 3 {2 inf 0 inf 12 inf inf 9 inf inf inf 2 inf
1140- // 2 inf inf 8 inf 8 5 0 inf [4+0][3-1rev 1 3-0rev]} 0 5+0 ]
1140+ // 2 inf inf 8 inf 8 5 0 inf [4+0][3-1rev 1 3-0rev]} 1 5+1 ]
11411141 vector<pos_t > positions;
11421142 positions.emplace_back (1 , false , 0 );
11431143 positions.emplace_back (4 , false , 0 );
11441144 positions.emplace_back (3 , true , 0 );
11451145 positions.emplace_back (3 , true , 1 );
1146- positions.emplace_back (5 , false , 0 );
1146+ positions.emplace_back (5 , false , 1 );
11471147
11481148 ZipCodeForest zip_forest = make_and_validate_forest (positions, distance_index);
11491149 REQUIRE (zip_forest.trees .size () == 1 );
@@ -1201,35 +1201,41 @@ namespace unittest {
12011201 REQUIRE (reverse_views[{1 , true }][1 ].seed == 3 );
12021202 REQUIRE (reverse_views[{1 , true }][1 ].distance == 3 );
12031203 REQUIRE (reverse_views[{1 , true }][1 ].is_reversed == true );
1204- // Edge to 5+0rev (yes, rev - we're going L->R here)
1204+ // Edge to 5+1rev (yes, rev - we're going L->R here)
12051205 REQUIRE (reverse_views[{1 , true }][2 ].seed == 4 );
1206- REQUIRE (reverse_views[{1 , true }][2 ].distance == 8 );
1206+ REQUIRE (reverse_views[{1 , true }][2 ].distance == 9 );
12071207 REQUIRE (reverse_views[{1 , true }][2 ].is_reversed == true );
12081208
1209- // 3-1 can see the rest of its chain
1209+ // 3-1 can see the rest of its chain,
1210+ // and should also exit the snarl to 1+0
12101211 // Not rev since we're going L->R
12111212 REQUIRE (reverse_views.count ({3 , false }));
1212- REQUIRE (reverse_views[{3 , false }].size () == 1 );
1213+ REQUIRE (reverse_views[{3 , false }].size () == 2 );
12131214 // Edge to 3-0
12141215 REQUIRE (reverse_views[{3 , false }][0 ].seed == 2 );
12151216 REQUIRE (reverse_views[{3 , false }][0 ].distance == 1 );
12161217 REQUIRE (reverse_views[{3 , false }][0 ].is_reversed == false );
1218+ // Edge to 1+0
1219+ REQUIRE (reverse_views[{3 , false }][1 ].seed == 0 );
1220+ REQUIRE (reverse_views[{3 , false }][1 ].distance == 6 );
1221+ REQUIRE (reverse_views[{3 , false }][1 ].is_reversed == false );
12171222
1218- // 5+0 can see the seeds on 3 & 1
1219- REQUIRE (reverse_views.count ({4 , false }));
1220- REQUIRE (reverse_views[{4 , false }].size () == 3 );
1221- // Edge to 3-1 (not rev since going L->R)
1222- REQUIRE (reverse_views[{4 , false }][0 ].seed == 3 );
1223- REQUIRE (reverse_views[{4 , false }][0 ].distance == 5 );
1224- REQUIRE (reverse_views[{4 , false }][0 ].is_reversed == false );
1223+ // 3-1rev can see 5+1rev by exiting backwards
1224+ REQUIRE (reverse_views.count ({3 , true }));
1225+ REQUIRE (reverse_views[{3 , true }].size () == 1 );
12251226 // Edge to 3-0
1226- REQUIRE (reverse_views[{4 , false }][1 ].seed == 2 );
1227- REQUIRE (reverse_views[{4 , false }][1 ].distance == 6 );
1228- REQUIRE (reverse_views[{4 , false }][1 ].is_reversed == false );
1227+ REQUIRE (reverse_views[{3 , true }][0 ].seed == 4 );
1228+ REQUIRE (reverse_views[{3 , true }][0 ].distance == 6 );
1229+ REQUIRE (reverse_views[{3 , true }][0 ].is_reversed == true );
1230+
1231+ // 5+1 can see only see the seed on 1
1232+ // (it skips over the cyclic snarl)
1233+ REQUIRE (reverse_views.count ({4 , false }));
1234+ REQUIRE (reverse_views[{4 , false }].size () == 1 );
12291235 // Edge to 1+0
1230- REQUIRE (reverse_views[{4 , false }][2 ].seed == 0 );
1231- REQUIRE (reverse_views[{4 , false }][2 ].distance == 11 );
1232- REQUIRE (reverse_views[{4 , false }][2 ].is_reversed == false );
1236+ REQUIRE (reverse_views[{4 , false }][0 ].seed == 0 );
1237+ REQUIRE (reverse_views[{4 , false }][0 ].distance == 12 );
1238+ REQUIRE (reverse_views[{4 , false }][0 ].is_reversed == false );
12331239 } else {
12341240 cerr << " Not testing reverse views since I didn't bother writing it" << endl;
12351241 }
@@ -1821,6 +1827,25 @@ namespace unittest {
18211827 REQUIRE (dag_non_dag_count.first == 0 );
18221828 REQUIRE (dag_non_dag_count.second == 2 );
18231829 }
1830+
1831+ SECTION (" Check iterator" ) {
1832+ // For each seed, what seeds and distances do we see in reverse from it?
1833+ auto reverse_views = get_reverse_views (zip_forest);
1834+ // All seven seeds go R->L,
1835+ // and the four in the cyclic snarl also go L->R
1836+ REQUIRE (reverse_views.size () == 11 );
1837+ // 3+0 R->L can see 2+0 inside & 1+0 outside
1838+ REQUIRE (reverse_views.count ({2 , false }));
1839+ REQUIRE (reverse_views[{2 , false }].size () == 2 );
1840+ // Edge to 1+0
1841+ REQUIRE (reverse_views[{2 , false }][0 ].seed == 0 );
1842+ REQUIRE (reverse_views[{2 , false }][0 ].distance == 6 );
1843+ REQUIRE (reverse_views[{2 , false }][0 ].is_reversed == false );
1844+ // Edge to 2+0
1845+ REQUIRE (reverse_views[{2 , false }][1 ].seed == 1 );
1846+ REQUIRE (reverse_views[{2 , false }][1 ].distance == 3 );
1847+ REQUIRE (reverse_views[{2 , false }][1 ].is_reversed == false );
1848+ }
18241849 }
18251850 SECTION (" Reverse both inversions" ) {
18261851 // [1+0 3 {1 inf 0 inf 3 inf inf 9 0 3 inf [4-0 3
0 commit comments