1from pyexcel import Sheet
2from _compact import OrderedDict
3
4from nose.tools import eq_, raises, assert_not_in
5
6
7class TestSheetRow:
8    def setUp(self):
9        self.data = [
10            ["Row 0", -1, -2, -3],
11            ["Row 1", 1, 2, 3],
12            ["Row 2", 4, 5, 6],
13            ["Row 3", 7, 8, 9],
14        ]
15
16    def test_negative_row_index(self):
17        s = Sheet(self.data, "test")
18        data = s.row[-1]
19        eq_(data, self.data[-1])
20
21    def test_formatter_by_named_row(self):
22        s = Sheet(self.data, "test")
23        s.name_rows_by_column(0)
24        s.row.format("Row 1", str)
25        eq_(s.row["Row 1"], ["1", "2", "3"])
26
27    def test_rownames(self):
28        s = Sheet(self.data, "test", name_rows_by_column=0)
29        eq_(s.rownames, ["Row 0", "Row 1", "Row 2", "Row 3"])
30        custom_rows = ["R0", "R1", "R2", "R3"]
31        s.rownames = custom_rows
32        eq_(s.rownames, custom_rows)
33
34    def test_rownames2(self):
35        custom_rows = ["R0", "R1", "R2", "R3"]
36        s = Sheet(self.data, "test", rownames=custom_rows)
37        eq_(s.rownames, custom_rows)
38
39    @raises(NotImplementedError)
40    def test_rownames3(self):
41        custom_rows = ["R0", "R1", "R2", "R3"]
42        Sheet(self.data, "test", name_rows_by_column=0, rownames=custom_rows)
43
44    def test_formatter_by_named_row_2(self):
45        s = Sheet(self.data, "test")
46        s.name_rows_by_column(0)
47        s.row.format("Row 1", str)
48        eq_(s.row["Row 1"], ["1", "2", "3"])
49
50    def test_row_series_to_dict(self):
51        s = Sheet(self.data, "test")
52        s.name_rows_by_column(0)
53        content = s.to_dict(True)
54        keys = ["Row 0", "Row 1", "Row 2", "Row 3"]
55        assert keys == list(content.keys())
56
57    @raises(TypeError)
58    def test_extend_rows_using_wrong_data_type(self):
59        s = Sheet(self.data, "test")
60        s.name_rows_by_column(0)
61        s.extend_rows([1, 2])
62
63    def test_formatter_by_named_row2(self):
64        """Test a list of string as index"""
65        s = Sheet(self.data, "test")
66        s.name_rows_by_column(0)
67        s.row.format(["Row 1", "Row 2"], str)
68        assert s.row["Row 1"] == ["1", "2", "3"]
69        assert s.row["Row 2"] == ["4", "5", "6"]
70
71    def test_add(self):
72        s = Sheet(self.data, "test")
73        s.name_rows_by_column(0)
74        data = OrderedDict({"Row 5": [10, 11, 12]})
75        s1 = s.row + data
76        assert s1.row["Row 5"] == [10, 11, 12]
77        assert_not_in("Row 5", s.row)
78
79    def test_iadd(self):
80        s = Sheet(self.data, "test")
81        s.name_rows_by_column(0)
82        data = OrderedDict({"Row 5": [10, 11, 12]})
83        s.row += data
84        assert s.row["Row 5"] == [10, 11, 12]
85
86    def test_dot_notation(self):
87        s = Sheet(self.data, "test")
88        s.name_rows_by_column(0)
89        eq_(s.row.Row_3, [7, 8, 9])
90
91    @raises(TypeError)
92    def test_add_wrong_type(self):
93        s = Sheet(self.data, "test")
94        s.name_rows_by_column(0)
95        s = s.row + "string type"  # bang
96
97    @raises(ValueError)
98    def test_delete_named_row(self):
99        s = Sheet(self.data, "test")
100        s.name_rows_by_column(0)
101        del s.row["Row 2"]
102        assert s.number_of_rows() == 3
103        s.row["Row 2"]  # already deleted
104
105    @raises(ValueError)
106    def test_delete_indexed_row1(self):
107        s = Sheet(self.data, "test")
108        s.name_rows_by_column(0)
109        del s.row[2]
110        assert s.number_of_rows() == 3
111        s.row["Row 2"]  # already deleted
112
113    @raises(ValueError)
114    def test_delete_indexed_row2(self):
115        s = Sheet(self.data, "test")
116        s.name_rows_by_column(0)
117        s.delete_named_row_at(2)
118        assert s.number_of_rows() == 3
119        s.row["Row 2"]  # already deleted
120
121    @raises(ValueError)
122    def test_delete_indexed_row3(self):
123        s = Sheet(self.data, "test")
124        s.name_rows_by_column(0)
125        del s.row["Row 0", "Row 1"]
126        assert s.number_of_rows() == 2
127        s.row["Row 1"]  # already deleted
128
129    @raises(ValueError)
130    def test_delete_row(self):
131        s = Sheet(self.data, "test")
132        del s.row[1, 2]
133        assert s.number_of_rows() == 2
134        s.row["Row 1"]  # already deleted
135
136    def test_column_locator2(self):
137        """
138        Remove odd columns
139        """
140        sheet = Sheet(self.data)
141
142        def locator(index, _):
143            return index % 2 == 0
144
145        del sheet.row[locator]
146        assert sheet.number_of_rows() == 2
147
148    def test_set_named_row(self):
149        s = Sheet(self.data, "test")
150        s.name_rows_by_column(0)
151        s.row["Row 2"] = [11, 11, 11]
152        assert s.row["Row 2"] == [11, 11, 11]
153
154    def test_set_indexed_column(self):
155        s = Sheet(self.data, "test", name_rows_by_column=0)
156        s.column[0] = [12, 3, 4, 5]
157        assert s.column[0] == [12, 3, 4, 5]
158