diff --git a/lib/formula_models.dart b/lib/formula_models.dart index 47ddb06..0594c2c 100644 --- a/lib/formula_models.dart +++ b/lib/formula_models.dart @@ -1,8 +1,6 @@ - import 'package:d4rt/d4rt.dart'; class VariableSpec { - final String name; final String magnitude; static final MAGNITUDELESS = "magnitudeless"; @@ -35,7 +33,7 @@ class Formula { required this.input, required this.output, required this.d4rtCode, - }){ + }) { validate(); } @@ -45,7 +43,6 @@ class Formula { } } - @override String toString() => 'Formula(name: $name, input: $input, output: $output, d4rtCode: $d4rtCode)'; @@ -64,25 +61,48 @@ class Formula { int get hashCode => Object.hash(name, ListEquality().hash(input), output, d4rtCode); - List inputVarNames() => input.map( (v) => v.name ).toList(growable: false); + List inputVarNames() => + input.map((v) => v.name).toList(growable: false); - factory Formula.fromSetLiteral(Map set ) { + factory Formula.fromSet(Map theSet) { - VariableSpec parseVar(Map varSpec ){ - String name = varSpec.get("name"); - String magnitude = varSpec.get("magnitude"); - return VariableSpec(name: name, magnitude: magnitude); + Object safeGet(Map map, String key){ + if( !map.containsKey(key) ){ + throw ArgumentError( "Key not found: $key -- $map" ); } + return map[key] ?? "Not possible!!!"; + } - 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"); + String stringValue(Map map, String key){ + return safeGet(map, key).toString(); + } - return new Formula(name:name, input:input, output:output, d4rtCode:d4rtCode ); + List listValue(Map map, String key){ + return safeGet(map,key) as List; + } + Map mapValue(Map map, String key){ + return safeGet(map,key) as Map; + } + + VariableSpec parseVar(Map varSpec) { + String name = stringValue(varSpec, "name"); + String magnitude = stringValue(varSpec, "magnitude"); + return VariableSpec(name: name, magnitude: magnitude); + } + + String name = stringValue( theSet, "name" ); + final List inputSet = listValue( theSet, "input"); + List input = inputSet.map( (v) => parseVar(v as Map)).toList(growable: false); + Map outputSet = theSet.get("output"); + VariableSpec output = parseVar(outputSet); + String d4rtCode = theSet.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 8fc5121..2d33a1c 100644 --- a/test/formula_models_test.dart +++ b/test/formula_models_test.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:d4rt/d4rt.dart'; import 'package:d4rt_formulas/formula_evaluator.dart'; import 'package:test/test.dart'; import 'package:d4rt_formulas/formula_models.dart'; @@ -19,8 +20,8 @@ void main() { ''' }; - final formula = Formula.fromSetLiteral(setLiteral); - final evaluator = new FormulaEvaluator(); + final formula = Formula.fromSet(setLiteral); + final evaluator = FormulaEvaluator(); final result = evaluator.evaluate(formula, { 'm': 10.0, // 10 kg @@ -30,4 +31,39 @@ void main() { expect(result, 98.0); // F = m * a = 10 * 9.8 = 98 N }); + test( 'd4rt parses formula from literal', (){ + final literal = """ + { + "name": "Newton's second law", + "input": [ + { "name": 'm', "magnitude": 'mass'}, + { "name": 'a', "magnitude": 'acceleration'} + ], + "output": { "name": 'F', "magnitude": 'force'}, + "d4rtCode": ''' + return a * m; + ''' + } + """; + + var d4rt = D4rt(); + final buffer = StringBuffer(); + buffer.write( "main(){ return $literal; }"); + final code = buffer.toString(); + + final Map setLiteral = d4rt.execute(source: code); + + final formula = Formula.fromSet(setLiteral); + final evaluator = 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 + + }); + } +