def test_na(self): t1 = compile(''' | A | B | |---|---| | 1 |N/A| | 2 | 1 | |N/A| 2 | | * | 3 |''') t2 = compile(''' | A | C | |---|---| | 1 | 3 | | 2 |N/A| |N/A| 4 | | * | 5 |''') t3 = t1 * t2 self.assertEqual(t3._labels, ('A', 'B', 'C')) self.assertEqual(t3._num_rows, 10) self.assertEqual(t3.rows[0], (1, NOT_APPLICABLE, 3)) self.assertEqual(t3.rows[1], (1, NOT_APPLICABLE, 5)) self.assertEqual(t3.rows[2], (2, 1, NOT_APPLICABLE)) self.assertEqual(t3.rows[3], (2, 1, 5)) self.assertEqual(t3.rows[4], (NOT_APPLICABLE, 2, 4)) self.assertEqual(t3.rows[5], (NOT_APPLICABLE, 2, 5)) self.assertEqual(t3.rows[6], (1, 3, 3)) self.assertEqual(t3.rows[7], (2, 3, NOT_APPLICABLE)) self.assertEqual(t3.rows[8], (NOT_APPLICABLE, 3, 4)) self.assertEqual(t3.rows[9], (WILD_CARD, 3, 5))
def test_collection_both(self): t1 = compile(''' | A (coll) | B | |----------|---| | 1, 2, 3 | 0 |''') t2 = compile(''' | A (coll) | C | |----------|---| | 2, 3, 4 | 1 |''') t3 = t1 * t2 self.assertFalse((1, 0, 1) in t3) self.assertTrue((2, 0, 1) in t3) self.assertTrue((3, 0, 1) in t3) self.assertFalse((4, 0, 1) in t3)
def test_condition_both(self): t1 = compile(''' | A (cond) | B | |----------|---| | A > 0 | 0 | | * | 1 |''') t2 = compile(''' | A (cond) | C | |----------|---| | A < 2 | 0 | | * | 1 |''') t3 = t1 * t2 self.assertEqual(t3.select(A=-1), (-1, 1, 0)) self.assertEqual(t3.select(A=1), (1, 0, 0)) self.assertEqual(t3.select(A=3), (3, 0, 1))
def test_invalid_directive(self): self.assertRaises( TableMarkupError, lambda: compile(''' | A (foo) | |---------| | a | '''))
def test_markdown2(self): t = compile(''' A | B | C | D ---|---|---|--- 1 | 2 | 3 | 4 ''') self.assertEqual(t.select(A=1), (1, 2, 3, 4))
def test_markdown1(self): t = compile(''' | A | B | C | D | |---|---|---|---| | 1 | 2 | 3 | 4 | ''') self.assertEqual(t.select(A=1), (1, 2, 3, 4))
def test_plus_operator(self): t1 = compile(''' | A | B | |---|---| | 1 | 2 | | 2 | 4 |''') t2 = compile(''' | A | B | |---|---| | 3 | 6 | | 4 | 8 |''') t3 = t1 + t2 it = iter(t3) self.assertEqual(next(it), (1, 2)) self.assertEqual(next(it), (2, 4)) self.assertEqual(next(it), (3, 6)) self.assertEqual(next(it), (4, 8))
def test_condition_right(self): t1 = compile(''' | A | B | |----|---| | -1 | 1 | | 1 | 2 |''') t2 = compile(''' | A(cond) | C | |---------|---| | A < 0 | 1 | | A >= 0 | 2 |''') t3 = t1 * t2 self.assertEqual(t3._labels, ('A', 'B', 'C')) self.assertEqual(t3._num_rows, 2) it = iter(t3) self.assertEqual(next(it), (-1, 1, 1)) self.assertEqual(next(it), (1, 2, 2))
def test_oneline(self): tb = compile(''' ========== a (value) ========== 1 ==========''') self.assertEqual(tb.select(a=1), (1, ))
def test_union(self): t1 = compile(''' | A | B | |---|---| | 1 | 2 | | 2 | 4 |''') t2 = compile(''' | A | B | |---|---| | 3 | 6 | | 4 | 8 |''') t3 = t1.union(t2) it = iter(t3) self.assertEqual(next(it), (1, 2)) self.assertEqual(next(it), (2, 4)) self.assertEqual(next(it), (3, 6)) self.assertEqual(next(it), (4, 8))
def test_grid_table(self): tb = compile(''' +---+---+ | a | b | +===+===+ | 1 | a | +---+---+''', a=1) self.assertEqual(tb.select(a=1, b=1), (1, 1))
def test_variable_leak2(self): self.assertRaises( NameError, lambda: compile(""" ===== A ===== table ===== """))
def test_operator(self): tb = compile(""" === === ======== a b aplusb === === ======== 1 1 1 + 1 === === ======== """) self.assertEqual(tb.select(a=1, b=1).aplusb, 2)
def test_join_two_col(self): t1 = compile(''' | A | B | C | |---|---|---| | 1 | 2 | 1 | | 1 | 1 | 2 |''') t2 = compile(''' | A | B | D | |---|---|---| | 1 | 1 | 3 | | 1 | 1 | 4 | | 2 | 1 | 4 |''') t3 = t1 * t2 self.assertEqual(t3._labels, ('A', 'B', 'C', 'D')) it = iter(t3) self.assertEqual(next(it), (1, 1, 2, 3)) self.assertEqual(next(it), (1, 1, 2, 4)) assertIterationStop(it)
def test_no_arg(self): tb = compile(""" === === A B === === 1 1 === === """) self.assertRaises(LookupError, tb.select)
def test_no_matched(self): tb = compile(""" === === A B === === 1 1 === === """) self.assertEqual(tb.select_all(A=2), [])
def test_na(self): tb = compile(""" === === A B === === 1 N/A === === """) self.assertRaises(LookupError, lambda: tb.select(A=1))
def test_builtin(self): tb = compile(""" ====== A ====== str(1) ====== """) self.assertEqual(tb.select(A='1'), ('1', ))
def test_collection(self): tb = compile(''' | S(coll) | V | |---------|---| | 1, 2 | 1 | | N/A | 2 | | * | 3 |''') self.assertEqual(tb.select(S=1), (1, 1)) self.assertEqual(tb.select(S=2), (2, 1)) self.assertEqual(tb.select(S=3), (3, 3))
def test_na_for_key(self): tb = compile(""" === === A B === === N/A 1 1 2 === === """) self.assertEqual(tb.select(A=1), (1, 2))
def test_string(self): tb = compile(''' ======== ===== A B (string) (str) ======== ===== AAAAAAAA BBBBB aaaaaaaa bbbbb ======== =====''') self.assertEqual(tb.select(A='AAAAAAAA'), ('AAAAAAAA', 'BBBBB'))
def test_condition_right(self): tb = compile(''' ===== =========== a b (condition) ===== =========== True b < 0 False b >= 0 ===== ===========''') self.assertEqual(tb.select(b=-1), (True, -1)) self.assertEqual(tb.select(b=1), (False, 1))
def test_consition_wildcard(self): tb = compile(''' =========== ===== a b (condition) =========== ===== a < 0 True * False =========== =====''') self.assertEqual(tb.select(a=-1), (-1, True)) self.assertEqual(tb.select(a=1), (1, False))
def test_consition_na(self): tb = compile(''' =========== ===== a b (condition) =========== ===== N/A True 0 <= a False =========== =====''') self.assertRaises(LookupError, lambda: tb.select(a=-1)) self.assertEqual(tb.select(a=1), (1, False))
def test_value(self): tb = compile(''' ========= a (value) ========= 1 2 =========''') self.assertEqual(tb.select(a=1), (1, )) self.assertEqual(tb.select(a=2), (2, ))
def test_wildcard_left(self): t1 = compile(''' | A | B | |---|---| | 1 | 1 | | 2 | 2 | | * | 3 |''') t2 = compile(''' | A | C | |---|---| | 1 | 1 | | 2 | 2 |''') t3 = t1 * t2 self.assertEqual(t3._labels, ('A', 'B', 'C')) self.assertEqual(t3._num_rows, 4) it = iter(t3) self.assertEqual(next(it), (1, 1, 1)) self.assertEqual(next(it), (2, 2, 2)) self.assertEqual(next(it), (1, 3, 1)) self.assertEqual(next(it), (2, 3, 2)) assertIterationStop(it)
def test_cond(self): tb = compile(''' ====== === A B (cond) ====== === A == 1 1 A == 2 2 ====== ===''') self.assertEqual(tb.select(A=1), (1, 1)) self.assertEqual(tb.select(A=2), (2, 2)) self.assertRaises(LookupError, lambda: tb.select(A=-1))
def test_no_arg(self): tb = compile(""" === === A B === === 1 1 1 2 === === """) ret = tb.select_all() self.assertEqual(len(ret), 2) self.assertEqual(ret[0], (1, 1)) self.assertEqual(ret[1], (1, 2))
def test_wildcard(self): tb = compile(""" === === A B === === 1 1 * 2 === === """) ret = tb.select(A=2) self.assertEqual(ret, (2, 2)) self.assertTrue(ret[0] is not WILD_CARD)
def test_invalid_label(self): tb = compile(""" === === A B === === 1 1 === === """) try: tb.select_all(C=1) self.fail() except LookupError as ok: self.assertEqual(str(ok), "Label 'C' is invalid")