def test_corundum(self):
        """Testing coordination and connectivity matrix for corundum structure Cr2O3"""

        corundum_structure = Structure.from_file('test_structures/corundum.cif', True, True)

        cn_finder = EffectiveCoordFinder(corundum_structure)
        cns = cn_finder.get_avg_CN(radius=2.6, anions=['O'])
        for cation in cns:
            self.assertTrue(cation == "Cr", "Cr should be the only ions in corundum Cr2O3")
            if cation == 'Cr':
                self.assertEqual(round(cns[cation]), 6, "Cr should be 6-fold coordinated")

        central_species = ['Cr']
        peripheral_species = ['O']

        connectivity_matrix, connectivity_polyhedra = \
            get_connectivity_matrix(corundum_structure, False, 2.6, peripheral_species, central_species)

        self.assertIn('Cr', connectivity_matrix.keys(), "Cr polyhedra not found in corundum Cr2O3 matrix")
        self.assertEqual(connectivity_matrix['Cr']['Cr']['point'], 9, "Cr should be point-sharing")
        self.assertEqual(connectivity_matrix['Cr']['Cr']['edge'], 3, "Cr should be edge-sharing")
        self.assertEqual(connectivity_matrix['Cr']['Cr']['face'], 1, "Cr should be face-sharing")

        for poly in connectivity_polyhedra:
            self.assertIsInstance(poly, Polyhedra, "List of polyhedra includes a non-polyhedra element")
    def test_fluorite(self):
        """Testing coordination and connectivity matrix for fluorite structure CaF2"""

        caf2_structure = Structure.from_file('test_structures/fluorite.cif', True, True)

        cn_finder = EffectiveCoordFinder(caf2_structure)
        cns = cn_finder.get_avg_CN(radius=2.6, anions=['F'])
        for cation in cns:
            self.assertEqual(cation, "Ca", "Ca should be the only ions in CaF2 fluorite")
            if cation == 'Ca':
                self.assertEqual(round(cns[cation]), 8, "Ca should be 8-fold coordinated")

        central_species = ['Ca']
        peripheral_species = ['F']

        connectivity_matrix, connectivity_polyhedra = \
            get_connectivity_matrix(caf2_structure, False, 2.6, peripheral_species, central_species)

        self.assertIn('Ca', connectivity_matrix.keys(), "Ca polyhedra not found in CaF2 fluorite matrix")
        self.assertEqual(connectivity_matrix['Ca']['Ca']['point'], 0, "Ca should not be point-sharing")
        self.assertEqual(connectivity_matrix['Ca']['Ca']['edge'], 12, "Ca should be edge-sharing")
        self.assertEqual(connectivity_matrix['Ca']['Ca']['face'], 0, "Ca should not be face-sharing")

        for poly in connectivity_polyhedra:
            self.assertIsInstance(poly, Polyhedra, "List of polyhedra includes a non-polyhedra element")
    def test_k2nif4(self):
        """Testing coordination and connectivity matrix for K2NiF4 structure"""

        k2nif4_structure = Structure.from_file('test_structures/K2NiF4.cif', True, True)

        cn_finder = EffectiveCoordFinder(k2nif4_structure)
        cns = cn_finder.get_avg_CN(radius=3.0, anions=['F'])
        for cation in cns:
            self.assertTrue(cation == "K" or cation == "Ni",
                            "K and Ni should be the only cations in K2NiF4 structure")
            if cation == 'K':
                self.assertLessEqual(round(cns[cation]), 9,
                                     "Zr should be 9-fold coordinated (effective coordination underestimates)")
            if cation == 'Ni':
                self.assertEqual(round(cns[cation]), 6, "Ni should be 6-fold coordinated")

        central_species = ['K', 'Ni']
        peripheral_species = ['F']

        connectivity_matrix, connectivity_polyhedra = \
            get_connectivity_matrix(k2nif4_structure, False, 3.0, peripheral_species, central_species)

        self.assertIn('K', connectivity_matrix.keys(), "K cations not found in matrix")
        self.assertIn('Ni', connectivity_matrix.keys(), "Ni cations not found in matrix")
        self.assertEqual(connectivity_matrix['K']['K']['point'], 8, "K should be point-sharing")
        self.assertEqual(connectivity_matrix['K']['K']['edge'], 4, "K should not be edge-sharing")
        self.assertEqual(connectivity_matrix['K']['K']['face'], 5, "K should not be face-sharing")
        self.assertEqual(connectivity_matrix['Ni']['Ni']['point'], 4, "Ni should be point-sharing")
        self.assertEqual(connectivity_matrix['Ni']['Ni']['edge'], 0, "Ni should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Ni']['Ni']['face'], 0, "Ni should not be face-sharing")
        self.assertEqual(connectivity_matrix['Ni']['K']['point'], 2, "Ni and K should not be point-sharing")
        self.assertEqual(connectivity_matrix['Ni']['K']['edge'], 0, "Ni and K should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Ni']['K']['face'], 8, "Ni and K should only be face-sharing")

        for connectivity_type in connectivity_matrix['K']['Ni'].keys():
            self.assertEqual(connectivity_matrix['K']['Ni'][connectivity_type]*k2nif4_structure.composition['K'],
                             connectivity_matrix['Ni']['K'][connectivity_type]*k2nif4_structure.composition['Ni'],
                             "Total number of sharing instances between 'K' and 'Ni' "
                             "should be same as total number of sharing"
                             "instances between 'Ni' and 'K'")

        for poly in connectivity_polyhedra:
            self.assertIsInstance(poly, Polyhedra, "List of polyhedra includes a non-polyhedra element")
    def test_hexagonal(self):
        """Testing coordination and connectivity matrix for hexagonal structure BaNiO3"""

        hexagonal_structure = Structure.from_file('test_structures/HexagonalABX3.cif', True, True)

        cn_finder = EffectiveCoordFinder(hexagonal_structure)
        cns = cn_finder.get_avg_CN(radius=3.2, anions=['O'])
        for cation in cns:
            self.assertTrue(cation == "Ba" or cation == "Ni",
                            "Ba and Ni should be the only ions in hexagonal BaNiO3")
            if cation == 'Ba':
                self.assertEqual(round(cns[cation]), 12,
                                 "Ba should be 12-fold coordinated (effective coordination underestimates)")
            if cation == 'Ni':
                self.assertEqual(round(cns[cation]), 6, "Si should be 6-fold coordinated")

        central_species = ['Ba', 'Ni']
        peripheral_species = ['O']

        connectivity_matrix, connectivity_polyhedra = \
            get_connectivity_matrix(hexagonal_structure, False, 3.2, peripheral_species, central_species)

        self.assertIn('Ba', connectivity_matrix.keys(), "Ba cations not found in matrix")
        self.assertIn('Ni', connectivity_matrix.keys(), "Ni cations not found in matrix")
        self.assertEqual(connectivity_matrix['Ba']['Ba']['point'], 6, "Ba should be point-sharing")
        self.assertEqual(connectivity_matrix['Ba']['Ba']['edge'], 0, "Ba should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Ba']['Ba']['face'], 8, "Ba should be face-sharing")
        self.assertEqual(connectivity_matrix['Ni']['Ni']['point'], 0, "Ni should not be point-sharing")
        self.assertEqual(connectivity_matrix['Ni']['Ni']['edge'], 0, "Ni should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Ni']['Ni']['face'], 2, "Ni should only be face-sharing")
        self.assertEqual(connectivity_matrix['Ni']['Ba']['point'], 6, "Ni and Ba should be point-sharing")
        self.assertEqual(connectivity_matrix['Ni']['Ba']['edge'], 0, "Ni and Ba should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Ni']['Ba']['face'], 6, "Ni and Ba should be face-sharing")

        for connectivity_type in connectivity_matrix['Ba']['Ni'].keys():
            self.assertEqual(connectivity_matrix['Ba']['Ni'][connectivity_type]*hexagonal_structure.composition['Ba'],
                             connectivity_matrix['Ni']['Ba'][connectivity_type]*hexagonal_structure.composition['Ni'],
                             "Total number of sharing instances between 'Ba' and 'Ni' "
                             "should be same as total number of sharing"
                             "instances between 'Ni' and 'Ba'")

        for poly in connectivity_polyhedra:
            self.assertIsInstance(poly, Polyhedra, "List of polyhedra includes a non-polyhedra element")
    def test_cafe2o4(self):
        """Testing coordination and connectivity matrix for CaFe2O4 structure"""

        cafe2o4_structure = Structure.from_file('test_structures/CaFe2O4.cif', True, True)

        cn_finder = EffectiveCoordFinder(cafe2o4_structure)
        cns = cn_finder.get_avg_CN(radius=2.6, anions=['O'])
        for cation in cns:
            self.assertTrue(cation == "Ca" or cation == "Fe",
                            "Ca and Fe should be the only cations in CaFe2O4 structure")
            if cation == 'Ca':
                self.assertLessEqual(round(cns[cation]), 8,
                                     "Ca should be 8-fold coordinated (effective coordination underestimates)")
            if cation == 'Fe':
                self.assertEqual(round(cns[cation]), 6, "Fe should be 6-fold coordinated")

        central_species = ['Ca', 'Fe']
        peripheral_species = ['O']

        connectivity_matrix, connectivity_polyhedra = \
            get_connectivity_matrix(cafe2o4_structure, False, 2.6, peripheral_species, central_species)

        self.assertIn('Ca', connectivity_matrix.keys(), "Ca cations not found in matrix")
        self.assertIn('Fe', connectivity_matrix.keys(), "Fe cations not found in matrix")
        self.assertEqual(connectivity_matrix['Ca']['Ca']['point'], 2, "Ca should be point-sharing")
        self.assertEqual(connectivity_matrix['Ca']['Ca']['edge'], 0, "Ca should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Ca']['Ca']['face'], 2, "Ca should be face-sharing")
        self.assertEqual(connectivity_matrix['Fe']['Fe']['point'], 4, "Fe should be point-sharing")
        self.assertEqual(connectivity_matrix['Fe']['Fe']['edge'], 4, "Fe should be edge-sharing")
        self.assertEqual(connectivity_matrix['Fe']['Fe']['face'], 0, "Fe should not be face-sharing")
        self.assertEqual(connectivity_matrix['Ca']['Fe']['point'], 8, "Fe and Ca should be point-sharing")
        self.assertEqual(connectivity_matrix['Ca']['Fe']['edge'], 5, "Fe and Ca should be edge-sharing")
        self.assertEqual(connectivity_matrix['Ca']['Fe']['face'], 2, "Fe and Ca should be face-sharing")

        for connectivity_type in connectivity_matrix['Ca']['Fe'].keys():
            self.assertEqual(connectivity_matrix['Ca']['Fe'][connectivity_type]*cafe2o4_structure.composition['Ca'],
                             connectivity_matrix['Fe']['Ca'][connectivity_type]*cafe2o4_structure.composition['Fe'],
                             "Total number of sharing instances between 'Ca' and 'Fe' "
                             "should be same as total number of sharing"
                             "instances between 'Fe' and 'Ca'")

        for poly in connectivity_polyhedra:
            self.assertIsInstance(poly, Polyhedra, "List of polyhedra includes a non-polyhedra element")
    def test_scheelite(self):
        """Testing coordination and connectivity matrix for scheelite structure CaWO4"""

        scheelite_structure = Structure.from_file('test_structures/scheelite.cif', True, True)

        cn_finder = EffectiveCoordFinder(scheelite_structure)
        cns = cn_finder.get_avg_CN(radius=2.6, anions=['O'])
        for cation in cns:
            self.assertTrue(cation == "Ca" or cation == "W", "Ca and W should be the only ions in scheelite CaWO4")
            if cation == 'Ca':
                self.assertEqual(round(cns[cation]), 8,
                                 "Ca should be 8-fold coordinated (effective coordination underestimates)")
            if cation == 'W':
                self.assertEqual(round(cns[cation]), 4, "W should be 4-fold coordinated")

        central_species = ['Ca', 'W']
        peripheral_species = ['O']

        connectivity_matrix, connectivity_polyhedra = \
            get_connectivity_matrix(scheelite_structure, False, 2.6, peripheral_species, central_species)

        self.assertIn('Ca', connectivity_matrix.keys(), "Ca cations not found in matrix")
        self.assertIn('W', connectivity_matrix.keys(), "W cations not found in matrix")
        self.assertEqual(connectivity_matrix['Ca']['Ca']['point'], 0, "Ca should not be point-sharing")
        self.assertEqual(connectivity_matrix['Ca']['Ca']['edge'], 4, "Ca should be be edge-sharing")
        self.assertEqual(connectivity_matrix['Ca']['Ca']['face'], 0, "Ca should not be face-sharing")
        self.assertEqual(connectivity_matrix['W']['W']['point'], 0, "W should not be point-sharing")
        self.assertEqual(connectivity_matrix['W']['W']['edge'], 0, "W should not be edge-sharing")
        self.assertEqual(connectivity_matrix['W']['W']['face'], 0, "W should not be face-sharing")
        self.assertEqual(connectivity_matrix['Ca']['W']['point'], 8, "Ca and W should only be point-sharing")
        self.assertEqual(connectivity_matrix['Ca']['W']['edge'], 0, "Ca and W should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Ca']['W']['face'], 0, "Ca and W should not be face-sharing")

        for connectivity_type in connectivity_matrix['Ca']['W'].keys():
            self.assertEqual(connectivity_matrix['Ca']['W'][connectivity_type]*scheelite_structure.composition['Ca'],
                             connectivity_matrix['W']['Ca'][connectivity_type]*scheelite_structure.composition['W'],
                             "Total number of sharing instances between 'Ca' and 'W' "
                             "should be same as total number of sharing"
                             "instances between 'W' and 'Ca'")

        for poly in connectivity_polyhedra:
            self.assertIsInstance(poly, Polyhedra, "List of polyhedra includes a non-polyhedra element")
    def test_pyroxene(self):
        """Testing coordination and connectivity matrix for pyroxene structure Mg16Si16O48"""

        pyroxene_structure = Structure.from_file('test_structures/pyroxene.cif', True, True)

        cn_finder = EffectiveCoordFinder(pyroxene_structure)
        cns = cn_finder.get_avg_CN(radius=2.6, anions=['O'])
        for cation in cns:
            self.assertTrue(cation == "Mg" or cation == "Si", "Mg and Si should be the only ions in pyroxene MgSiO4")
            if cation == 'Mg':
                self.assertLessEqual(round(cns[cation]), 6,
                                     "Mg should be 6-fold coordinated (effective coordination underestimates)")
            if cation == 'Si':
                self.assertEqual(round(cns[cation]), 4, "Si should be 4-fold coordinated")

        central_species = ['Mg', 'Si']
        peripheral_species = ['O']

        connectivity_matrix, connectivity_polyhedra = \
            get_connectivity_matrix(pyroxene_structure, False, 2.6, peripheral_species, central_species)

        self.assertIn('Mg', connectivity_matrix.keys(), "Mg cations not found in matrix")
        self.assertIn('Si', connectivity_matrix.keys(), "Si cations not found in matrix")
        self.assertEqual(connectivity_matrix['Mg']['Mg']['point'], 0, "Mg should be point-sharing")
        self.assertEqual(connectivity_matrix['Mg']['Mg']['edge'], 4, "Mg should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Mg']['Mg']['face'], 0, "Mg should not be face-sharing")
        self.assertEqual(connectivity_matrix['Si']['Si']['point'], 2, "Ti should be point-sharing")
        self.assertEqual(connectivity_matrix['Si']['Si']['edge'], 0, "Ti should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Si']['Si']['face'], 0, "Ti should not be face-sharing")
        self.assertEqual(connectivity_matrix['Si']['Mg']['point'], 6, "Ti and Mg should not be point-sharing")
        self.assertEqual(connectivity_matrix['Si']['Mg']['edge'], 0.5, "Ti and Mg should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Si']['Mg']['face'], 0, "Ti and Mg should only be face-sharing")

        for connectivity_type in connectivity_matrix['Mg']['Si'].keys():
            self.assertEqual(connectivity_matrix['Mg']['Si'][connectivity_type]*pyroxene_structure.composition['Mg'],
                             connectivity_matrix['Si']['Mg'][connectivity_type]*pyroxene_structure.composition['Si'],
                             "Total number of sharing instances between 'Mg' and 'Si' "
                             "should be same as total number of sharing"
                             "instances between 'Si' and 'Mg'")

        for poly in connectivity_polyhedra:
            self.assertIsInstance(poly, Polyhedra, "List of polyhedra includes a non-polyhedra element")
    def test_olivine(self):
        """Testing coordination and connectivity matrix for olivine structure Fe2SiO4"""

        olivine_structure = Structure.from_file('test_structures/olivine.cif', True, True)

        cn_finder = EffectiveCoordFinder(olivine_structure)
        cns = cn_finder.get_avg_CN(radius=2.6, anions=['O'])
        for cation in cns:
            self.assertTrue(cation == "Fe" or cation == "Si",
                            "Fe and Si cations should be the only cations in olivine Fe2SiO4")
            if cation == 'Fe':
                self.assertEqual(round(cns[cation]), 6, "Fe should be 6-fold coordinated")
            if cation == 'Si':
                self.assertEqual(round(cns[cation]), 4, "Si should be 4-fold coordinated")

        central_species = ['Fe', 'Si']
        peripheral_species = ['O']

        connectivity_matrix, connectivity_polyhedra = \
            get_connectivity_matrix(olivine_structure, False, 2.6, peripheral_species, central_species)

        self.assertIn('Fe', connectivity_matrix.keys(), "Fe polyhedra not found in matrix")
        self.assertIn('Si', connectivity_matrix.keys(), "Si polyhedra not found in matrix")
        self.assertEqual(connectivity_matrix['Fe']['Fe']['point'], 6, "Fe should be point-sharing")
        self.assertEqual(connectivity_matrix['Fe']['Fe']['edge'], 3, "Fe should be edge-sharing")
        self.assertEqual(connectivity_matrix['Fe']['Fe']['face'], 0, "Fe should be face-sharing")
        self.assertEqual(connectivity_matrix['Si']['Si']['point'], 0, "Si should be isolated")
        self.assertEqual(connectivity_matrix['Si']['Si']['edge'], 0, "Si should be isolated")
        self.assertEqual(connectivity_matrix['Si']['Si']['face'], 0, "Si should be isolated")
        self.assertEqual(connectivity_matrix['Si']['Fe']['point'], 6, "Fe and Si should be point-sharing")
        self.assertEqual(connectivity_matrix['Si']['Fe']['edge'], 3, "Fe and Si should be edge-sharing")
        self.assertEqual(connectivity_matrix['Si']['Fe']['face'], 0, "Fe and Si should not be face-sharing")

        for connectivity_type in connectivity_matrix['Fe']['Si'].keys():
            self.assertEqual(connectivity_matrix['Fe']['Si'][connectivity_type]*olivine_structure.composition['K'],
                             connectivity_matrix['Si']['Fe'][connectivity_type]*olivine_structure.composition['S'],
                             "Total number of sharing instances between 'Fe' and 'Si' "
                             "should be same as total number of sharing"
                             "instances between 'Si' and 'Fe'")

        for poly in connectivity_polyhedra:
            self.assertIsInstance(poly, Polyhedra, "List of polyhedra includes a non-polyhedra element")
    def test_barite(self):

        """Testing coordination and connectivity matrix for barite structure BaSO4"""

        barite_structure = Structure.from_file('test_structures/barite.cif', True, True)
        cn_finder = EffectiveCoordFinder(barite_structure)
        cns = cn_finder.get_avg_CN(anions=['O'])
        for cation in cns:
            self.assertTrue(cation == "Ba" or cation == "S",
                            "Ba and SO4 polyanions should be the only ions in barite")
            if cation == 'Ba':
                self.assertEqual(round(cns[cation]), 8, "Ba should be 8-fold coordinated")
            if cation == 'S':
                self.assertEqual(round(cns[cation]), 4, "S should be 4-fold coordinated")

        central_species = ['Ba', 'S']
        peripheral_species = ['O']

        connectivity_matrix, connectivity_polyhedra = \
            get_connectivity_matrix(barite_structure, False, 3.0, peripheral_species, central_species)

        self.assertIn('Ba', connectivity_matrix.keys(), "Ba polyhedra not found in barite matrix")
        self.assertIn('S', connectivity_matrix.keys(), "SO4 polyanions not found in barite matrix")
        self.assertEqual(connectivity_matrix['Ba']['Ba']['point'], 4, "Ba should be point-sharing")
        self.assertEqual(connectivity_matrix['Ba']['Ba']['edge'], 4, "Ba should be edge--sharing")
        self.assertEqual(connectivity_matrix['Ba']['Ba']['face'], 0, "Ba should be not be face-sharing")
        self.assertEqual(connectivity_matrix['S']['S']['point'], 0, "S should be isolated")
        self.assertEqual(connectivity_matrix['S']['S']['edge'], 0, "S should be isolated")
        self.assertEqual(connectivity_matrix['S']['S']['face'], 0, "S should be isolated")
        self.assertEqual(connectivity_matrix['Ba']['S']['point'], 6, "Ba and S should be point-sharing")
        self.assertEqual(connectivity_matrix['Ba']['S']['edge'], 1, "Ba and S should be edge-sharing")
        self.assertEqual(connectivity_matrix['Ba']['S']['face'], 0, "Ba and S should not be face-sharing")

        for connectivity_type in connectivity_matrix['Ba']['S'].keys():
            self.assertEqual(connectivity_matrix['Ba']['S'][connectivity_type]*barite_structure.composition['Ba'],
                             connectivity_matrix['S']['Ba'][connectivity_type]*barite_structure.composition['S'],
                             "Total number of sharing instances between 'Ba' and 'S' "
                             "should be same as total number of sharing"
                             "instances between 'S' and 'Ba'")

        for poly in connectivity_polyhedra:
            self.assertIsInstance(poly, Polyhedra, "List of polyhedra includes a non-polyhedra element")
    def test_zircon(self):
        """Testing coordination and connectivity matrix for zircon structure ZrSiO4"""

        zircon_structure = Structure.from_file('test_structures/zircon.cif', True, True)
        cn_finder = EffectiveCoordFinder(zircon_structure)
        cns = cn_finder.get_avg_CN(radius=2.6, anions=['O'])
        for cation in cns:
            self.assertTrue(cation == "Zr" or cation == "Si",
                            "Zr and Si polyanions should be the only ions in zircon ZrSiO4")
            if cation == 'Zr':
                self.assertLessEqual(round(cns[cation]), 8,
                                     "Zr should be 8-fold coordinated (effective coordination underestimates)")
            if cation == 'Si':
                self.assertEqual(round(cns[cation]), 4, "Si should be 4-fold coordinated")

        central_species = ['Zr', 'Si']
        peripheral_species = ['O']

        connectivity_matrix, connectivity_polyhedra = \
            get_connectivity_matrix(zircon_structure, False, 2.6, peripheral_species, central_species)
        self.assertIn('Zr', connectivity_matrix.keys(), "Zr cations not found in matrix")
        self.assertIn('Si', connectivity_matrix.keys(), "Si cations not found in matrix")
        self.assertEqual(connectivity_matrix['Zr']['Zr']['point'], 0, "Zr should not be point-sharing")
        self.assertEqual(connectivity_matrix['Zr']['Zr']['edge'], 4, "Zr should be edge-sharing")
        self.assertEqual(connectivity_matrix['Zr']['Zr']['face'], 0, "Zr should not be face-sharing")
        self.assertEqual(connectivity_matrix['Si']['Si']['point'], 0, "Si should be point-sharing")
        self.assertEqual(connectivity_matrix['Si']['Si']['edge'], 0, "Si should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Si']['Si']['face'], 0, "Si should not be face-sharing")
        self.assertEqual(connectivity_matrix['Si']['Zr']['point'], 4, "Zr and Si should be point-sharing")
        self.assertEqual(connectivity_matrix['Si']['Zr']['edge'], 2, "Zr and Si should be edge-sharing")
        self.assertEqual(connectivity_matrix['Si']['Zr']['face'], 0, "Zr and Si should not be face-sharing")

        for connectivity_type in connectivity_matrix['Zr']['Si'].keys():
            self.assertEqual(connectivity_matrix['Zr']['Si'][connectivity_type]*zircon_structure.composition['Zr'],
                             connectivity_matrix['Si']['Zr'][connectivity_type]*zircon_structure.composition['Si'],
                             "Total number of sharing instances between 'Zr' and 'Si' "
                             "should be same as total number of sharing"
                             "instances between 'Si' and 'Zr'")

        for poly in connectivity_polyhedra:
            self.assertIsInstance(poly, Polyhedra, "List of polyhedra includes a non-polyhedra element")
    def test_perovskite(self):
        """Testing coordination and connectivity matrix for perovskite structure SrTiO3"""

        perovskite_structure = Structure.from_file('test_structures/perovskite.cif', True, True)
        cn_finder = EffectiveCoordFinder(perovskite_structure)
        cns = cn_finder.get_avg_CN(radius=3.2, anions=['O'])
        for cation in cns:
            self.assertTrue(cation == "Sr" or cation == "Ti",
                            "Be and Si polyanions should be the only ions in phenacite Be2SiO4")
            if cation == 'Sr':
                self.assertLessEqual(round(cns[cation]), 12,
                                     "Sr should be 12-fold coordinated (effective coordination underestimates)")
            if cation == 'Ti':
                self.assertEqual(round(cns[cation]), 6, "Ti should be 6-fold coordinated")

        central_species = ['Sr', 'Ti']
        peripheral_species = ['O']

        connectivity_matrix, connectivity_polyhedra = \
            get_connectivity_matrix(perovskite_structure, False, 3.2, peripheral_species, central_species)
        self.assertIn('Sr', connectivity_matrix.keys(), "Sr cations not found in matrix")
        self.assertIn('Ti', connectivity_matrix.keys(), "Ti cations not found in matrix")
        self.assertEqual(connectivity_matrix['Sr']['Sr']['point'], 12, "Sr should be point-sharing")
        self.assertEqual(connectivity_matrix['Sr']['Sr']['edge'], 0, "Sr should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Sr']['Sr']['face'], 6, "Sr should not be face-sharing")
        self.assertEqual(connectivity_matrix['Ti']['Ti']['point'], 6, "Ti should be point-sharing")
        self.assertEqual(connectivity_matrix['Ti']['Ti']['edge'], 0, "Ti should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Ti']['Ti']['face'], 0, "Ti should not be face-sharing")
        self.assertEqual(connectivity_matrix['Ti']['Sr']['point'], 0, "Sr and Ti should not be point-sharing")
        self.assertEqual(connectivity_matrix['Ti']['Sr']['edge'], 0, "Sr and Ti should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Ti']['Sr']['face'], 8, "Sr and Ti should only be face-sharing")

        for connectivity_type in connectivity_matrix['Sr']['Ti'].keys():
            self.assertEqual(connectivity_matrix['Sr']['Ti'][connectivity_type]*perovskite_structure.composition['Sr'],
                             connectivity_matrix['Ti']['Sr'][connectivity_type]*perovskite_structure.composition['Ti'],
                             "Total number of sharing instances between 'Sr' and 'Ti' "
                             "should be same as total number of sharing"
                             "instances between 'Ti' and 'Sr'")

        for poly in connectivity_polyhedra:
            self.assertIsInstance(poly, Polyhedra, "List of polyhedra includes a non-polyhedra element")
    def test_spinel(self):
        """Testing coordination and connectivity matrix for spinel structure MgAl2O4"""

        spinel_structure = Structure.from_file('test_structures/spinel.cif', True, True)
        cn_finder = EffectiveCoordFinder(spinel_structure)
        cns = cn_finder.get_avg_CN(radius=2.6, anions=['O'])
        for cation in cns:
            self.assertTrue(cation == "Mg" or cation == "Al",
                            "Mg and Al polyanions should be the only ions in spinel MgAl2O4")
            if cation == 'Mg':
                self.assertEqual(round(cns[cation]), 4, "Mg should be 4-fold coordinated")
            if cation == 'Al':
                self.assertEqual(round(cns[cation]), 6, "Al should be 4-fold coordinated")

        central_species = ['Mg', 'Al']
        peripheral_species = ['O']

        connectivity_matrix, connectivity_polyhedra = \
            get_connectivity_matrix(spinel_structure, False, 2.6, peripheral_species, central_species)
        self.assertIn('Mg', connectivity_matrix.keys(), "Mg cations not found in matrix")
        self.assertIn('Al', connectivity_matrix.keys(), "Al cations not found in matrix")

        self.assertEqual(connectivity_matrix['Mg']['Mg']['point'], 0, "Mg should be point-sharing")
        self.assertEqual(connectivity_matrix['Mg']['Mg']['edge'], 0, "Mg should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Mg']['Mg']['face'], 0, "Mg should not be face-sharing")
        self.assertEqual(connectivity_matrix['Al']['Al']['point'], 0, "Al should be isolated")
        self.assertEqual(connectivity_matrix['Al']['Al']['edge'], 6, "Al should be isolated")
        self.assertEqual(connectivity_matrix['Al']['Al']['face'], 0, "Al should be isolated")
        self.assertEqual(connectivity_matrix['Mg']['Al']['point'], 12, "Mg and Al should be point-sharing")
        self.assertEqual(connectivity_matrix['Mg']['Al']['edge'], 0, "Mg and Al should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Mg']['Al']['face'], 0, "Mg and Al should not be face-sharing")

        for connectivity_type in connectivity_matrix['Mg']['Al'].keys():
            self.assertEqual(connectivity_matrix['Mg']['Al'][connectivity_type]*spinel_structure.composition['Mg'],
                             connectivity_matrix['Al']['Mg'][connectivity_type]*spinel_structure.composition['Al'],
                             "Total number of sharing instances between 'Mg' and 'Al' "
                             "should be same as total number of sharing"
                             "instances between 'Al' and 'Mg'")

        for poly in connectivity_polyhedra:
            self.assertIsInstance(poly, Polyhedra, "List of polyhedra includes a non-polyhedra element")
    def test_k2so4(self):
        """Testing coordination and connectivity matrix for beta-K2SO4 structure"""

        k2so4_structure = Structure.from_file('test_structures/beta-K2SO4.cif', True, True)
        cn_finder = EffectiveCoordFinder(k2so4_structure)
        cns = cn_finder.get_avg_CN(radius=3.2, anions=['O'])
        for cation in cns:
            self.assertTrue(cation == "K" or cation == "S", "Ba and S should be only ions in beta-K2SO4")
            if cation == 'K':
                self.assertEqual(round(cns[cation]), 8, "K should be 8-fold coordinated")
            if cation == 'S':
                self.assertEqual(round(cns[cation]), 4, "S should be 4-fold coordinated")

        central_species = ['K', 'S']
        peripheral_species = ['O']

        connectivity_matrix, connectivity_polyhedra = \
            get_connectivity_matrix(k2so4_structure, False, 3.2, peripheral_species, central_species)
        print connectivity_matrix
        self.assertIn('K', connectivity_matrix.keys(), "K polyhedra not found in beta-K2SO4 matrix")
        self.assertIn('S', connectivity_matrix.keys(), "SO4 polyanions not found in beta-K2SO4 matrix")
        self.assertEqual(connectivity_matrix['K']['K']['point'], 6, "K should be point-sharing")
        self.assertEqual(connectivity_matrix['K']['K']['edge'], 4, "K should be edge-sharing")
        self.assertEqual(connectivity_matrix['K']['K']['face'], 6, "K should be face-sharing")
        self.assertEqual(connectivity_matrix['S']['S']['point'], 0, "S should be isolated")
        self.assertEqual(connectivity_matrix['S']['S']['edge'], 0, "S should be isolated")
        self.assertEqual(connectivity_matrix['S']['S']['face'], 0, "S should be isolated")
        self.assertEqual(connectivity_matrix['S']['K']['point'], 4, "S and K should be point-sharing")
        self.assertEqual(connectivity_matrix['S']['K']['edge'], 7, "S and K should be edge-sharing")
        self.assertEqual(connectivity_matrix['S']['K']['face'], 0, "S and K should not be face-sharing")

        for connectivity_type in connectivity_matrix['K']['S'].keys():
            self.assertEqual(connectivity_matrix['K']['S'][connectivity_type]*k2so4_structure.composition['K'],
                             connectivity_matrix['S']['K'][connectivity_type]*k2so4_structure.composition['S'],
                             "Total number of sharing instances between 'K' and 'S' "
                             "should be same as total number of sharing"
                             "instances between 'S' and 'K'")

        for poly in connectivity_polyhedra:
            self.assertIsInstance(poly, Polyhedra, "List of polyhedra includes a non-polyhedra element")
    def test_calcite(self):
        """Testing coordination and connectivity matrix for calcite structure CaCO3"""

        calcite_structure = Structure.from_file('test_structures/calcite.cif', True, True)
        cn_finder = EffectiveCoordFinder(calcite_structure)
        cns = cn_finder.get_avg_CN(radius=2.5, anions=['O'])
        for cation in cns:
            self.assertTrue(cation == "Ca" or cation == "C", "Ca and C should be the only ions in CaCO3")
            if cation == 'Ca':
                self.assertEqual(round(cns[cation]), 6, "K should be 8-fold coordinated")
            if cation == 'C':
                self.assertEqual(round(cns[cation]), 3, "S should be 4-fold coordinated")

        central_species = ['Ca', 'C']
        peripheral_species = ['O']

        connectivity_matrix, connectivity_polyhedra = \
            get_connectivity_matrix(calcite_structure, False, 2.6, peripheral_species, central_species)

        self.assertIn('Ca', connectivity_matrix.keys(), "Ca polyhedra not found in CaCO3 calcite matrix")
        self.assertIn('C', connectivity_matrix.keys(), "CO3 polyanions not found in CaCO3 calcite matrix")
        self.assertEqual(connectivity_matrix['Ca']['Ca']['point'], 6, "Ca should be point-sharing")
        self.assertEqual(connectivity_matrix['Ca']['Ca']['edge'], 0, "Ca should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Ca']['Ca']['face'], 0, "Ca should not be face-sharing")
        self.assertEqual(connectivity_matrix['C']['C']['point'], 0, "C should be isolated")
        self.assertEqual(connectivity_matrix['C']['C']['edge'], 0, "C should be isolated")
        self.assertEqual(connectivity_matrix['C']['C']['face'], 0, "C should be isolated")
        self.assertEqual(connectivity_matrix['Ca']['C']['point'], 6, "Ca and C should be point-sharing")
        self.assertEqual(connectivity_matrix['Ca']['C']['edge'], 0, "Ca and C should not be edge-sharing")
        self.assertEqual(connectivity_matrix['Ca']['C']['face'], 0, "Ca and C should not be face-sharing")

        for connectivity_type in connectivity_matrix['Ca']['C'].keys():
            self.assertEqual(connectivity_matrix['Ca']['C'][connectivity_type]*calcite_structure.composition['Ca'],
                             connectivity_matrix['C']['Ca'][connectivity_type]*calcite_structure.composition['C'],
                             "Total number of sharing instances between 'Ca' and 'C' "
                             "should be same as total number of sharing"
                             "instances between 'C' and 'Ca'")

        for poly in connectivity_polyhedra:
            self.assertIsInstance(poly, Polyhedra, "List of polyhedra includes a non-polyhedra element")
    def test_sio2(self):
        """Testing coordination and connectivity matrix for SiO2 structure"""

        sio2_structure = Structure.from_file('test_structures/SiO2.cif', True, True)

        cn_finder = EffectiveCoordFinder(sio2_structure)
        cns = cn_finder.get_avg_CN(radius=2.6, anions=['O'])
        for cation in cns:
            self.assertTrue(cation == "Si", "Si should be the only ions in SiO2 structure")
            if cation == 'Si':
                self.assertEqual(round(cns[cation]), 4, "Si should be 6-fold coordinated")

        central_species = ['Si']
        peripheral_species = ['O']

        connectivity_matrix, connectivity_polyhedra = \
            get_connectivity_matrix(sio2_structure, False, 2.6, peripheral_species, central_species)
        self.assertIn('Si', connectivity_matrix.keys(), "Si polyhedra not found in SiO2 matrix")
        self.assertEqual(connectivity_matrix['Si']['Si']['point'], 4, "Si should not be point-sharing")
        self.assertEqual(connectivity_matrix['Si']['Si']['edge'], 0, "Si should be edge-sharing")
        self.assertEqual(connectivity_matrix['Si']['Si']['face'], 0, "Si should not be face-sharing")

        for poly in connectivity_polyhedra:
            self.assertIsInstance(poly, Polyhedra, "List of polyhedra includes a non-polyhedra element")
    def test_rocksalt(self):
        """Testing coordination and connectivity matrix for rock salt structure NaCl"""

        rocksalt_structure = Structure.from_file('test_structures/rocksalt.cif', True, True)

        cn_finder = EffectiveCoordFinder(rocksalt_structure)
        cns = cn_finder.get_avg_CN(radius=3.0, anions=['Cl'])
        for cation in cns:
            self.assertTrue(cation == "Na", "Na should be the only ions in rocksalt NaCl structure")
            if cation == 'Na':
                self.assertEqual(round(cns[cation]), 6, "Na should be 6-fold coordinated")

        central_species = ['Na']
        peripheral_species = ['Cl']

        connectivity_matrix, connectivity_polyhedra = \
            get_connectivity_matrix(rocksalt_structure, False, 3.0, peripheral_species, central_species)
        self.assertIn('Na', connectivity_matrix.keys(), "Na polyhedra not found in NaCl matrix")
        self.assertEqual(connectivity_matrix['Na']['Na']['point'], 6, "Na should not be point-sharing")
        self.assertEqual(connectivity_matrix['Na']['Na']['edge'], 12, "Na should be edge-sharing")
        self.assertEqual(connectivity_matrix['Na']['Na']['face'], 0, "Na should not be face-sharing")

        for poly in connectivity_polyhedra:
            self.assertIsInstance(poly, Polyhedra, "List of polyhedra includes a non-polyhedra element")