class TableSpec(unittest.TestCase):

    def setUp(self):
        self.text = """

        | name | phone| company     |
        |Hugo Maia Vieira| (22) 8512-7751 | UENF |
        |Rodrigo Manhães | (22) 9145-8722 |NSI|

        """
        self.table = Table(self.text)

    def should_not_initialize_with_a_text_empty_or_composed_by_white_spaces(self):
        text = ''
        (lambda: Table(text)) |should| throw(WhiteSpacesError)

        text = '  \n'
        (lambda: Table(text)) |should| throw(WhiteSpacesError)

        text = '  \t'
        (lambda: Table(text)) |should| throw(WhiteSpacesError)

        text = '    |'
        (lambda: Table(text)) |should_not| throw(WhiteSpacesError)

    def should_return_the_number_of_columns(self):
        self.table.get_columns_number() |should| equal_to(3)

        text = "| name | phone |"
        table = Table(text)
        table.get_columns_number() |should| equal_to(2)

        text = """
        | name | phone |
        | None |
        """
        (lambda: Table(text)) |should| throw(DifferentNumberOfColumnsError)

    def it_should_return_a_list_of_non_empty_lines(self):
        _list = self.table.text_to_lines(self.text)
        _list |should| have(3).lines
        _list |should| include('        | name | phone| company     |')
        _list |should| include('        |Hugo Maia Vieira| (22) 8512-7751 | UENF |')
        _list |should| include('        |Rodrigo Manhães | (22) 9145-8722 |NSI|')

    def it_should_return_a_list_with_the_items_in_a_line(self):
        self.table.lines_list[0] |should| include_all_of(['name', 'phone', 'company'])
        self.table.lines_list[1] |should| include_all_of(['Hugo Maia Vieira', '(22) 8512-7751', 'UENF'])
        self.table.lines_list[2] |should| include_all_of([u'Rodrigo Manhães', '(22) 9145-8722', 'NSI'])

    def it_should_accept_empty_string_between_pipes(self):
        text = """
        || phone|
        |something  |  |
        """
        table = Table(text)
        table.lines_list[0] |should| include_all_of([' ', 'phone'])
        table.lines_list[1] |should| include_all_of(['something', ' '])

    def it_should_return_a_list_with_the_tabulation_before_each_line(self):
        text = """
            |name|age|
        |something|19|
        """
        table = Table(text)
        table.tabulation |should| equal_to(['            ', '        '])
        table.tabulation |should| have(2).items


        text = """|name|age|
        |someone|22|"""
        table = Table(text)
        table.tabulation |should| equal_to(['', '        '])
        table.tabulation |should| have(2).items


    def should_have_a_list_with_the_max_leng_of_each_column(self):
        self.table.columns[0] |should| equal_to(16)
        self.table.columns[1] |should| equal_to(14)
        self.table.columns[2] |should| equal_to(7)


    def it_should_organize_the_table(self):
        self.table.organize() |should| equal_to(u"""        | name             | phone          | company |
        | Hugo Maia Vieira | (22) 8512-7751 | UENF    |
        | Rodrigo Manhães  | (22) 9145-8722 | NSI     |""")

        text = """| name | phone| company     |
    |Hugo Maia Vieira| (22) 8512-7751 | UENF |
    |Rodrigo Manhães | (22) 9145-8722 |NSI|"""
        table = Table(text)
        table.organize() |should| equal_to(u"""| name             | phone          | company |
    | Hugo Maia Vieira | (22) 8512-7751 | UENF    |
    | Rodrigo Manhães  | (22) 9145-8722 | NSI     |""")