import pytest
from calculate.templates.format.base_format import Format


@pytest.mark.base
class TestJoinMethod:
    def test_if_inputs_are_dictionaries_with_string_keys_without_any_action_marks__the_dictionaties_just_merged(self, StringDictionaries):
        BaseObject = Format([])
        Original, Template, Result = StringDictionaries
        BaseObject._join(Original, Template, join_before=False)
        assert Original == Result

    def test_if_inputs_are_dictionaries_with_tuple_keys_without_any_action_marks_as_their_keys__the_dictionaries_just_merged(self, TupleDictionaries):
        BaseObject = Format([])
        Original, Template, Result = TupleDictionaries
        BaseObject._join(Original, Template, join_before=False)
        assert Original == Result

    def test_if_inputs_are_dictionaries_with_same_sections_which_contain_different_parameters__a_section_from_the_template_added_to_the_same_section_of_original_dictionary(self, MergeSectionDictionaries):
        BaseObject = Format([])
        Original, Template, Result = MergeSectionDictionaries
        BaseObject._join(Original, Template, join_before=False)
        assert Original == Result

    def test_if_inputs_are_dictionaries_with_parameters_with_same_name_in_same_section__parameters_values_in_original_dictionary_changed_to_values_from_template(self, ChangeParameterDictionaries):
        BaseObject = Format([])
        Original, Template, Result = ChangeParameterDictionaries
        BaseObject._join(Original, Template, join_before=False)
        assert Original == Result

    def test_if_input_template_dictionary_has_delete_mark_for_section__section_will_be_deleted(self, DeleteSectionDictionaries):
        BaseObject = Format([])
        Original, Template, Result = DeleteSectionDictionaries
        BaseObject._join(Original, Template, join_before=False)
        assert Original == Result

    def test_if_input_template_dictionary_has_replace_mark_for_section__section_will_be_deleted(self, ReplaceSectionDictionaries):
        BaseObject = Format([])
        Original, Template, Result = ReplaceSectionDictionaries
        BaseObject._join(Original, Template, join_before=False)
        assert Original == Result

    def test_if_input_template_dictionary_has_delete_mark_for_parameter__parameter_will_be_deleted(self, DeleteParameterDictionaries):
        BaseObject = Format([])
        Original, Template, Result = DeleteParameterDictionaries
        BaseObject._join(Original, Template, join_before=False)
        assert Original == Result

    def test_if_input_dictionaries_have_no_sections_and_have_only_parameter_lines__it_will_be_processed_correctly(self, DictionariesWithoutSections):
        BaseObject = Format([])
        Original, Template, Result = DictionariesWithoutSections
        BaseObject._join(Original, Template, join_before=False)
        assert Original == Result


@pytest.mark.base
class TestLogicLinesMethod:
    def test_if_input_is_text_document_the_method_returns_list_of_its_lines(self):
        with open('./tests/templates/format/testfiles/base/'
                  'logic_lines_test.txt', 'r') as InputFile:
            InputText = InputFile.read()

        processingMethods = []
        OutputLines = ['First string of test file.',
                       'Second string of test file.',
                       'Third string of test file.',
                       'Fourth string of test file.']

        BaseObject = Format(processingMethods)
        InputLines = BaseObject._get_list_of_logic_lines(InputText)
        assert InputLines == OutputLines

    def test_if_lines_in_document_divided_using_backslash_as_continuation_symbol__method_returns_list_of_full_lines(self):
        with open('./tests/templates/format/testfiles/base/'
                  'logic_lines_test_input.txt', 'r') as InputFile:
            InputText = InputFile.read()

        with open('./tests/templates/format/testfiles/base/'
                  'logic_lines_test_output.txt', 'r') as OutputFile:
            OutputText = OutputFile.read()

        BaseObject = Format([])
        InputLines = BaseObject._get_list_of_logic_lines(InputText)
        OutputLines = BaseObject._get_list_of_logic_lines(OutputText)
        assert InputLines == OutputLines
