예제 #1
0
    def test_question_parsing(self):
        def format_question(q, n, var_type):
            return "\"{}\" {}: {}".format(q, n, var_type)

        question = "Did you sell a house in 2010?"
        name = "hasSoldHouse"
        q_type = AST.BoolTypeNode()
        q_str = format_question(question, name, "boolean")
        test_node = AST.QuestionNode(question, name, q_type)
        self.validate_node(self.q_parser, q_str, test_node)

        question = "Did you sell a house in 2010?"
        q_type = AST.IntTypeNode()
        q_str = format_question(question, name, "integer")
        test_node = AST.QuestionNode(question, name, q_type)
        self.validate_node(self.q_parser, q_str, test_node)

        question = "question?"
        name = "decimalVar"
        q_type = AST.DecimalTypeNode()
        q_str = format_question(question, name, "decimal")
        test_node = AST.QuestionNode(question, name, q_type)
        self.validate_node(self.q_parser, q_str, test_node)

        question_str = "name: \"question?\" boolean "
        self.check_parse_exception(self.q_parser, question_str,
                                   pp.ParseException)
        question_str = "\"question\" name boolean "
        self.check_parse_exception(self.q_parser, question_str,
                                   pp.ParseException)
        question_str = "\"question?\" boolean: name"
        self.check_parse_exception(self.q_parser, question_str,
                                   pp.ParseException)
예제 #2
0
    def testUndefinedExpr(self):
        expr = "var * 10"
        self.env.add_var(AST.QuestionNode("q", AST.VarNode("var"), "money"))
        parse_res = self.exp_parser.parseString(expr, parseAll=True)[0]
        self.assertEqual(parse_res.accept(self.evaluator), Undefined)

        self.env.set_var_value("var", decimal.Decimal("10"))
        self.assertEqual(parse_res.accept(self.evaluator),
                         decimal.Decimal("100"))
        self.env.clear_env()
예제 #3
0
    def test_conditionalIfElse(self):
        if_expr = AST.VarNode("var")
        if_block_question = AST.QuestionNode("q?", "var", AST.BoolTypeNode())
        if_block = AST.BlockNode([if_block_question])
        if_else_cond = AST.IfElseNode(if_expr, if_block, if_block)

        parse_str = 'if (var) { "q?" var : boolean } else { "q?" var : boolean}'
        self.validate_node(self.cond_parser, parse_str, if_else_cond)

        self.check_parse_exception(self.cond_parser, 'if (var) {',
                                   pp.ParseException)
예제 #4
0
    def test_parse_form(self):
        form1 = """
                form TestForm {
                    "question1?" var1 : money
                    if (var1 > 200) {
                        "question2?" var2 : string
                    }
                }
                """

        q1 = AST.QuestionNode("question1?", "var1", AST.MoneyTypeNode())
        q2 = AST.QuestionNode("question2?", "var2", AST.StringTypeNode())
        expr = AST.GTNode(AST.VarNode("var1"), AST.IntNode(int("200")))
        if_block = AST.IfNode(expr, AST.BlockNode([q2]))
        form_block = AST.BlockNode([q1, if_block])
        form_node = AST.FormNode("TestForm", form_block)
        form_node = AST.QuestionnaireAST(form_node)
        self.validate_node(self.parser.grammar, form1, form_node)

        form2 = """
                form TestForm {
                    "question1?" var1 : money
                    if (var1 > 200) {
                        "question2?" var2 : string
                    }
                    else {
                        "question1?" var1 : money
                    }
                    "question2?" var2 : string
                }
                """

        if_else_block = AST.IfElseNode(expr, AST.BlockNode([q2]),
                                       AST.BlockNode([q1]))
        form_block2 = AST.BlockNode([q1, if_else_block, q2])
        form_node = AST.FormNode("TestForm", form_block2)
        form_node = AST.QuestionnaireAST(form_node)
        self.validate_node(self.parser.grammar, form2, form_node)