def test_can_load_crystal_data_from_multi_data_block_cif(self):
        p = CIFParser("tests/functional/static/valid_cifs/multi_data_block.cif")
        p.parse()

        # basic checks that correct number of data items were caught
        assert len(p.data_blocks) == 20
        assert p.data_blocks[0].header == "data_CSD_CIF_ACAGUG"
        assert p.data_blocks[11].header == "data_CSD_CIF_AHUKOD"
        data_items_1 = p.data_blocks[0].data_items
        data_items_2 = p.data_blocks[11].data_items
        assert len(data_items_1) == 39
        assert len(data_items_2) == 41

        # check loops operated correctly
        assert len(data_items_1["atom_site_label"]) == 119
        assert len(data_items_2["atom_site_label"]) == 69
        assert data_items_1["atom_type_radius_bond"] == \
            ["0.68", "0.23", "1.35", "0.68", "1.02"]
        assert data_items_2["atom_type_radius_bond"] == \
            ["0.68", "0.23", "1.21", "0.64", "1.40", "1.02"]

        # check semicolon text fields assigned correctly
        assert data_items_1["refine_special_details"] == \
            "One of the water molecules is disordered over two sites."
        assert data_items_2["chemical_name_systematic"] == \
            ("tris(bis(Ethylenedithio)tetrathiafulvalene) \n"
             "2,5-difluoro-1,4-bis(iodoethynyl)benzene bromide")

        # check a few inline data items
        assert data_items_1["journal_year"] == "2001"
        assert data_items_1["exptl_crystal_colour"] == "dark brown"
        assert data_items_2["journal_name_full"] == "J.Mater.Chem. "
        assert data_items_2["cell_angle_gamma"] == "76.35(2)"
 def test_parse_method_calls_in_correct_order(self):
     p = mock.Mock(spec=CIFParser)
     data_block = mock.Mock(spec=DataBlock)
     p.data_blocks = [data_block]
     CIFParser.parse(p)
     expected_calls = [
         mock.call._strip_comments_and_blank_lines(),
         mock.call._extract_data_blocks(),
         mock.call.extract_data_items(SEMICOLON_DATA_ITEM),
         mock.call.extract_data_items(INLINE_DATA_ITEM),
         mock.call.extract_loop_data_items()
     ]
     assert p.method_calls + data_block.method_calls == expected_calls
    def test_can_load_crystal_data_from_vesta_cif(self):
        p = CIFParser("tests/functional/static/valid_cifs/calcite_vesta.cif")
        p.parse()

        # basic checks that correct number of data items were caught
        assert p.data_blocks[0].header == 'data_VESTA_phase_1'
        assert len(p.data_blocks) == 1
        data_items = p.data_blocks[0].data_items
        assert len(data_items) == 25

        # check the loops operated correctly
        pos = data_items["symmetry_equiv_pos_as_xyz"]
        assert len(pos) == 36
        assert data_items["atom_site_occupancy"] == ["1.0", "1.0", "1.0"]
        assert data_items["atom_site_aniso_label"] == ["Ca1", "C1", "O1"]

        # check a few inline data items
        assert data_items["cell_length_a"] == "4.9900(2)"
        assert data_items["symmetry_space_group_name_H-M"] == "R -3 c"
        assert data_items["symmetry_Int_Tables_number"] == "167"
    def test_can_load_crystal_data_from_icsd_cif(self):
        p = CIFParser("tests/functional/static/valid_cifs/calcite_icsd.cif")
        p.parse()

        # basic checks that correct number of data items were caught
        assert p.data_blocks[0].header == "data_18166-ICSD"
        assert len(p.data_blocks) == 1
        data_items = p.data_blocks[0].data_items
        assert len(data_items) == 51

        # check the loops operated correctly
        ids = data_items["symmetry_equiv_pos_site_id"]
        assert ids == [str(i) for i in range(1, 37)]
        assert data_items["atom_site_label"] == ["Ca1", "C1", "O1"]
        assert data_items["atom_site_aniso_U_22"] == ["0.01775(90)"]
        assert data_items["publ_author_name"] == \
            ["Chessin, H.", "Hamilton, W.C.", "Post, B."]

        # check a few inline data items
        assert data_items["cell_length_a"] == "4.9900(2)"
        assert data_items["chemical_name_mineral"] == "Calcite"
        assert data_items["cell_formula_units_Z"] == "6"