def test_BoundaryTracker_get_regions_for_node(self): diag = Diagram([(1, 4), (2, 5), (3, 8), (6, 7)]) bounds = BoundaryTracker() region_factory = RegionFactory() outside = region_factory.get_next_region_id() bounds.add(Span(1, 8), outside, outside) # Initially all nodes outside # Add chord (1,4) regionA = region_factory.get_next_region_id() bounds.add(Span(1, 4), outside, regionA) # Add chord (2,5) - segment (4,5) regionB = region_factory.get_next_region_id() bounds.add(Span(4, 5), outside, regionB) bounds.add(Span(1, 2), regionA, regionB) self.assertEqual(([['A', 'B'], ['@', 'A']]), bounds.get_regions_for_node(2)) with self.assertRaisesRegexp( Exception, "get_regions_for_node: No boundary found containing node: 17"): bounds.get_regions_for_node(17)
def test_Boudnaries_update_regions(self): bounds = BoundaryTracker() region_factory = RegionFactory() outside = region_factory.get_next_region_id() bounds.add(Span(1, 8), outside, outside) # Initially all nodes outside # Add chord (1,4) regionA = region_factory.get_next_region_id() bounds.add(Span(1, 4), outside, regionA) # Change boundary on span (2,3) from out_A to out_B regionB = region_factory.get_next_region_id() bounds.update_regions(Span(2, 3), regionA, regionB) self.assertEqual([outside, regionB], bounds.get_regions_for_nodes(2, 3))
def test_BoundaryTracker_get_spans_from_node(self): # Setup boundaries for 1st three chords in diagram diag = Diagram([(1, 4), (2, 5), (3, 8), (6, 7)]) bounds = BoundaryTracker() region_factory = RegionFactory() outside = region_factory.get_next_region_id() bounds.add(Span(1, 8), outside, outside) # Initially all nodes outside # Add chord (1,4) regionA = region_factory.get_next_region_id() bounds.add(Span(1, 4), outside, regionA) # Add chord (2,5) - segment (4,5) regionB = region_factory.get_next_region_id() bounds.add(Span(4, 5), outside, regionB) # Test available spans to close (4,5) regionB spans = bounds.get_spans_from_node(4, diag, 5) self.assertEqual(spans, [[1, 2]]) bounds.add(Span(1, 2), regionA, regionB) # Add chord (6, 7) (next in numeric order) span(6,7) # It's a 1-move loop, region is already closed regionC = region_factory.get_next_region_id() bounds.add(Span(6, 7), regionA, regionC) bounds.add(Span(5, 6), regionA, regionA) # Add chord(3, 8), span(7, 8) regionD = region_factory.get_next_region_id() bounds.add(Span(7, 8), regionA, regionD) # Test available spans to close (7,8) regionD spans = bounds.get_spans_from_node(7, diag, 8) self.assertEqual(spans, [[5, 6], [6, 7]])
def test_BoundaryTracker_validate_all_regions_closed_3_chord(self): "Verify regression on diagram: [(1, 2), (3, 6), (4, 5)]" diag = Diagram([(1, 2), (3, 6), (4, 5)]) bounds = BoundaryTracker() region_factory = RegionFactory() outside = region_factory.get_next_region_id() regionA = region_factory.get_next_region_id() regionB = region_factory.get_next_region_id() regionC = region_factory.get_next_region_id() bounds.add(Span(1, 6), outside, outside) bounds.add(Span(1, 2), outside, regionA) bounds.add(Span(4, 5), outside, regionB) bounds.add(Span(3, 4), outside, regionC) bounds.add(Span(5, 6), outside, regionC) self.assertTrue(bounds.validate_all_regions_closed(diag))
def test_BoundaryTracker_add(self): bounds = BoundaryTracker() region_factory = RegionFactory() outside = region_factory.get_next_region_id() regionA = region_factory.get_next_region_id() regionB = region_factory.get_next_region_id() bounds.add(Span(1, 4), outside, regionA) self.assertEqual([Span(1, 4)], bounds.get(regionA, outside)) self.assertEqual([Span(1, 4)], bounds.get(outside, regionA)) bounds.add(Span(6, 9), outside, regionB) self.assertEqual([Span(1, 4)], bounds.get(regionA, outside)) self.assertEqual([Span(6, 9)], bounds.get(outside, regionB)) bounds.add(Span(3, 8), regionA, regionB) self.assertEqual([Span(1, 3)], bounds.get(regionA, outside)) self.assertEqual([Span(8, 9)], bounds.get(outside, regionB)) self.assertEqual([Span(3, 8)], bounds.get(regionA, regionB))
def test_BoundaryTracker_validate_all_regions_closed(self): # Validate regions after adding boundaries for each chord diag = Diagram([(1, 4), (2, 5), (3, 8), (6, 7)]) bounds = BoundaryTracker() region_factory = RegionFactory() outside = region_factory.get_next_region_id() bounds.add(Span(1, 8), outside, outside) # Initially all nodes outside self.assertTrue(bounds.validate_all_regions_closed(diag)) # Add chord (1,4) regionA = region_factory.get_next_region_id() bounds.add(Span(1, 4), outside, regionA) self.assertTrue(bounds.validate_all_regions_closed(diag)) # Add chord (2,5) - segment (4,5) regionB = region_factory.get_next_region_id() bounds.add(Span(4, 5), outside, regionB) bounds.add(Span(1, 2), regionA, regionB) self.assertTrue(bounds.validate_all_regions_closed(diag)) # Add chord (6, 7) (next in numeric order) span(6,7) # It's a 1-move loop, region is already closed regionC = region_factory.get_next_region_id() bounds.add(Span(6, 7), regionA, regionC) bounds.add(Span(5, 6), regionA, regionA) self.assertTrue(bounds.validate_all_regions_closed(diag)) # Add chord(3, 8), span(7, 8) regionD = region_factory.get_next_region_id() bounds.add(Span(7, 8), regionA, regionD) self.assertFalse(bounds.validate_all_regions_closed(diag)) bounds.add(Span(5, 6), regionA, regionD) self.assertFalse(bounds.validate_all_regions_closed(diag)) bounds.add(Span(2, 3), outside, regionD) self.assertTrue(bounds.validate_all_regions_closed(diag))
def test_get_ids(self): region_factory = RegionFactory() self.assertEqual('@', region_factory.get_next_region_id()) self.assertEqual('A', region_factory.get_next_region_id()) self.assertEqual('B', region_factory.get_next_region_id())