class TestSortingViewModelFakeLogger(unittest.TestCase):
    def setUp(self):
        self.view_model = SortingViewModel(FakeLogger())

    def test_logger_check_input_array(self):
        self.view_model.set_input_array('0.25 3.2 5.4 5')
        self.assertEqual('Input array: 0.25 3.2 5.4 5',
                         self.view_model.logger.get_last_log())

    def test_logger_check_success_result(self):
        self.view_model.set_input_array('0.25 3.2 5.4 5')
        self.view_model.sort_btn_click()
        self.assertEqual([
            'Input array: 0.25 3.2 5.4 5', 'Start reading the array',
            'Start sorting', 'Sorting is OK', 'Result array: 0.25 3.2 5 5.4',
            'Success'
        ], self.view_model.logger.get_logs())

    def test_logger_check_failed_result(self):
        self.view_model.set_input_array('s d 1 5')
        self.view_model.sort_btn_click()
        self.assertEqual([
            'Input array: s d 1 5', 'Start reading the array', 'Start sorting',
            'Failed'
        ], self.view_model.logger.get_logs())
class GUIView:

    view_model = SortingViewModel()

    def __init__(self):
        self.root = tk.Tk()
        self.root.title('Batcher sorting')
        self.root.geometry('900x300')
        self.root.resizable(width=False, height=False)

        self.frame = tk.Frame(self.root)
        self.start_message = tk.Label(self.root, text="Enter array elements separated by spaces")
        self.input_array_label = tk.Label(self.root, text="Input array of numbers or characters:")
        self.input_array = tk.Entry(self.root, width=100)
        self.sort_btn = tk.Button(self.root, text="Sort", bg='#6dcae8')
        self.sorted_array_label = tk.Label(self.root, text="Sorted array:")
        self.sorted_array = tk.Entry(self.root, width=100)

        self.set_weight_to_grid()
        self.bind_events()
        self.root.mainloop()

    def set_weight_to_grid(self):
        self.root.grid_rowconfigure(1, minsize=30)
        self.root.grid_rowconfigure(3, minsize=30)
        self.root.grid_rowconfigure(5, minsize=30)
        self.frame.place(relx=0.2, rely=0.2, relwidth=0.8, relheight=0.8)
        self.start_message.grid(row=0, column=0, stick='wens', padx=5, pady=5)
        self.input_array_label.grid(row=2, column=0, stick='wens', padx=5, pady=5)
        self.input_array.grid(row=2, column=1, stick='wens', padx=5, pady=5)
        self.sort_btn.grid(row=4, column=0, stick='wens', padx=5, pady=5)
        self.sorted_array_label.grid(row=6, column=0, stick='wens', padx=5, pady=5)
        self.sorted_array.grid(row=6, column=1, stick='wens', padx=5, pady=5)

    def bind_events(self):
        self.input_array.bind('<KeyRelease>', self.input_array_changed)
        self.sort_btn.bind('<Button-1>', self.sort_btn_clicked)

    def input_array_changed(self, event):
        self.mvvm_bind()
        self.mvvm_back_bind()

    def sort_btn_clicked(self, event):
        self.mvvm_bind()
        self.view_model.sort_btn_clicked()
        self.mvvm_back_bind()

    def mvvm_bind(self):
        self.view_model.set_input_array(self.input_array.get())

    def mvvm_back_bind(self):
        self.sort_btn.config(
            state=self.view_model.get_sort_btn_state())
        self.sorted_array.delete(0, tk.END)
        self.sorted_array.insert(tk.END, self.view_model.get_sorted_array())
 def setUp(self):
     self.view_model = SortingViewModel()
 def setUp(self):
     self.view_model = SortingViewModel(FakeLogger())
class TestSortingViewModel(unittest.TestCase):
    def setUp(self):
        self.view_model = SortingViewModel()

    def test_correct_input_num_check_btn_result(self):
        self.view_model.set_input_array('1 9 6 6 4 5 8 25')
        self.view_model.sort_btn_click()
        self.assertEqual('OK', self.view_model.get_sort_btn_clicked_result())

    def test_correct_sorting_numbers(self):
        self.view_model.set_input_array('1 9 6 6 4 5 8 25')
        self.view_model.sort_btn_click()
        self.assertEqual('1 4 5 6 6 8 9 25',
                         self.view_model.get_sorted_array())

    def test_incorrect_input_check_btn_result1(self):
        self.view_model.set_input_array('1 9 a s 4 5 8 25')
        self.view_model.sort_btn_click()
        self.assertEqual('Error',
                         self.view_model.get_sort_btn_clicked_result())

    def test_correct_input_char_check_btn_result(self):
        self.view_model.set_input_array('a s y f b')
        self.view_model.sort_btn_click()
        self.assertEqual('OK', self.view_model.get_sort_btn_clicked_result())

    def test_correct_sorting_characters(self):
        self.view_model.set_input_array('a s y f b')
        self.view_model.sort_btn_click()
        self.assertEqual('a b f s y', self.view_model.get_sorted_array())

    def test_incorrect_input_check_btn_result2(self):
        self.view_model.set_input_array('s d 1 5')
        self.view_model.sort_btn_click()
        self.assertEqual('Error',
                         self.view_model.get_sort_btn_clicked_result())

    def test_correct_input_1_num_check_btn_result(self):
        self.view_model.set_input_array('9')
        self.view_model.sort_btn_click()
        self.assertEqual('OK', self.view_model.get_sort_btn_clicked_result())

    def test_correct_sorting_1_numb(self):
        self.view_model.set_input_array('9')
        self.view_model.sort_btn_click()
        self.assertEqual('9', self.view_model.get_sorted_array())

    def test_correct_input_float_num_check_btn_result(self):
        self.view_model.set_input_array('0.25 3.2 5.4 5')
        self.view_model.sort_btn_click()
        self.assertEqual('OK', self.view_model.get_sort_btn_clicked_result())

    def test_correct_sorting_float_numbers(self):
        self.view_model.set_input_array('0.25 3.2 5.4 5')
        self.view_model.sort_btn_click()
        self.assertEqual('0.25 3.2 5 5.4', self.view_model.get_sorted_array())

    def test_check_input_array(self):
        self.view_model.set_input_array('0.25 3.2 5.4 5')
        self.assertEqual('0.25 3.2 5.4 5', self.view_model.get_input_array())