def test__integration(self): for i, (rule, wmes, exp_len, var, exp_val) in enumerate([ (Rule(Has('spu:1', 'price', '$x'), Filter('$x>100'), Filter('$x<200')), [WME('spu:1', 'price', '100'), WME('spu:1', 'price', '150'), WME('spu:1', 'price', '300')], 1, '$x', '150'), (Rule(Has('spu:1', 'price', '$x'), Filter('$x>200 and $x<400')), [WME('spu:1', 'price', '100'), WME('spu:1', 'price', '150'), WME('spu:1', 'price', '300')], 1, '$x', '300'), (Rule(Has('spu:1', 'price', '$x'), Filter('$x>300')), [WME('spu:1', 'price', '100'), WME('spu:1', 'price', '150'), WME('spu:1', 'price', '300')], 0, None, None), ]): with self.subTest(i=i, exp_len=exp_len, var=var, exp_val=exp_val): network = Network() production = network.add_production(rule) for wme in wmes: network.add_wme(wme) assert_that(production.memory, 'filter').is_length(exp_len) if production.memory: token = production.memory[0] assert_that(token.get_binding(var), 'filter').is_equal_to(exp_val)
def parse_xml(s): root = ET.fromstring(s) result = [] for production in root: lhs = Rule() lhs.extend(parsing(production[0])) rhs = production[1].attrib result.append((lhs, rhs)) return result
def test__integration(self): for i, (rule, wmes, exp_len, var, exp_val) in enumerate([ (Rule(Has('spu:1', 'sales', '$x'), Bind('len(set($x) & set(range(1, 100)))', '$num'), Filter('$num > 0')),[WME('spu:1', 'sales', 'range(50, 110)')], 1, '$num', 50), (Rule(Has('spu:1', 'sales', '$x'), Bind('len(set($x) & set(range(100, 200)))', '$num'), Filter('$num > 0')),[WME('spu:1', 'sales', 'range(50, 110)')], 1, '$num', 10), (Rule(Has('spu:1', 'sales', '$x'), Bind('len(set($x) & set(range(300, 400)))', '$num'), Filter('$num > 0')),[WME('spu:1', 'sales', 'range(50, 110)')], 0, None, None), ]): with self.subTest(i=i, exp_len=exp_len, var=var, exp_val=exp_val): network = Network() production = network.add_production(rule) for wme in wmes: network.add_wme(wme) assert_that(production.memory, 'filter').is_length(exp_len) if production.memory: token = production.memory[0] assert_that(token.get_binding(var), 'filter').is_equal_to(exp_val)
def test_bind(): net = Network() c0 = Has('spu:1', 'sales', '$x') b0 = Bind('len(set($x) & set(range(1, 100)))', '$num') f0 = Filter('$num > 0') p0 = net.add_production(Rule(c0, b0, f0)) b1 = Bind('len(set($x) & set(range(100, 200)))', '$num') p1 = net.add_production(Rule(c0, b1, f0)) b2 = Bind('len(set($x) & set(range(300, 400)))', '$num') p2 = net.add_production(Rule(c0, b2, f0)) net.add_wme(WME('spu:1', 'sales', 'range(50, 110)')) assert len(p0.items) == 1 assert len(p1.items) == 1 assert len(p2.items) == 0 t0 = p0.items[0] t1 = p1.items[0] assert t0.get_binding('$num') == 50 assert t1.get_binding('$num') == 10
def test__parse_xml(self): for i, (name, exp) in enumerate([ ('example.xml', Rule(Has('$x', 'on', '$y'), Bind('1+1', '$test'), Filter('$y != "table"'), Ncc(Has('$z', 'color', 'red'), Has('$z', 'on', '$w')))), ]): with self.subTest(i=i, name=name, exp=exp): with open(os.path.join(FIXTURES, 'example.xml'), 'r') as file: content = file.read() result = parse_xml(content)[0][0] assert_that(result, 'parse_xml').is_equal_to(exp)
def test_filter_compare(): net = Network() c0 = Has('spu:1', 'price', '$x') f0 = Filter('$x>100') f1 = Filter('$x<200') f2 = Filter('$x>200 and $x<400') f3 = Filter('$x>300') p0 = net.add_production(Rule(c0, f0, f1)) p1 = net.add_production(Rule(c0, f2)) p2 = net.add_production(Rule(c0, f3)) net.add_wme(WME('spu:1', 'price', '100')) net.add_wme(WME('spu:1', 'price', '150')) net.add_wme(WME('spu:1', 'price', '300')) assert len(p0.items) == 1 token = p0.items.pop() assert token.get_binding('$x') == '150' assert len(p1.items) == 1 token = p1.items.pop() assert token.get_binding('$x') == '300' assert not p2.items
def test_xml(): s = """<?xml version="1.0"?> <data version="0.0.2"> <production> <lhs> <has identifier="$x" attribute="on" value="$y" /> <bind to="$test">1+1</bind> <filter>$y != "table"</filter> <ncc> <has identifier="$z" attribute="color" value="red" /> <has identifier="$z" attribute="on" value="$w" /> </ncc> </lhs> <rhs></rhs> </production> </data>""" result = parse_xml(s) assert result[0][0] == Rule( Has('$x', 'on', '$y'), Bind('1+1', '$test'), Filter('$y != "table"'), Ncc(Has('$z', 'color', 'red'), Has('$z', 'on', '$w')))