def test_diff_math_funcs_(self): self.assertFalse( ast_equal( ast.Program( ast.Body([ ast.Trigger( ast.Var("source"), ast.MathFuncs([ast.Increment(ast.Var("count"))])) ])), ast.Program( ast.Body([ ast.Trigger( ast.Var("source"), ast.MathFuncs([ast.Decrement(ast.Var("count"))])) ]))))
def example_1() -> ast.Program: """ Instantiates program example 1 as a native AST """ return ast.Program( ast.Body([ # source = live remote "www.coviddata.com/stream" ast.Loader(ast.Var("source"), ast.Source("www.coviddata.com/stream")), # map source "case_date" to number date ast.Mapper(ast.Var("source"), "case_date", ast.Declare(ast.Type(Types.NUMBER), ast.Var("date"))), # number count = 0 ast.Assigner(ast.Declare(ast.Type(Types.NUMBER), ast.Var("count")), ast.Value(IntegerValue(0))), # on new data from source count++ ast.Trigger(ast.Var("source"), ast.MathFuncs([ast.Increment(ast.Var( "count"))])), # plot xy date age titled age_graph ast.Plotter(ast.Graph(ScatterXYGraph()), ast.VarAxis(ast.Var("date")), ast.VarAxis(ast.Var("age")), "age_graph"), # plot line xy date log(count) titled cases_log ast.Plotter(ast.Graph(LineXYGraph()), ast.VarAxis(ast.Var("date")), ast.FuncAxis(ast.BuiltinFunc(NumFunction.LOG, ast.Var( "count"))), "age_graph"), ]))
def parseMathFuncs(self) -> ast.MathFuncs: functions = [] line = self.tokenizer.get_line(',') functions.append(self.parseFunc(line)) next_token = self.tokenizer.get_next() while(next_token not in ['\n', ';'] and next_token == ','): line = self.tokenizer.get_line(',') functions.append(self.parseFunc(line)) next_token = self.tokenizer.get_next() return ast.MathFuncs(functions)
def test_invalid_host(self): e = Evaluator() p = ast.Program( ast.Body([ ast.Loader(ast.Var("source"), ast.Source("https://covid-apiiii.com/api/reports")), ast.Trigger(ast.Var("source"), ast.MathFuncs([ast.Increment(ast.Var( "count"))])), ])) code, err = e.evaluate(p, duration=4000) self.assertNotEqual(0, code) self.assertTrue(isinstance(err, DataLoaderError))
def test_simple_func_baseline(self): e = Evaluator() p = ast.Program( ast.Body([ ast.Loader(ast.Var("source"), ast.Source("https://covid-api.com/api/reports")), ast.Assigner(ast.Declare(ast.Type(Types.NUMBER), ast.Var("count")), ast.Value(IntegerValue(20))), ast.Trigger(ast.Var("source"), ast.MathFuncs([])), ])) code, err = e.evaluate(p, duration=7000) self.assertEqual(0, code) self.assertEqual(20, cast(IntegerValue, e.env.get_val("count")).value)
def test_valid_source(self): e = Evaluator() p = ast.Program( ast.Body([ ast.Loader(ast.Var("source"), ast.Source("https://covid-api.com/api/reports")), ast.Assigner(ast.Declare(ast.Type(Types.NUMBER), ast.Var("count")), ast.Value(IntegerValue(0))), ast.Trigger(ast.Var("source"), ast.MathFuncs([ast.Increment(ast.Var( "count"))])), ])) code, err = e.evaluate(p, duration=4000) self.assertEqual(0, code)
def test_pow_overflow(self): e = Evaluator() p = ast.Program( ast.Body([ ast.Loader(ast.Var("source"), ast.Source("https://covid-api.com/api/reports")), ast.Assigner(ast.Declare(ast.Type(Types.NUMBER), ast.Var("count")), ast.Value(FloatValue(1.1))), ast.Trigger(ast.Var("source"), ast.MathFuncs([ast.SimpleFunc( ast.Var("count"), ast.Operand(ConcreteNumOp.EXP), ast.Value(IntegerValue(2)))])), ])) code, err = e.evaluate(p, duration=10000) self.assertNotEqual(0, code)
def test_regular(self): p_expected: ast.Program = ast.Program( ast.Body([ # source = live remote "https://covid-api.com/api/reports" ast.Loader(ast.Var("source"), ast.Source("https://covid-api.com/api/reports")), # map source "confirmed" to number confirmed ast.Mapper( ast.Var("source"), "confirmed", ast.Declare(ast.Type(Types.NUMBER), ast.Var("confirmed"))), # number count = 0 ast.Assigner( ast.Declare(ast.Type(Types.NUMBER), ast.Var("count")), ast.Value(values.IntegerValue(0))), # observe(source) do count++ ast.Trigger(ast.Var("source"), ast.MathFuncs([ast.Increment(ast.Var("count"))])), # plot line_xy(count,confirmed) called "confirmed_cases" ast.Plotter(ast.Graph(graphs.LineXYGraph()), ast.VarAxis(ast.Var("count")), ast.VarAxis(ast.Var("confirmed")), "confirmed_cases"), ])) def parse(content) -> ast.Program: t = Tokenizer(content) t.tokenize() return Parser(t).parseProgram() p: ast.Program = read_program_file( "tests/res/programs/regular_program.mstx", parse) self.assertTrue(ast_equal(p_expected, p))
def test_regular_program(self): """ Should successfully create a plot and update with new values """ print("Testing a full program") p = ast.Program( ast.Body([ # source = live remote "https://covid-api.com/api/reports" ast.Loader(ast.Var("source"), ast.Source("https://covid-api.com/api/reports")), # map source "confirmed" to number confirmed ast.Mapper( ast.Var("source"), "confirmed", ast.Declare(ast.Type(Types.NUMBER), ast.Var("confirmed"))), # number count = 0 ast.Assigner( ast.Declare(ast.Type(Types.NUMBER), ast.Var("count")), ast.Value(values.IntegerValue(0))), # observe(source) do count++ ast.Trigger(ast.Var("source"), ast.MathFuncs([ast.Increment(ast.Var("count"))])), # plot line_xy(count,confirmed) called "confirmed_cases" ast.Plotter(ast.Graph(graphs.LineXYGraph()), ast.VarAxis(ast.Var("count")), ast.VarAxis(ast.Var("confirmed")), "confirmed_cases"), ])) e = Evaluator(graphics=True) code, err = e.evaluate(p, duration=7000) self.assertEqual(0, code)