def test_delete_corrupted(self):
        """
            a    b
             ___
            / / \
        1  A,B   C
           |/    |
        2  D --- E
        """
        A = Vertex(domain=(1,'a'))
        B = Vertex(domain=(1,'a'))
        D = Vertex(domain=(2,'a'))
        C = Vertex(domain=(1,'b'))
        E = Vertex(domain=(2,'b'))

        AD = Edge(A, D)
        AC = Edge(A, C)
        BC = Edge(B, C)
        BD = Edge(B, D)
        DE = Edge(D, E)
        CE = Edge(C, E)

        g = Graph([A, B, C, D, E], [AD, AC, BC, BD, DE, CE])
        g.prepare()
        self.assertItemsEqual(g.get_vertices(), [A, B, C, D, E])
        self.assertItemsEqual(g.get_edges(), [AD, AC, BC, BD, DE, CE])

        g.delete_edge(BD, True)
        g.delete_corrupted()

        self.assertItemsEqual(g.get_vertices(), [A, C, D, E])
        self.assertItemsEqual(g.get_edges(), [AD, AC, DE, CE])

        self.assertFalse(g.is_neighborhood_corrupted())
    def test_delete_edge(self):
        """
        a - b
        -----
        B
          \
            C
        """
        v_aB = Vertex(domain='a')
        v_bC = Vertex(domain='b')

        e_aB_bC = Edge(v_aB, v_bC)

        g = Graph([v_aB, v_bC],
                  [e_aB_bC])
        g.prepare()
        g.delete_edge(e_aB_bC)
        self.assertItemsEqual(g.get_edges(), [])
        self.assertItemsEqual(g.get_vertices(), [])
        self.assertTrue(g.is_neighborhood_corrupted())
        """
 def test_deep_copy(self):
     v_a = Vertex()
     v_b = Vertex()
     e = Edge(v_a, v_b)
     g = Graph([v_a, v_b], [e])
     g_copy = deepcopy(g)
     self.assertIsNot(g, g_copy)
     e = g.get_edges().pop()
     e_copy = g_copy.E.pop()
     self.assertIsNot(e, e_copy)
     self.assertEqual(e.get_value(), e_copy.get_value())
     self.assertIsNot(e.get_vertices(), e_copy.get_vertices())
     self.assertEqual([v.get_value() for v in e.get_vertices()],
                      [v.get_value() for v in e_copy.get_vertices()])
     [v.set_value(1) for v in e.get_vertices()]
     [v.set_value(2) for v in e_copy.get_vertices()]
     self.assertNotEqual([v.get_value() for v in e.get_vertices()],
                      [v.get_value() for v in e_copy.get_vertices()])
     e.set_value(1)
     e_copy.set_value(2)
     self.assertEqual(e.get_value(), 1)
     self.assertEqual(e_copy.get_value(), 2)
     self.assertEqual(len(g.get_vertices().intersection(g_copy.V)), 0)
    def test_delete_vertex(self):
        """
        a - b - c
        -----
        A - A - A
              /
        B - B
          \
            C
        """
        v_aA = Vertex(domain='a')
        v_aB = Vertex(domain='a')
        v_bA = Vertex(domain='b')
        v_bB = Vertex(domain='b')
        v_bC = Vertex(domain='b')
        v_cA = Vertex(domain='c')

        e_aA_bA = Edge(v_aA, v_bA)
        e_aB_bB = Edge(v_aB, v_bB)
        e_aB_bC = Edge(v_aB, v_bC)
        e_bA_cA = Edge(v_bA, v_cA)
        e_bB_cA = Edge(v_bB, v_cA)

        g = Graph([v_aA, v_aB, v_bA, v_bB, v_bC, v_cA],
                  [e_aA_bA, e_aB_bB, e_bA_cA, e_bB_cA, e_aB_bC])
        g.prepare()

        self.assertItemsEqual(g.get_edges(), [e_aA_bA, e_aB_bB, e_aB_bC,
                                              e_bA_cA, e_bB_cA])
        self.assertItemsEqual(g.get_vertices(), [v_aA, v_aB, v_bA,
                                                 v_bB, v_bC, v_cA])
        self.assertFalse(g.is_neighborhood_corrupted())

        """
        a - b - c
        -----
        X   x   A
              /
        B - B
          \
            C
        """
        g.delete_vertex(v_aA)
        self.assertItemsEqual(g.get_edges(), [e_aB_bB, e_aB_bC, e_bB_cA])
        self.assertItemsEqual(g.get_vertices(), [v_aB, v_bB, v_bC, v_cA])
        self.assertFalse(g.is_neighborhood_corrupted())
        self.assertItemsEqual(g.get_domain('b'), [v_bB, v_bC])

        """
        a - b - c
        -----
                x

        B   X
          \
            C
        """
        g.delete_vertex(v_bB)
        self.assertItemsEqual(g.get_edges(), [e_aB_bC])
        self.assertItemsEqual(g.get_vertices(), [v_aB, v_bC])
        self.assertTrue(g.is_neighborhood_corrupted())
        self.assertItemsEqual(g.get_domain('a'), [v_aB])
        self.assertItemsEqual(g.get_domain('b'), [v_bC])

        """
        a - b - c
        -----
        x

            X
        """
        g.delete_vertex(v_bC)
        self.assertEqual(g.get_edges(), set())
        self.assertEqual(g.get_vertices(), set())
        self.assertTrue(g.is_neighborhood_corrupted())

        g.restore()
        self.assertItemsEqual(g.get_edges(), [e_aA_bA, e_aB_bB, e_aB_bC,
                                              e_bA_cA, e_bB_cA])
        self.assertItemsEqual(g.get_vertices(), [v_aA, v_aB, v_bA,
                                                 v_bB, v_bC, v_cA])
        self.assertFalse(g.is_neighborhood_corrupted())