def test_write_vocable_file (self):
		print('current working directory:', os.getcwd())
		
		vocable_file_path = self.create_test_vocables_file()
		print('--- using vocable file path:', vocable_file_path)
		
		list_of_words = ['你','好','吗','我','很']
		words_list_file_path = self.create_test_words_file(list_of_words)
		
		xsd_file_path = self.project_directory + 'res/xld-vocables-schema.xsd'
		
		attribute_name = 'chapters'
		attribute_value = 'HSK1-2012'
		words_attribute_name = 'secondLanguageTranslations'
		
		
		xml_parser = XMLParser()
		xld_attribute_adder = XLDAttributeAdder(vocable_file_path, xsd_file_path, words_list_file_path)
		
		xml_root = xml_parser.get_xml_element_tree_root(xsd_file_path, vocable_file_path)
		
		xld_attribute_adder.add_values_to_attribute_of_vocables(attribute_name, attribute_value, words_attribute_name)
		VocableFileWriter.write(VocableFileWriter, xsd_file_path, vocable_file_path, xml_root)
		
		assert os.path.isfile(vocable_file_path), 'no file exists'
		
		# if the xml is not valid anymore when reading the file, the write function might have done something wrong
		try:
			xml_root = xml_parser.get_xml_element_tree_root(xsd_file_path, vocable_file_path)
		except XMLParserException as exception:
			assert False
		else:
			assert True
	def test_add_values_to_attribute_of_vocables (self):
		xml_parser = XMLParser()
		
		list_of_words = ['你','好','吗','我','很']
		
		test_word_list_file_path = self.create_test_words_file(list_of_words)
		test_vocable_file_path = self.create_test_vocables_file()
		xsd_file_path = self.project_directory + 'res/xld-vocables-schema.xsd'
		
		# TODO: check if the chapter is not in the vocables already
		# attribute value hasn't been added yet, so it should not already be in the vocables
		# this assertion is necessary to check if the add_values_to_attribute_of_vocables really changes something
		xml_root = xml_parser.get_xml_element_tree_root(xsd_file_path, test_vocable_file_path)
		
		for vocable in xml_root:
			vocable_word_attribute_text = vocable.find(self.words_attribute_name).text
			# is this vocable one of the world list?
			if WordListHelper.is_in_list(WordListHelper, vocable_word_attribute_text, list_of_words, allow_whitespace_characters=True):
				print(vocable_word_attribute_text, 'is in word list')
				attribute_text = vocable.find(self.attribute_name).text
				# does this vocable have the added attribute value?
				regex = '\s*' + self.attribute_value + '\s*$'
				print('regex:', regex)
				print('attribute_text:', attribute_text)
				assert re.search(regex, attribute_text) is None, 'attribute value has already added to vocable ' + vocable.find(self.words_attribute_name).text
		
		
		# now add the attribute value
		xld_attribute_adder = XLDAttributeAdder(test_vocable_file_path, xsd_file_path, test_word_list_file_path)
		xld_attribute_adder.add_values_to_attribute_of_vocables(self.attribute_name, self.attribute_value, self.words_attribute_name)
		VocableFileWriter.write(VocableFileWriter, xsd_file_path, test_vocable_file_path, xld_attribute_adder.xml_root)
		
		
		# check the vocables again, to see if something has been added
		xml_root = xml_parser.get_xml_element_tree_root(xsd_file_path, test_vocable_file_path)
		
		for vocable in xml_root:
			vocable_word_attribute_text = vocable.find(self.words_attribute_name).text
			# is this vocable one of the world list?
			if WordListHelper.is_in_list(WordListHelper, vocable_word_attribute_text, list_of_words, allow_whitespace_characters=True):
				print(vocable_word_attribute_text, 'is in word list')
				attribute_text = vocable.find(self.attribute_name).text
				# does this vocable have the added attribute value?
				regex = '\s*' + self.attribute_value + '\s*$'
				print('regex:', regex)
				print('attribute_text:', attribute_text)
				assert re.search(regex, attribute_text) is not None, 'attribute value has not been added to vocable ' + vocable.find(self.words_attribute_name).text
	def test_write_vocable_file_failing (self):
		print('current working directory:', os.getcwd())
		
		vocable_file_path = self.create_test_vocables_file()
		print('--- using vocable file path:', vocable_file_path)
		
		list_of_words = ['你','好','吗','我','很']
		words_list_file_path = self.create_test_words_file(list_of_words)
		
		xsd_file_path = self.project_directory + 'res/xld-vocables-schema.xsd'
		
		attribute_name = 'chapters'
		attribute_value = 'HSK1-2012'
		words_attribute_name = 'secondLanguageTranslations'
		
		
		xml_parser = XMLParser()
		xld_attribute_adder = XLDAttributeAdder(vocable_file_path, xsd_file_path, words_list_file_path)
		
		xml_root = xml_parser.get_xml_element_tree_root(xsd_file_path, vocable_file_path)
		
		xld_attribute_adder.add_values_to_attribute_of_vocables(attribute_name, attribute_value, words_attribute_name)
		
		# adding invalid tags with texts
		invalid_vocable_element = etree.SubElement(xml_root, 'vocable')
		abc_element = etree.SubElement(invalid_vocable_element, 'abc')
		abc_element.text = 'abc'
		unknowntag_element = etree.SubElement(invalid_vocable_element, 'unknowntag')
		unknowntag_element.text = 'unknowntag'
		
		# the tree should be invalid at this point
		assert xml_parser.validate_tree(xsd_file_path, xml_root) == False, 'Your validation does not work properly.'
		
		# if the xml is not valid anymore when reading the file, the write function might have done something wrong
		try:
			VocableFileWriter.write(VocableFileWriter, xsd_file_path, vocable_file_path, xml_root)
		except XMLInvalidException as exception:
			assert True
		else:
			assert False
		
		
		assert os.path.isfile(vocable_file_path), 'no file exists'
		
		xml_root = xml_parser.get_xml_element_tree_root(xsd_file_path, vocable_file_path)
def main():

    vocable_file_path = input('Vocable file path:')
    xsd_file_path = input('XSD file path:')
    words_file_path = input('Word list file path:')

    attribute_name = input('Attribute name:')
    words_attribute_name = input('Words attribute name:')
    attribute_value = input('Attribute value:')

    if vocable_file_path == '':
        vocable_file_path = '/home/xiaolong/Development/PycharmProjects/xld-attribute-adder/res/vocables.xml'
    if xsd_file_path == '':
        xsd_file_path = '/home/xiaolong/Development/PycharmProjects/xld-attribute-adder/res/xld-vocables-schema.xsd'
    if words_file_path == '':
        words_file_path = '/home/xiaolong/Development/PycharmProjects/xld-attribute-adder/res/HSK2'
    if attribute_name == '': attribute_name = 'chapters'
    if words_attribute_name == '':
        words_attribute_name = 'secondLanguageTranslations'
    if attribute_value == '': attribute_value = 'HSK2-2012'

    print('inputs received:\n')
    print('vocable file path: ', vocable_file_path, sep=' ', end='\n')
    print('xsd file path: ', xsd_file_path, sep=' ', end='\n')
    print('words file path: ', words_file_path, sep=' ', end='\n')
    print('attribute name: ', attribute_name, sep=' ', end='\n')
    print('words attribute name: ', words_attribute_name, sep=' ', end='\n')
    print('attribute_value: ', attribute_value, sep=' ', end='\n')

    xld_attribute_adder = XLDAttributeAdder(vocable_file_path, xsd_file_path,
                                            words_file_path)

    xld_attribute_adder.add_values_to_attribute_of_vocables(
        attribute_name, attribute_value, words_attribute_name)
    VocableFileWriter.write(VocableFileWriter, xsd_file_path,
                            vocable_file_path, xld_attribute_adder.xml_root)