diff --git a/lib/formula_models.dart b/lib/formula_models.dart index 8d48cc8..47ddb06 100644 --- a/lib/formula_models.dart +++ b/lib/formula_models.dart @@ -65,5 +65,24 @@ class Formula { Object.hash(name, ListEquality().hash(input), output, d4rtCode); List inputVarNames() => input.map( (v) => v.name ).toList(growable: false); + + factory Formula.fromSetLiteral(Map set ) { + + VariableSpec parseVar(Map varSpec ){ + String name = varSpec.get("name"); + String magnitude = varSpec.get("magnitude"); + return VariableSpec(name: name, magnitude: magnitude); + } + + String name = set.get("name"); + List> inputSet = set.get("input"); + List input = inputSet.map(parseVar).toList(growable:false); + Map outputSet = set.get("output"); + VariableSpec output = parseVar(outputSet); + String d4rtCode = set.get("d4rtCode"); + + return new Formula(name:name, input:input, output:output, d4rtCode:d4rtCode ); + + } } diff --git a/test/formula_models_test.dart b/test/formula_models_test.dart index 95ce74a..8fc5121 100644 --- a/test/formula_models_test.dart +++ b/test/formula_models_test.dart @@ -1,7 +1,33 @@ import 'dart:convert'; +import 'package:d4rt_formulas/formula_evaluator.dart'; import 'package:test/test.dart'; import 'package:d4rt_formulas/formula_models.dart'; void main() { + + test('Parses Newton\'s second law formula from set literal', () { + final setLiteral = { + "name": "Newton's second law", + "input": [ + { "name": 'm', "magnitude": 'mass'}, + { "name": 'a', "magnitude": 'acceleration'} + ], + "output": { "name": 'F', "magnitude": 'force'}, + "d4rtCode": ''' + return a * m; + ''' + }; + + final formula = Formula.fromSetLiteral(setLiteral); + final evaluator = new FormulaEvaluator(); + + final result = evaluator.evaluate(formula, { + 'm': 10.0, // 10 kg + 'a': 9.8, // 9.8 m/s² + }); + + expect(result, 98.0); // F = m * a = 10 * 9.8 = 98 N + }); + }