def test_empty_search_term(self):
     searcher_handler = Jp_to_eng_word_search_handler()
     search_result_object = searcher_handler.search("")
     self.assertEqual(0, search_result_object.result_count)
     self.assertEqual([], search_result_object.expression)
     self.assertEqual([], search_result_object.reading)
     self.assertEqual([], search_result_object.meaning)
 def test_no_result(self):
     searcher_handler = Jp_to_eng_word_search_handler()
     search_result_object = searcher_handler.search("nonsensicalgibberish")
     self.assertEqual(0, search_result_object.result_count)
     self.assertEqual([], search_result_object.expression)
     self.assertEqual([], search_result_object.reading)
     self.assertEqual([], search_result_object.meaning)
 def test_syoumetsu(self):
     searcher_handler = Jp_to_eng_word_search_handler()
     search_result_object = searcher_handler.search("消滅")
     self.assertEqual(2, search_result_object.result_count)
     self.assertEqual(u'消滅', search_result_object.get_expression_number(0))
     self.assertEqual(u'しょうめつ', search_result_object.get_reading_number(0))
     self.assertEqual(
         u'lapse; annihilation  (Physics term) ;\nextinguishment; termination (e.g. of legal representation);\n(Mathematical term)  vanishing',
         search_result_object.get_meaning_number(0))
 def test_kaku(self):
     searcher_handler = Jp_to_eng_word_search_handler()
     search_result_object = searcher_handler.search("各")
     self.assertEqual(20, search_result_object.result_count)
     self.assertEqual(u'各', search_result_object.get_expression_number(0))
     self.assertEqual(u'かく', search_result_object.get_reading_number(0))
     self.assertEqual(
         u'each; every; all',
         search_result_object.get_meaning_number(0))
 def test_surrounding_expression(self):
     searcher_handler = Jp_to_eng_word_search_handler()
     search_result_object = searcher_handler.search("*け賜*")
     self.assertEqual(1, search_result_object.result_count)
     self.assertEqual(u'受け賜る', search_result_object.get_expression_number(0))
     self.assertEqual(u'うけたまわる', search_result_object.get_reading_number(0))
     self.assertEqual(
         u'(Humble (kenjougo) language)  to hear; to be told; to know;\nto receive (order); to undertake; to comply; to take (a reservation, etc.)',
         search_result_object.get_meaning_number(0))
 def test_unfinished(self):
     searcher_handler = Jp_to_eng_word_search_handler()
     search_result_object = searcher_handler.search("tabe")
     self.assertEqual(20, search_result_object.result_count)
     self.assertEqual(u'多弁', search_result_object.get_expression_number(0))
     self.assertEqual(u'たべん', search_result_object.get_reading_number(0))
     self.maxDiff = None
     self.assertEqual(
         u'talkativeness; verbosity',
         search_result_object.get_meaning_number(0))
 def test_nasty_example(self):
     searcher_handler = Jp_to_eng_word_search_handler()
     search_result_object = searcher_handler.search("掛ける")
     self.assertEqual(1, search_result_object.result_count)
     self.assertEqual(u'掛ける', search_result_object.get_expression_number(0))
     self.assertEqual(u'かける', search_result_object.get_reading_number(0))
     self.maxDiff = None
     self.assertEqual(
         'to hang (e.g. picture); to hoist (e.g. sail); to raise (e.g. flag);\nto sit;\n() to be partway (verb); to begin (but not complete);\nto take (time, money); to expend (money, time, etc.);\nto make (a call);\nto multiply;\nto secure (e.g. lock);\nto put on (glasses, etc.);\nto cover;\nto burden someone;\nto apply (insurance);\nto turn on (an engine, etc.); to set (a dial, an alarm clock, etc.);\nto put an effect (spell, anaesthetic, etc.) on;\nto hold an emotion for (pity, hope, etc.);\nto bind;\nto pour (or sprinkle, spray, etc.) onto;\nto argue (in court); to deliberate (in a meeting); to present (e.g. idea to a conference, etc.);\nto increase further;\nto catch (in a trap, etc.);\nto set atop;\nto erect (a makeshift building);\nto hold (a play, festival, etc.);\n(Auxiliary verb) (after -masu stem of verb) indicates (verb) is being directed to (someone)',
         search_result_object.get_meaning_number(0))
    def test_simple_example(self):
        searcher_handler = Jp_to_eng_word_search_handler()
        search_result_object = searcher_handler.search("taberu")
        self.assertEqual(2, search_result_object.result_count)
        self.assertEqual(u'食べる', search_result_object.get_expression_number(0))
        self.assertEqual(u'たべる', search_result_object.get_reading_number(0))
        self.assertEqual(u'to eat;\nto live on (e.g. a salary); to live off; to subsist on',
                         search_result_object.get_meaning_number(0))

        self.assertEqual(u'喰べる', search_result_object.get_expression_number(1))
        self.assertEqual(u'たべる', search_result_object.get_reading_number(1))
        self.assertEqual(u'to eat;\nto live on (e.g. a salary); to live off; to subsist on',
                         search_result_object.get_meaning_number(1))
    def test_wildcard_reading(self):
        searcher_handler = Jp_to_eng_word_search_handler()
        search_result_object = searcher_handler.get_search_result("*けたまわる")
        self.assertEqual(2, search_result_object.result_count)
        self.assertEqual(u'承る', search_result_object.get_expression_number(0))
        self.assertEqual(u'うけたまわる', search_result_object.get_reading_number(0))
        self.assertEqual(
            u'to hear; to be told; to know;\nto receive (order); to undertake; to comply; to take (a reservation, etc.)',
            search_result_object.get_meaning_number(0))

        self.assertEqual(u'受け賜る', search_result_object.get_expression_number(1))
        self.assertEqual(u'うけたまわる', search_result_object.get_reading_number(1))
        self.assertEqual(
            u'to hear; to be told; to know;\nto receive (order); to undertake; to comply; to take (a reservation, etc.)',
            search_result_object.get_meaning_number(1))
    def add_main_button(self):

        self.searcher = Jp_to_eng_word_search_handler()
        search_button = QPushButton('Click me', self.widget)
        search_button.resize(0, 0)
        search_button.clicked.connect(self.on_search)
        search_button.setShortcut(QKeySequence("return"))
    def test_a(self):
        searcher_handler = Jp_to_eng_word_search_handler()
        search_result_object = searcher_handler.search("a")
        self.assertEqual(20, search_result_object.result_count)
        self.assertEqual(u'', search_result_object.get_expression_number(0))
        self.assertEqual(u'あ', search_result_object.get_reading_number(0))
        self.assertEqual(u'Ah! (expression of surprise, recollection, etc.); Oh!;\nHey! (to get someone\'s attention)',
                         search_result_object.get_meaning_number(0))

        self.assertEqual(u'亜', search_result_object.get_expression_number(1))
        self.assertEqual(u'あ', search_result_object.get_reading_number(1))
        self.assertEqual(u'sub-;\n-ous (indicating a low oxidation state); -ite',
                         search_result_object.get_meaning_number(1))

        self.assertEqual(u'吾', search_result_object.get_expression_number(2))
        self.assertEqual(u'あ', search_result_object.get_reading_number(2))
        self.assertEqual(u'I; me',
                         search_result_object.get_meaning_number(2))
class User_Interface():
    def __init__(self):
        self.search_result = None
        self.small_font = 9
        self.big_font = 16
        mw.myWidget = self.widget = QWidget()
        self.widget.resize(1020, 700)
        self.add_input_textbox()
        self.add_inner_box()
        self.add_scroll_area()
        self.add_main_button()

        self.add_deck_textbox()
        self.add_deck_selector_button()

        self.add_hotkeys()
        self.widget.show()

    def add_inner_box(self):
        self.inner_box = QWidget()
        self.inner_box.resize(1000, 2300)

        self.numbercolumn = QListWidget(self.inner_box)
        self.numbercolumn.move(0, 0)
        self.numbercolumn.resize(25, 500)

        self.column1 = QListWidget(self.inner_box)
        self.column1.move(28, 0)
        self.column1.resize(300, 500)

        self.column2 = QListWidget(self.inner_box)
        self.column2.move(348, 0)
        self.column2.resize(300, 500)

        self.column3 = QListWidget(self.inner_box)
        self.column3.move(668, 0)
        self.column3.resize(300, 500)

    def add_scroll_area(self):
        mw.scrollarea = self.scrollarea = QScrollArea(self.widget)
        self.scrollarea.move(0, 50)
        self.scrollarea.resize(1020, 650)
        self.scrollarea.setWidget(self.inner_box)

    def add_input_textbox(self):

        mw.textbox = self.textbox = QLineEdit(self.widget)
        self.textbox.move(300, 0)
        self.textbox.resize(400, 30)

    def add_deck_textbox(self):
        config_parser.read_config()
        self.deck_textbox = QLineEdit(self.widget)
        self.deck_textbox.move(750, 0)
        self.deck_textbox.resize(110, 30)
        self.deck_textbox.setText(config_parser.deck_name)

    def add_main_button(self):

        self.searcher = Jp_to_eng_word_search_handler()
        search_button = QPushButton('Click me', self.widget)
        search_button.resize(0, 0)
        search_button.clicked.connect(self.on_search)
        search_button.setShortcut(QKeySequence("return"))

    def add_deck_selector_button(self):

        deck_select_button = QPushButton('Set deck', self.widget)
        deck_select_button.clicked.connect(self.on_deck_select)
        deck_select_button.move(860,0)

    def on_deck_select(self):
        config_parser.deck_name = self.deck_textbox.text()
        config_parser.write_config()

    def on_search(self):

        self.search_result = self.searcher.get_search_result(self.textbox.text())
        if self.search_result.get_result_count() > 0:
            self.textbox.setText("")
            self.column1.clear()
            self.column2.clear()
            self.column3.clear()
            self.numbercolumn.clear()
            self.realign_columns()
            for i in range(0, self.search_result.get_result_count()):
                self.add_to_third_column(i, self.search_result)
                self.add_to_number_column(i, self.search_result)
                self.add_to_first_column(i, self.search_result)
                self.add_to_second_column(i, self.search_result)

    def realign_columns(self):
        column_height = self.get_column3_height()
        self.resize_column_heights(column_height)
        self.move_columns()

    def column12_width(self):
        width_in_pixels = 210
        for i in range(0, self.search_result.get_result_count()):
            if self.search_result.get_reading_number(i).__len__() * 22 > width_in_pixels:
                width_in_pixels = self.search_result.get_reading_number(i).__len__() * 22
            if self.search_result.get_expression_number(i).__len__() * 22 > width_in_pixels:
                width_in_pixels = self.search_result.get_expression_number(i).__len__() * 22
        return width_in_pixels

    def move_columns(self):
        self.column2.move(25 + self.column12_width(), 0)
        self.column3.move(25 + (self.column12_width() * 2), 0)

    def resize_column_heights(self, new_height):
        self.column1.resize(self.column12_width(), new_height)
        self.column2.resize(self.column12_width(), new_height)
        self.column3.resize(1200 - self.column12_width() - self.column12_width(), new_height)
        self.numbercolumn.resize(50, new_height)

        self.inner_box.resize(1000, new_height + 50)

    def get_column3_height(self):
        total_lines = 0
        for i in range(0, self.search_result.get_result_count()):
            total_lines += self.count_lines(self.search_result.get_meaning_number(i))
        return total_lines * 15 + 40 + (self.search_result.get_result_count() * 32)

    def add_to_third_column(self, i, result):
        self.add_string_to_list(self.column3, result.get_meaning_number(i), self.small_font)

        self.column3_line_count = self.count_lines(result.get_meaning_number(i))

        self.add_padding_column3()
        self.add_padding_other_columns()

    def add_padding_column3(self):
        if self.column3_line_count == 1:
            self.add_string_to_list(self.column3, "\n", self.small_font)
        else:
            self.add_string_to_list(self.column3, "", self.small_font)

    def add_padding_other_columns(self):
        if self.column3_line_count < 3:
            self.lines_off_padding = self.make_newlines(0)
        else:
            self.lines_off_padding = self.make_newlines(self.column3_line_count - 1)

    def add_to_number_column(self, i, result):
        shortcut_list = (
            "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P")

        self.add_string_to_list(self.numbercolumn, shortcut_list[i], self.big_font)
        self.add_string_to_list(self.numbercolumn, self.lines_off_padding, self.small_font)

    def add_to_first_column(self, i, result):

        self.add_string_to_list(self.column1, result.get_expression_number(i), self.big_font)
        self.add_string_to_list(self.column1, self.lines_off_padding, self.small_font)

    def add_to_second_column(self, i, result):
        self.add_string_to_list(self.column2, result.get_reading_number(i), self.big_font)
        self.add_string_to_list(self.column2, self.lines_off_padding, self.small_font)

    def add_string_to_list(self, itemlist, string, fontsize):
        item = QListWidgetItem(string)
        font = QFont()
        # font.setFamily("Lucida")
        font.setPointSize(fontsize)
        item.setFont(font)
        itemlist.addItem(item)

    def make_newlines(self, number):
        result = " "
        for i in range(0, number - 1):
            result += "\n"
        return result

    def count_lines(self, string):
        counter = 1
        for char in string:
            if char == '\n':
                counter += 1
        return counter

    def add_hotkeys(self):
        self.hk = Hotkeys(self)