def test_error_if_missing_inline_data_name(self, invalid_line):
        contents = [
            "_data_name_1 value_1",
            "_data_name_2 value_2",
        ]
        contents.insert(1, invalid_line)
        v = CIFValidator("\n".join(contents))

        with pytest.raises(CIFParseError) as exception_info:
            v.validate()
        assert str(exception_info.value) == \
            'Missing inline data name on line 2: "{}"'.format(invalid_line)
    def test_error_if_unmatched_data_items_in_loop(self, invalid_line):
        contents = [
            "loop_",
            "_data_name_A",
            "_data_name_B ",
            "value_A1 value_B1"
        ]
        contents.insert(4, invalid_line)
        v = CIFValidator("\n".join(contents))

        with pytest.raises(CIFParseError) as exception_info:
            v.validate()
        assert str(exception_info.value) == \
            ('Unmatched data values to data names in loop '
             'on line 5: "{}"'.format(invalid_line))
    def test_error_if_invalid_inline_data_value(self):
        contents = [
            "_data_name_1 value_1",
            "_data_name_2 ",
            "_data_name_3 value_3"
        ]

        # test when final line of file
        v = CIFValidator("\n".join(contents[:2]))

        with pytest.raises(CIFParseError) as exception_info:
            v.validate()
        assert str(exception_info.value) == \
            'Invalid inline data value on line 2: "_data_name_2 "'

        # test when followed by another line
        v = CIFValidator("\n".join(contents))

        with pytest.raises(CIFParseError) as exception_info:
            v.validate()
        assert str(exception_info.value) == \
            'Invalid inline data value on line 2: "_data_name_2 "'
    def test_error_if_semicolon_data_item_not_closed(self):
        contents = [
            "_data_name_1",
            ";",
            "# some comment inside the text field",
            "Unclosed text field",
            "_data_item_2"
        ]
        # test when field is terminated by end of file
        v = CIFValidator("\n".join(contents[:4]))

        with pytest.raises(CIFParseError) as exception_info:
            v.validate()
        assert str(exception_info.value) == \
            'Unclosed semicolon text field on line 4: "Unclosed text field"'

        # test when field is terminated by another data item
        v = CIFValidator("\n".join(contents))

        with pytest.raises(CIFParseError) as exception_info:
            v.validate()
        assert str(exception_info.value) == \
            'Unclosed semicolon text field on line 4: "Unclosed text field"'
 def test_valid_syntax_raises_no_exception(self, valid_contents):
     v = CIFValidator("\n".join(valid_contents))
     assert v.validate() == True