def visit_binop(self, binop): # special case 'is defined' pseudo binop if "is defined" == binop.op: return self.is_defined(binop.left) self.result += 1 # visit operands op = binop.op left = self.visit(binop.left) if "||" == op or "&&" == op: right = binop.right else: right = self.visit(binop.right) # hack (sic): ternary if binop.value: value = self.visit(binop.value) else: value = null self.result -= 1 # operate try: return self.visit(left.operate(op, right, value)) except CoercionError as e: # disregard coercion issues in equality # checks, and simply return false if op == "==": return Boolean(False) elif op == "!=": return Boolean(True) raise e
def old_json_function(content, local=None, name_prefix=None, evaluator=None): def convert(content, prefix=None): if prefix: prefix = prefix + "-" else: prefix = "" for key in content: val = content[key] name = prefix + key if isinstance(val, dict): convert(val, name) else: val = coerce(val, raw=False) if val.node_name == "string": val = parse_string(val.string) scope.add(Ident(name_prefix + name, val)) if name_prefix: assert_string(name_prefix, "name_prefix") name_prefix = name_prefix.value else: name_prefix = "" if local: local = local.to_boolean() else: local = Boolean(local) if local.is_true(): scope = evaluator.get_current_scope() else: scope = evaluator.common.scope() convert(content)
def test_string(): assert String("hello", "there").node_name == "string" assert str(String("hello", null)) == "'hello'" assert str(String("hello", "there")) == "therehellothere" assert str(String("hello")) == "'hello'" assert String("hello").to_boolean() == true assert String("z").to_boolean() == Boolean(True) assert String("").to_boolean() == false
def test_boolean(): unit = Unit(1, "Hz") from stilus.nodes.boolean import true assert unit.to_boolean() == true unit = Unit(10) from stilus.nodes.boolean import Boolean assert unit.to_boolean() == Boolean(10)
def test_expression_operate_in(): # empty expression expression = Expression() other_expression = Expression() other_expression.append(Ident("foo")) other_expression.append(Ident("bar")) assert expression.operate("in", other_expression) == Boolean(False) with pytest.raises(StilusError): other_expression.operate("in", expression) == Boolean(True) # same expression expression = Expression() expression.append(Ident("foo")) expression.append(Ident("bar")) assert expression.operate("in", expression) == Boolean(False) # other expression expression = Expression() expression.append(Ident("foo")) expression.append(Ident("bar")) other_expression = Expression() other_expression.append(Ident("bar")) assert other_expression.operate("in", expression) == Boolean(True)
def is_defined(self, node): if "ident" == node.node_name: return Boolean(self.lookup(node.name)) else: raise ParseError(f'invalid "is defined" ' f"check on non-variable {node}")
def test_is_false(): assert Boolean(False).is_false()
def test_is_true(): assert Boolean(True).is_true()
def test_name(): boolean = Boolean(False) assert boolean.node_name == "boolean"
def test_false(): assert false == Boolean(False)
def test_true(): assert true == Boolean(True)
def test_string(): boolean = Boolean(False) assert f"{boolean}" == "false"
def test_negate(): boolean = Boolean(True) assert boolean.negate().is_false()