def test_if(self): value_if = parse('if (T){2 + 2} else if (T){2 - 2}') value_Eq = parse('if (2 == 2){1 + 2}') value_Gt = parse('if (3 > 1){3 + 5}') value_Le = parse('if (4 <= 5){2 + 5}') value_Lt = parse('if (3 < 5){3 * 1}') value_Ge = parse('if (3 >= 4){2 ^ 3}') value_Ne = parse('if (3 != 1){1 + 2} else { 1 + 1 }') value_ternario = parse('asd = 3 > 0 ? 1 : 2') if_if = CscriptTransformer().transform(value_if) if_Eq = CscriptTransformer().transform(value_Eq) if_Gt = CscriptTransformer().transform(value_Gt) if_Le = CscriptTransformer().transform(value_Le) if_Lt = CscriptTransformer().transform(value_Lt) if_Ge = CscriptTransformer().transform(value_Ge) if_Ne = CscriptTransformer().transform(value_Ne) if_ternario = CscriptTransformer().transform(value_ternario) env = {Symbol('b'): 2} print_ = parse('b = b == 2 ? 6 : 0') print_eval = CscriptTransformer().transform(print_) res = eval(print_eval, env) assert if_if == [ Symbol.IF, True, [Symbol.ADD, 2.0, 2.0], [[True, [Symbol.SUB, 2.0, 2.0]]] ] assert if_Eq == [ Symbol.IF, [Symbol.EQ, 2.0, 2.0], [Symbol.ADD, 1.0, 2.0] ] assert if_Gt == [Symbol.IF, [Symbol.GT, 3.0, 1.0], [Symbol.ADD, 3, 5]] assert if_Le == [Symbol.IF, [Symbol.LE, 4.0, 5.0], [Symbol.ADD, 2, 5]] assert if_Lt == [Symbol.IF, [Symbol.LT, 3.0, 5.0], [Symbol.MUL, 3, 1]] assert if_Ge == [Symbol.IF, [Symbol.GE, 3.0, 4.0], [Symbol.POW, 2, 3]] assert if_Ne == [ Symbol.IF, [Symbol.NEQ, 3.0, 1.0], [Symbol.ADD, 1, 2], [[Symbol.ADD, 1, 1]] ] assert if_ternario == [ Symbol.TERN, Symbol('asd'), [Symbol.GT, 3, 0], 1, 2 ] assert env[Symbol('b')] == 6 assert eval(if_if, {}) == 4 assert eval(if_Eq, {}) == 3 assert eval(if_Gt, {}) == 8 assert eval(if_Le, {}) == 7 assert eval(if_Lt, {}) == 3 assert eval(if_Ne, {}) == 3 assert eval(if_Ge, {}) is None env = {'asd': 2} assert eval(if_ternario, env) == None assert env[Symbol('asd')] == 1
def test_loop(self): loop = parse(""" a = 2; for(x = 3; x <= 10; x = x + 1){ a = a + x }; a """) loop_transform = CscriptTransformer().transform(loop) #while while_p = parse(""" a = 1; while(a < 10){ a = a + 1 } """) while_trans = CscriptTransformer().transform(while_p) env = {} assert eval(loop_transform, env) == 54 env = {} eval(while_trans, env) assert env[Symbol('a')] == 10
def prnthss(self, Rparenthesis, unit, Lparenthesis): Rparenthesis = str(Rparenthesis) Lparenthesis = str(Lparenthesis) return [Symbol(Rparenthesis), unit, Symbol(Lparenthesis)]
def binop(self, left, op, right): op = str(op) return [Symbol(op), left, right]
def op(self, args): return Symbol(args)
def condition(self, *args): left, comparsion, right = args return [Symbol.COMPARE, left, Symbol(comparsion), right]
def name(self, name): return Symbol(name)
def test_atomic(self): assert eval(parse_src('verum'), e) is True assert eval(parse_src('falsus'), e) is False assert parse_src('adde') == Symbol('adde')
def bool(self, boolean): return Symbol(boolean) == Symbol.TRUE
def assign(self, left, op): return list(tuple((Symbol.DEFINE, Symbol(left), op)))
def symbol(self, symbol): return Symbol(symbol)