def test_get_empty_value_2(self): rang = RangeViewModel() self.assertEqual(rang.get_value_2_string(), '')
def test_set_range_to_value_2(self): rang = RangeViewModel() rang.set_value_2('[1,3]') self.assertEqual(rang.get_value_2_string(), '[1,3]')
def test_set_value_1_wrong_format(self): rang = RangeViewModel() with self.assertRaises(ValueError): rang.set_value_1('[1, 3]')
def test_set_value_1_range_with_incorrect_end_points(self): rang = RangeViewModel() with self.assertRaises(ValueError): rang.set_value_1('[3, 1]')
def test_can_set_operation(self): rang = RangeViewModel() rang.set_operation(operation=Operation.EQUALS) self.assertEqual(rang.get_operation(), Operation.EQUALS)
class View(ttk.Frame): N_LOG_MESSAGES_TO_DISPLAY = 9 view_model = RangeViewModel() def __init__(self): self.view_model.set_operation(Operation.CONTAINS) ttk.Frame.__init__(self) self.master.title("Range") self.master.geometry("450x300") self.value_1_label = ttk.Label(text="Range", font="Arial 16") self.value_1_label.grid(row=0, column=0) self.value_1_entry = ttk.Entry() self.value_1_entry.grid(row=0, column=1) self.operation_combobox = ttk.Combobox(values=Operation.ALL, state="readonly", justify=tk.CENTER, width="12") self.operation_combobox.grid(row=1, column=1, pady=(10, 10)) self.value_2_label = ttk.Label(text="Value/Set/Range", font="Arial 16") self.value_2_label.grid(row=2, column=0, padx=(10, 10)) self.value_2_entry = ttk.Entry() self.value_2_entry.grid(row=2, column=1, pady=(10, 10)) self.res_button = ttk.Button(text="Result") self.res_button.grid(row=3, column=0) self.result_entry = ttk.Entry() self.result_entry.insert(0, '') self.result_entry.configure(state='readonly') self.result_entry.grid(row=3, column=1, columnspan=3) self.lbl_result = tk.Label(text="Here will be result") self.lbl_result.grid(row=4, column=0, columnspan=3) self.bind_events() self.mvvm_bind() self.__update_logs() def bind_events(self): self.operation_combobox.bind('<<ComboboxSelected>>', self.operation_changed) self.res_button.bind('<Button-1>', self.result_clicked) def operation_changed(self, event): self.view_model.set_operation(self.operation_combobox.get()) self.value_1_entry.configure(state=tk.NORMAL) if self.view_model.get_value_2_enabled(): self.value_2_entry.configure(state=tk.NORMAL) else: self.value_2_entry.configure(state=tk.DISABLED) self.__update_logs() def result_clicked(self, event): try: self.mvvm_back_bind() self.view_model.make_operation() except Exception as exception: self.__update_result(exception) return self.mvvm_bind() def mvvm_bind(self): self.update_text(self.value_1_entry, self.view_model.get_value_1_string()) self.operation_combobox.set(self.view_model.get_operation()) self.update_text(self.value_2_entry, self.view_model.get_value_2_string()) self.__update_result(self.view_model.get_result_string()) if self.view_model.get_value_2_enabled(): self.value_1_entry.configure(state=tk.NORMAL) else: self.value_1_entry.configure(state=tk.DISABLED) def mvvm_back_bind(self): self.view_model.clear_result() self.view_model.set_operation(self.operation_combobox.get()) self.view_model.set_value_1(self.value_1_entry.get()) self.view_model.set_value_2(self.value_2_entry.get()) @staticmethod def update_text(obj, text): obj.delete(0, tk.END) obj.insert(0, text) def __update_logs(self): logger_text = \ '\n'.join(self.view_model.logger.get_log_messages()[:-self.N_LOG_MESSAGES_TO_DISPLAY:-1]) self.lbl_result.config(text=logger_text) def __update_result(self, text): self.result_entry.configure(state=tk.NORMAL) self.update_text(self.result_entry, text) self.result_entry.configure(state=tk.DISABLED) self.__update_logs()
class TestViewModelFakeLogging(unittest.TestCase): def setUp(self): self.view_model = RangeViewModel(FakeLogger()) def test_logging_init(self): self.assertEqual('RangeViewModel started', self.view_model.logger.get_last_message()) def test_logging_set_first_value(self): self.view_model.set_value_1('[1,5)') self.assertEqual('Set value 1: [1,5)', self.view_model.logger.get_last_message()) def test_logging_set_first_value_error(self): try: self.view_model.set_value_1('[1,5') except ValueError: self.assertEqual('Set value 1 exc: Input error: wrong format', self.view_model.logger.get_last_message()) def test_logging_set_second_value(self): self.view_model.set_value_2('[1,5)') self.assertEqual('Set value 2: [1,5)', self.view_model.logger.get_last_message()) def test_logging_set_second_value_error(self): try: self.view_model.set_value_2('[eee5)') except ValueError: self.assertEqual('Set value 2 exc: Input error: wrong format', self.view_model.logger.get_last_message()) def test_logging_test_operation(self): self.view_model.set_operation(Operation.OVERLAP) self.assertEqual('Set operation OVERLAP', self.view_model.logger.get_last_message()) def test_logging_set_result(self): self.view_model.set_value_1('(1,5)') self.view_model.set_operation(Operation.END_POINTS) self.view_model.make_operation() self.assertEqual('Set result [2, 4]', self.view_model.logger.get_log_messages()[-2]) def test_logging_calc_started(self): self.view_model.set_value_1('(1,5)') self.view_model.set_operation(Operation.END_POINTS) self.view_model.make_operation() self.assertEqual('Make operation started.', self.view_model.logger.get_log_messages()[-3]) def test_logging_calc_ended(self): self.view_model.set_value_1('(1,5)') self.view_model.set_operation(Operation.END_POINTS) self.view_model.make_operation() self.assertEqual('Make operation ended.', self.view_model.logger.get_log_messages()[-1]) def test_logging_result_cleared(self): self.view_model.clear_result() self.assertEqual('Result cleared', self.view_model.logger.get_last_message()) def test_logging_exception(self): self.view_model.set_value_1('(1,5)') self.view_model.set_operation(Operation.OVERLAP) try: self.view_model.make_operation() except Exception: self.assertEqual( 'Calc exception: Wrong type of obj. Expected: Range', self.view_model.logger.get_last_message())
def test_make_contains_operation_with_range(self): rang = RangeViewModel() rang.set_value_1('[1,5]') rang.set_value_2('[1,3]') rang.make_operation() self.assertEqual(rang.get_result_string(), 'Yes')
def test_clear_result(self): rang = RangeViewModel() rang.set_value_1('(1,5)') rang.set_operation(Operation.END_POINTS) rang.make_operation() rang.clear_result() self.assertEqual(rang.get_result_string(), '')
def test_calc_exception(self): rang = RangeViewModel() rang.set_value_1('(1,5)') rang.set_operation(Operation.OVERLAP) with self.assertRaises(Exception): rang.make_operation()
def test_get_result_string(self): rang = RangeViewModel() self.assertEqual(rang.get_result_string(), '')
def test_get_end_points_operation(self): rang = RangeViewModel() rang.set_operation(Operation.END_POINTS) rang.set_value_1('(1,5)') rang.make_operation() self.assertEqual(rang.get_result_string(), '2 4')
def test_get_all_points_operation(self): rang = RangeViewModel() rang.set_operation(Operation.ALL_POINTS) rang.set_value_1('(1,5]') rang.make_operation() self.assertEqual(rang.get_result_string(), '2 3 4 5')
def test_set_list_with_spaces_to_value_2(self): rang = RangeViewModel() rang.set_value_2('1 3') self.assertEqual(rang.get_value_2_string(), '1, 3')
def test_can_change_value_2_enable(self): rang = RangeViewModel() rang.set_operation(operation=Operation.EQUALS) res = rang.get_value_2_enabled() self.assertTrue(res)
def test_set_invalid_value_to_value_2(self): rang = RangeViewModel() with self.assertRaises(TypeError): rang.set_value_2('abc')
def setUp(self): self.view_model = RangeViewModel(FakeLogger())
def test_overlap_operation(self): rang = RangeViewModel() rang.set_operation(Operation.OVERLAP) rang.set_value_1('[1,5]') rang.set_value_2('[2,3]') rang.make_operation() self.assertEqual(rang.get_result_string(), 'No')
def setUp(self): self.view_model = RangeViewModel(RealLogger())
def test_equals_operation(self): rang = RangeViewModel() rang.set_operation(Operation.EQUALS) rang.set_value_1('[1,5]') rang.set_value_2('[1,5)') rang.make_operation() self.assertEqual(rang.get_result_string(), 'No')
class View(ttk.Frame): view_model = RangeViewModel() def __init__(self): self.view_model.set_operation(Operation.CONTAINS) ttk.Frame.__init__(self) self.master.title("Range") self.master.geometry("450x160") self.value_1_label = ttk.Label(text="Range", font="Arial 16") self.value_1_label.grid(row=0, column=0) self.value_1_entry = ttk.Entry() self.value_1_entry.grid(row=0, column=1) self.operation_combobox = ttk.Combobox(values=Operation.ALL, state="readonly", justify=tk.CENTER, width="12") self.operation_combobox.grid(row=1, column=1, pady=(10, 10)) self.value_2_label = ttk.Label(text="Value/Set/Range", font="Arial 16") self.value_2_label.grid(row=2, column=0, padx=(10, 10)) self.value_2_entry = ttk.Entry() self.value_2_entry.grid(row=2, column=1, pady=(10, 10)) self.res_button = ttk.Button(text="Result") self.res_button.grid(row=3, column=0) self.result_entry = ttk.Entry() self.result_entry.insert(0, '') self.result_entry.configure(state='readonly') self.result_entry.grid(row=3, column=1, columnspan=3) self.bind_events() self.mvvm_bind() def bind_events(self): self.operation_combobox.bind('<<ComboboxSelected>>', self.operation_changed) self.res_button.bind('<Button-1>', self.result_clicked) def operation_changed(self, event): self.view_model.set_operation(self.operation_combobox.get()) self.value_1_entry.configure(state=tk.NORMAL) if self.view_model.get_value_2_enabled(): self.value_2_entry.configure(state=tk.NORMAL) else: self.value_2_entry.configure(state=tk.DISABLED) def result_clicked(self, event): try: self.mvvm_back_bind() except ValueError: self.result_entry.configure( text='Wrong input. Expected: integer value,' + 'set of integer values or range object') return self.view_model.make_operation() self.mvvm_bind() def mvvm_bind(self): self.update_text(self.value_1_entry, self.view_model.get_value_1_string()) self.operation_combobox.set(self.view_model.get_operation()) self.update_text(self.value_2_entry, self.view_model.get_value_2_string()) self.result_entry.configure(state=tk.NORMAL) self.result_entry.delete(0, 'end') self.result_entry.insert(0, self.view_model.get_result_string()) self.result_entry.configure(state='readonly') if self.view_model.get_value_2_enabled(): self.value_1_entry.configure(state=tk.NORMAL) else: self.value_1_entry.configure(state=tk.DISABLED) def mvvm_back_bind(self): self.view_model.clear_result() self.view_model.set_operation(self.operation_combobox.get()) self.view_model.set_value_1(self.value_1_entry.get()) self.view_model.set_value_2(self.value_2_entry.get()) @staticmethod def update_text(obj, text): obj.delete(0, tk.END) obj.insert(0, text)