def test_embed_in_false(self, nrcv): prog = Conditional(Number(0), None, [ FunctionDefinition("foo3", Function([], [])), FunctionDefinition("foo4", Function([], [Number(3)])), Conditional(Number(0), [], []) ]) assert nrcv(prog) == set(["foo3"])
def test_embed_in_true(self, nrcv): prog = Conditional(Number(0), [ FunctionDefinition("foo1", Function([], [])), FunctionDefinition("foo2", Function([], [Number(1)])), Conditional(Number(0), [], []) ], None) assert nrcv(prog) == set(["foo1"])
def test_embedded_in_bad_if(self, nrcv): prog = Conditional(Number(0), [ FunctionDefinition("foo1", Function([], [])), FunctionDefinition("foo2", Function([], [Number(1)])), Conditional(Number(0), [], []) ], [ FunctionDefinition("foo3", Function([], [])), FunctionDefinition("foo4", Function([], [Number(3)])), Conditional(Number(0), [], []) ]) assert nrcv(prog) == set(["foo1", "foo3"])
def test_embedded(self, nrcv): prog = Conditional(Number(0), [ Conditional(Number(0), [], []), FunctionDefinition("foo1", Function([], [])), FunctionDefinition("foo2", Function([], [Number(1)])), Number(2), ], [ Conditional(Number(0), [], []), FunctionDefinition("foo3", Function([], [])), FunctionDefinition("foo4", Function([], [Number(3)])), Number(4), ]) assert nrcv(prog) == set(["foo1", "foo3"])
def my_tests(): reader = Print(Read('n')) print_binary = Print( BinaryOperation( Reference('x'), '/', UnaryOperation('!', BinaryOperation(Reference('y'), '%', Number(2))))) conditional = Conditional( BinaryOperation(BinaryOperation(Reference('x'), '*', Number(2)), '<', UnaryOperation('-', Reference('y'))), [ print_binary, UnaryOperation('-', UnaryOperation('!', Reference('s'))) ], []) definition_max3 = FunctionDefinition( 'max3', Function(["a", "b", "c"], [ Conditional(BinaryOperation(Reference("a"), ">", Reference("b")), [ Conditional( BinaryOperation(Reference("a"), ">=", Reference("c")), [Reference("a")], [Reference("c")]) ], [ Conditional( BinaryOperation(Reference("b"), "<", Reference("c")), [Reference("c")], [Reference("b")]) ]) ])) fun_call = Print(FunctionCall(definition_max3, [Number(1), Number(2)])) definition_log2 = FunctionDefinition( "log2", Function(["k", "n", "step"], [ Conditional( BinaryOperation( BinaryOperation(Reference("k"), "*", Number(2)), "<=", Reference("n")), [ FunctionCall(Reference("log_2_def"), [ BinaryOperation(Reference("k"), "*", Number(2)), Reference("n"), BinaryOperation(Reference("step"), "+", Number(1)) ]) ], [Reference("step")]) ])) empty_func = FunctionDefinition("emptyFunc", Function([], [])) printer = PrettyPrinter() printer.visit(reader) printer.visit(conditional) printer.visit(print_binary) printer.visit(definition_max3) printer.visit(fun_call) printer.visit(definition_log2) printer.visit(empty_func)
def test(): f1 = Conditional(FunctionCall(Reference('x'), [Number(22)]), [Conditional(BinaryOperation(Number(0), '-', Number(6)), [],[Conditional(Number(0), [Conditional(UnaryOperation('-', Number(20)), [],[FunctionDefinition('foobar', Function(['ab', 'cd'], [ Print(BinaryOperation(UnaryOperation('-', Number(120)), '*', BinaryOperation(UnaryOperation('-', Number(20)), '+', Reference('z')))), Read('x') ]))])],[])])],[Conditional(Number(0), [Conditional(Number(0), [],[Read('xxx')])],[])]) f = FunctionDefinition('foo', Function(['a', 'b'], [ FunctionDefinition('bar', Function(['c', 'd'], [ Read('c') ])), Conditional(Number(6), [Conditional(Number(5), [Read('x')])],[f1]) ])) pr = PrettyPrinter() pr.visit(f)
def test_embed_in_cond(self, nrcv): bad_cond = Conditional(Number(0), [ FunctionDefinition("foo", Function([], [])), Number(0) ]) prog = Conditional(bad_cond, [], []) assert nrcv(prog) == set(["foo"])
def visitFunctionDefinition(self, func_def): args_without_const = [ elem.accept(self) for elem in func_def.function.args ] body_without_const = [ elem.accept(self) for elem in func_def.function.body ] func_without_const = Function(args_without_const, body_without_const) func_def_without_const = FunctionDefinition(func_def.name, func_without_const) return func_def_without_const
def test_smoke(self, nrcv): prog = ( Conditional(Number(1), [ FunctionDefinition("foo", Function([], [ Number(123), Conditional(Number(1), [ Number(2), ]) ])), FunctionDefinition("bar", Function([], [ Number(123) ])), FunctionDefinition("baz", Function([], [ ])), FunctionDefinition("foobar", Function([], [ Conditional(Number(1), [ Number(2), ]), Number(123) ])), ]) ) assert nrcv(prog) == set(["foo", "baz"])
def test_embedded(self, nrcv): prog = FunctionDefinition("foo1", Function([], [ Conditional(Number(0), [], []), FunctionDefinition("foo2", Function([], [ FunctionDefinition("foo3", Function([], [])), ])), FunctionDefinition("foo4", Function([], [ FunctionDefinition("foo5", Function([], [])), Conditional(Number(0), [], []) ])), FunctionDefinition("foo6", Function([], [])) ])) assert nrcv(prog) == set(["foo3", "foo4", "foo5", "foo6"])
def test_good(self, nrcv): prog = FunctionDefinition("foo", Function([], [Number(10)])) assert nrcv(prog) == set()
def visitFunction(self, fun): body = self.visitBody(fun.body) return Function(fun.args, body)
self.visit(uoper.expr, False) print(')', end='') def visitReference(self, refer): print(refer.name, end='') def visitPrint(self, prnt): print('print', end=' ') self.visit(prnt.expr, False) def visitRead(self, read): print('read ' + read.name, end='') if __name__ == '__main__': printer = PrettyPrinter() function = Function([], []) definition = FunctionDefinition('x', function) conditional = Conditional(BinaryOperation(Number(42), '-', Number(42)), [ Conditional( BinaryOperation(BinaryOperation(Number(42), '+', Reference('a')), '*', Number(0)), [], [Conditional(Number(42), [definition], [])]) ], []) printer.visit(definition) printer.visit(conditional) printer.visit(Read('x')) printer.visit(Print(BinaryOperation(Number(2), '+', Reference('a')))) call = FunctionCall(Reference('foo'), []) printer.visit(call)
def test_definition_containing_bad(self, nrcv_good): assert not nrcv_good(FunctionDefinition("foo", Function([], [])))
def test_definition_containing_good(self, nrcv_good): assert nrcv_good(FunctionDefinition("foo", Function([], [Number(10)])))
def my_tests(): print_binary = Print( BinaryOperation( Number(56), '/', UnaryOperation('!', BinaryOperation(Number(8), '%', Number(2))))) conditional = Conditional( BinaryOperation(BinaryOperation(Number(4), '*', Number(2)), '<', UnaryOperation('-', Number(-5))), [print_binary, print_binary], []) definition_max3 = FunctionDefinition( 'max3', Function(["a", "b", "c"], [ Conditional(BinaryOperation(Reference("a"), "-", Reference("a")), [ Conditional(BinaryOperation(Reference("a"), "*", Number(0)), [], [Reference("c")]) ], [ Conditional(BinaryOperation(Number(0), "*", Reference("c")), [Reference("c")]) ]) ])) fun_call = FunctionCall( definition_max3, [Number(1), BinaryOperation(Number(1), '*', Number(7)), Number(3)]) definition_log2 = FunctionDefinition( "log2", Function(["k", "n", "step"], [ Conditional( BinaryOperation( BinaryOperation(Reference("k"), "-", Reference("k")), "<=", Reference("n")), [ FunctionCall(Reference("log_2_def"), [ BinaryOperation(Reference("k"), "*", Number(0)), Reference("n"), BinaryOperation(Number(4), "+", Number(5)) ]) ], [Reference("step")]) ])) folder = ConstantFolder() my_printer = printer.PrettyPrinter() conditional_c = folder.visit(conditional) definition_max3_c = folder.visit(definition_max3) fun_call_c = folder.visit(fun_call) definition_log2_c = folder.visit(definition_log2) if conditional_c == conditional: print('!') if definition_max3_c == definition_max3: print('!') if definition_log2_c == definition_log2: print('!') if fun_call_c == fun_call: print('!') my_printer.visit(conditional_c) my_printer.visit(conditional) my_printer.visit(definition_max3_c) my_printer.visit(definition_max3) my_printer.visit(fun_call_c) my_printer.visit(fun_call) my_printer.visit(definition_log2_c)
def func_def(name): return FunctionDefinition(name, Function([], []))
def test_function_pure_non_empty(self, pcv): assert pcv(Function([], [Number(10), Number(20)])) == True
def test_embedded(self, nrcv): prog = Print(FunctionDefinition("foo", Function([], []))) assert nrcv(prog) == set(["foo"])
def visit_wrapped(tree): res = nrcv(FunctionDefinition("foo", Function([], [tree]))) assert res == set() or res == set(["foo"]) return "foo" not in res
def visitReference(self, refer): return refer def visitPrint(self, prnt): prnt.expr = self.visit(prnt.expr) return prnt def visitRead(self, read): return read if __name__ == '__main__': printer = PrettyPrinter() folder = ConstantFolder() function = Function(['a', 'b'], [Conditional(Number(42), [Number(42)], None)]) definition = FunctionDefinition('x', function) conditional = Conditional( BinaryOperation(Reference('a'), '-', BinaryOperation(Reference('a'), '-', Reference('a'))), [ Conditional( BinaryOperation( BinaryOperation(Number(42), '+', Reference('a')), '*', Number(0)), [], [Conditional(Number(42), [definition], [])]) ], []) printer.visit(conditional) conditional = folder.visit(conditional) prnt = Print( BinaryOperation(
def test_good_with_args(self, nrcv): prog = FunctionDefinition("foo", Function(["arg"], [Number(10)])) assert nrcv(prog) == set()
def test_bad_empty(self, nrcv): prog = FunctionDefinition("foo", Function([], [])) assert nrcv(prog) == set(["foo"])
def test_function_empty(self, pcv): assert pcv(Function([], [])) == True
def test_bad_empty_with_args(self, nrcv): prog = FunctionDefinition("foo", Function(["arg"], [])) assert nrcv(prog) == set(["foo"])
def test_function_unpure(self, pcv): assert pcv(Function([], [Number(10), Print(Number(5)), Number(20)])) == False
def test_bad_not_last(self, nrcv): prog = FunctionDefinition("foo", Function(["arg"], [ Conditional(Number(0), [], []), Number(1) ])) assert nrcv(prog) == set()
def test_function_definition(self, pcv): assert pcv(FunctionDefinition("name", Function([], [Number(5)]))) == True
def visitFunctionDefinition(self, definition): return FunctionDefinition( definition.name, Function(definition.function.args, self.visitInnerExprs(definition.function.body)))