From 13c31dffe3e53be5da2b2ed33209d8098c342769 Mon Sep 17 00:00:00 2001 From: Pieter Delobelle Date: Fri, 31 Aug 2018 10:48:58 +0200 Subject: [PATCH] Added support for #3 --- CHANGELOG.md | 1 + README.md | 2 ++ lib/src/rule.dart | 1 + test/symbol_test.dart | 64 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+) create mode 100644 test/symbol_test.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index c7a3ad5..ac69e25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## [0.0.3] - 31/08/2018 +- Added one environmental symbol (`$ruleName`) - Removed unnecessary output ## [0.0.2] - 30/08/2018 diff --git a/README.md b/README.md index 59bd619..9c076e5 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,8 @@ So each clause matches one type of fact, followed by zero or more conditions or In the above clause, the attribute `amount` is assigned to a symbol with name `$amount`. + For convenience, the rule name is by default available as `$ruleName`, this can be overwritten. Support for additional variables is planned, but not yet implemented. + - **Conditions**: both sides have to be comparable, and the condition should be true for the clause to finish. The environment supports equality for strings, numbers and objects and comparisons for numbers. diff --git a/lib/src/rule.dart b/lib/src/rule.dart index bd52d0e..c3701da 100644 --- a/lib/src/rule.dart +++ b/lib/src/rule.dart @@ -23,6 +23,7 @@ class Rule { bool firstFact = true; Map clauseMap = new Map(); Map _symbolTable = new Map(); + _symbolTable["\$ruleName"] = _name; var iterator = _clauses.iterator; while (iterator.moveNext()) { diff --git a/test/symbol_test.dart b/test/symbol_test.dart new file mode 100644 index 0000000..3c5ad1d --- /dev/null +++ b/test/symbol_test.dart @@ -0,0 +1,64 @@ +import 'package:rule_engine/src/fact.dart'; +import 'package:rule_engine/rule_engine.dart'; +import 'package:test/test.dart'; + +void _basicTest() { + String code = r""" +rule "Bob saved some money" + when + not Achievement( title == $ruleName ) + Expense( amount > 10, $amount: amount ) + then + publish Achievement( "01", $ruleName, $amount ) +end +"""; + var ruleEngine = new RuleEngine(code); + + var results = new List(); + ruleEngine.registerListener((t, a) { + if (t == "Achievement") results.add(new Achievement(a[0], a[1], a[2])); + }); + + ruleEngine.insertFact(new Expense("Bob", 1000, "Cheese", new DateTime.now())); + expect(results.length, equals(1)); + expect(results[0].attributeMap()["title"], "Bob saved some money"); + ruleEngine.insertFact(new Achievement("01", "Bob saved some money", 100)); + + ruleEngine.insertFact(new Expense("Bob", 2000, "Cheese", new DateTime.now())); + expect(results.length, equals(1)); +} + +void main() { + test('Test symbol of rule name', _basicTest); +} + +class Expense extends Fact { + Map attributes = new Map(); + + Expense(name, amount, category, created) { + attributes["name"] = name; + attributes["amount"] = amount; + attributes["category"] = category; + attributes["created"] = created; + } + + @override + Map attributeMap() { + return attributes; + } +} + +class Achievement extends Fact { + Map attributes = new Map(); + + Achievement(badge, title, descr) { + attributes["badge"] = badge; + attributes["title"] = title; + attributes["descr"] = descr; + } + + @override + Map attributeMap() { + return attributes; + } +}