class TestHomologyClass(unittest.TestCase):
    def assertImplies(self, A, B):
        self.assertTrue(not A or B, msg='AssertionError: %s =/=> %s' % (A, B))
    
    @given(strategies.homology_classes())
    def test_pickle(self, hc):
        self.assertEqual(hc, pickle.loads(pickle.dumps(hc)))
    
    @given(st.data())
    def test_hash(self, data):
        hc1 = data.draw(strategies.homology_classes())
        hc2 = data.draw(strategies.homology_classes(hc1.triangulation))
        self.assertImplies(hc1 == hc2, hash(hc1) == hash(hc2))
    
    @given(st.data())
    def test_canonical(self, data):
        hc1 = data.draw(strategies.homology_classes())
        hc2 = data.draw(strategies.homology_classes(hc1.triangulation))
        self.assertEqual(hc1.canonical() + hc2.canonical(), (hc1 + hc2).canonical())
        self.assertEqual(hc1.canonical() - hc2.canonical(), (hc1 - hc2).canonical())
        self.assertEqual(-(hc1.canonical()), (-hc1).canonical())
    
    @given(st.data())
    def test_image(self, data):
        hc1 = data.draw(strategies.homology_classes())
        hc2 = data.draw(strategies.homology_classes(hc1.triangulation))
        h = data.draw(strategies.mappings(hc1.triangulation))
        self.assertEqual(h(hc1 + hc2), h(hc1) + h(hc2))
    
    @given(st.data())
    def test_abelian(self, data):
        T = data.draw(strategies.triangulations())
        hcs = data.draw(st.lists(elements=strategies.homology_classes(T), min_size=1))
        self.assertEqual(sum(hcs), sum(data.draw(st.permutations(hcs))))
    
    @given(st.data())
    def test_orientation(self, data):
        hc = data.draw(strategies.homology_classes())
        edge = data.draw(st.sampled_from(hc.triangulation.edges))
        self.assertEqual(hc(edge), -hc(~edge))
 def test_orientation(self, data):
     hc = data.draw(strategies.homology_classes())
     edge = data.draw(st.sampled_from(hc.triangulation.edges))
     self.assertEqual(hc(edge), -hc(~edge))
 def test_abelian(self, data):
     T = data.draw(strategies.triangulations())
     hcs = data.draw(st.lists(elements=strategies.homology_classes(T), min_size=1))
     self.assertEqual(sum(hcs), sum(data.draw(st.permutations(hcs))))
 def test_image(self, data):
     hc1 = data.draw(strategies.homology_classes())
     hc2 = data.draw(strategies.homology_classes(hc1.triangulation))
     h = data.draw(strategies.mappings(hc1.triangulation))
     self.assertEqual(h(hc1 + hc2), h(hc1) + h(hc2))
 def test_canonical(self, data):
     hc1 = data.draw(strategies.homology_classes())
     hc2 = data.draw(strategies.homology_classes(hc1.triangulation))
     self.assertEqual(hc1.canonical() + hc2.canonical(), (hc1 + hc2).canonical())
     self.assertEqual(hc1.canonical() - hc2.canonical(), (hc1 - hc2).canonical())
     self.assertEqual(-(hc1.canonical()), (-hc1).canonical())
 def test_hash(self, data):
     hc1 = data.draw(strategies.homology_classes())
     hc2 = data.draw(strategies.homology_classes(hc1.triangulation))
     self.assertImplies(hc1 == hc2, hash(hc1) == hash(hc2))