def test_semicolon_data_items_are_assigned(self, mocker):
        contents = [
            "_data_name_1",
            ";",
            "very long semicolon text field with many words",
            ";",
            "_data_name_2 data_value_2",
            "_data_name_3",
            ";",
            "semicolon text field with",
            "two lines of text",
            ";"
            "_data_name_4 data_value_4",
            "_data_name_5",
            ";",
            "semicolon text ; field containing ;;; semicolons",
            ";"
        ]
        data_block = DataBlock('data_block_header', "\n".join(contents))
        semicolon_data_items = OrderedDict([
            ("data_name_1", "very long semicolon text field with many words"),
            ("data_name_3", "semicolon text field with\ntwo lines of text"),
            ("data_name_5", "semicolon text ; field containing ;;; semicolons")])
        strip_quotes_mock = mocker.patch("diffraction.cif.cif.strip_quotes",
                                         side_effect=lambda data_value: data_value)

        data_block.extract_data_items(SEMICOLON_DATA_ITEM)
        expected_calls = [mock.call(data_value)
                          for data_value in semicolon_data_items.values()]
        assert strip_quotes_mock.call_args_list == expected_calls
        assert data_block.data_items == semicolon_data_items
    def test_inline_declared_variables_are_stripped_out(self):
        contents = [
            "_data_name_1 value",
            "_DatA_name-two another_value",
            "loop_",
            "_loop_data_name_A",
            "_loop_data_name_B",
            "value_A1 'value A2'",
            "value-B1 value_B2",
            "_one_more_data_item_ one_more_data_value"
        ]
        data_block = DataBlock('data_block_header', "\n".join(contents))
        expected_remaining_data = "\n" + "\n".join(contents[2:7])

        data_block.extract_data_items(INLINE_DATA_ITEM)
        assert data_block.raw_data == expected_remaining_data
    def test_inline_declared_variables_are_assigned(self, mocker):
        data_items = OrderedDict([
            ("data_name", "value"),
            ("four_word_data_name", "four_word_data_value"),
            ("data_name-with_hyphens-in-it", "some_data_value"),
            ("data_name_4", "'data value inside single quotes'"),
            ("data_name_5", '"data value inside double quotes"')])
        contents = ['_{} {}'.format(data_name, data_value)
                    for data_name, data_value in data_items.items()]
        data_block = DataBlock('data_block_header', "\n".join(contents))
        strip_quotes_mock = mocker.patch("diffraction.cif.cif.strip_quotes",
                                         side_effect=lambda data_value: data_value)

        data_block.extract_data_items(INLINE_DATA_ITEM)
        expected_calls = [mock.call(data_value) for data_value in data_items.values()]
        assert strip_quotes_mock.call_args_list == expected_calls
        assert data_block.data_items == data_items
    def test_semicolon_data_items_are_stripped_out(self):
        contents = [
            "_data_name_1 data_value_1",
            "_data_name_2",
            ";",
            "semicolon text field ",
            ";",
            "_data_name_3 data_value_3",
            "_data_name_4",
            ";",
            "semicolon text field with",
            "two lines of text",
            ";"
        ]
        data_block = DataBlock('data_block_header', "\n".join(contents))
        expected_remaining_data = "\n".join([contents[0], contents[5]])

        data_block.extract_data_items(SEMICOLON_DATA_ITEM)
        assert data_block.raw_data == expected_remaining_data
    def test_variables_declared_in_loop_are_assigned(self, mocker):
        data_items = {
            "number": ["1", "2222", "3456789"],
            "symbol": [".", "-", "?"],
            "number_and_symbol": ["-1.0", "2.0(3)", "3.0e10"],
            "letter": ["a", "bbb", "cdefghi"],
            "letter_and_symbol": ["x?*", "abc_(rt)", "sin(3*10^3)"],
            "single_quotes": ["'x y z'", "'s = 3.2(3)'", "'x -y+2/3 z-0.876'"],
            "double_quotes": ['"a b c"', '"s = 4.6(1)"', '"x-1/3 y+0.34 -z"']
        }
        # convert the data items into corresponding CIF input
        contents = ["loop_"]
        data_names = data_items.keys()
        contents.extend('_' + data_name for data_name in data_names)
        contents.extend('{} {} {} {} {} {} {}'.format(
            *[data_items[data_name][i] for data_name in data_names])
            for i in range(3))
        data_block = DataBlock('data_block_header', "\n".join(contents))
        strip_quotes_mock = mocker.patch("diffraction.cif.cif.strip_quotes",
                                         side_effect=lambda data_value: data_value)

        data_block.extract_loop_data_items()
        assert strip_quotes_mock.call_count == 21
        assert data_block.data_items == data_items