def test_filter_even(): r = Range(5) q = Qit() f = Function("filter").returns(Bool()).takes(r.type, "r").code("return r % 2 == 0;") assert q.run(r.iterate().filter(f)) == [0, 2, 4]
def test_filter_empty(): r = Range(5) q = Qit() f = Function("filter").returns(Bool()).takes(r.type, "r").code("return false;") assert len(q.run(r.iterate().filter(f))) == 0
def test_product_variables(): x = Variable(Int(), "x") y = Variable(Int(), "x") t = Range(x) * Range(y) assert set() == set(t.get_variables()) assert {x, y} == set(t.iterate().get_variables()) assert {x, y} == set(t.generate().get_variables())
def test_filter_map(): r = Range(5) q = Qit() f = Function("f").returns(Int()).takes(Int(), "r").code("return r * 2;") g = Function("g").returns(Bool()).takes(Int(), "x").code("return x == 4;") h = Function("h").returns(Int()).takes(Int(), "r").code("return r + 1;") q.run(r.iterate().map(f).filter(g).map(h)) == 5
def test_build_range(): r = Range(10) builder = CppBuilder() i = r.iterate() v = i.make_iterator(builder) t = i.get_iterator_type(builder) assert "{} {}(10);\n".format(t, v) == builder.writer.get_string()
def test_range_indexer(): ctx = Qit() r = Range(10) ctx.run(r.indexer(5)) == 5 start = Variable(Int(), "start") end = Variable(Int(), "end") step = Variable(Int(), "step") r = Range(start, end, step) result = ctx.run(r.iterate().map(r.indexer), args={"start" : 5, "end": 21, "step" : 3}) assert result == list(range(6))
def test_outer_variables_in_fn_iterator(): c = Qit() x = Variable(Int(), "x") y = Variable(Int(), "y") plus_1 = Function().takes(Int(), "x").returns(Int()).code("return x + 1;") P = Range(plus_1(x)) * Range(y) f = P.iterate().to_vector().make_function((x,)) result = c.run(Range(3).iterate().map(f), args={ y: 2}) assert [[(0, 0), (0, 1)], [(0, 0), (1, 0), (0, 1), (1, 1)], [(0, 0), (1, 0), (2, 0), (0, 1), (1, 1), (2, 1)]] == result