feat: add angle and force units, correct unit references and tests

This commit is contained in:
Álvaro González 2025-09-21 16:44:48 +02:00 committed by Álvaro González (aider)
parent d3dce8794c
commit e593c997cb
3 changed files with 11 additions and 49 deletions

View file

@ -10,15 +10,16 @@ Future<Corpus> createDefaultCorpus() async{
Future<void> loadUnits() async {
final unitResources = [
"lib/defaults/units/angle.d4rt.units",
"lib/defaults/units/area.d4rt.units",
"lib/defaults/units/distance.d4rt.units",
"lib/defaults/units/energy.d4rt.units",
"lib/defaults/units/force.d4rt.units",
"lib/defaults/units/mass.d4rt.units",
"lib/defaults/units/pressure.d4rt.units",
"lib/defaults/units/temperature.d4rt.units",
"lib/defaults/units/velocity.d4rt.units",
"lib/defaults/units/mass.d4rt.units",
"lib/defaults/units/time.d4rt.units",
"lib/defaults/units/angle.d4rt.units",
"lib/defaults/units/velocity.d4rt.units",
];
for (final unitRes in unitResources) {

View file

@ -81,7 +81,7 @@ Where:
{"name": "v", "unit": "meters per second"}, // Initial velocity
{"name": "θ", "unit": "degree"} // Launch angle
],
"output": {"name": "R", "unit": "m"}, // Horizontal distance
"output": {"name": "R", "unit": "meter"}, // Horizontal distance
"d4rtCode": "R = (pow(v, 2) * sin(2 * radians(θ))) / 9.80665",
"tags": ["physics", "kinematics", "projectile"]
},

View file

@ -64,10 +64,10 @@ void main() {
final setLiteral = {
"name": "Newton's second law",
"input": [
{"name": 'm', "magnitude": 'mass'},
{"name": 'a', "magnitude": 'acceleration'},
{"name": 'm', "unit": 'kilogram'},
{"name": 'a', "unit": 'meters per square second'},
],
"output": {"name": 'F', "magnitude": 'force'},
"output": {"name": 'F', "unit": 'newton'},
"d4rtCode": '''
F = a * m;
''',
@ -89,10 +89,10 @@ void main() {
{
"name": "Newton's second law",
"input": [
{ "name": 'm', "magnitude": 'mass'},
{ "name": 'a', "magnitude": 'acceleration'}
{ "name": 'm', "unit": 'kilogram'},
{ "name": 'a', "unit": 'meters per square second'}
],
"output": { "name": 'F', "magnitude": 'force'},
"output": { "name": 'F', "unit": 'newton'},
"d4rtCode": '''
F = a * m;
'''
@ -110,44 +110,5 @@ void main() {
expect(result, 98.0); // F = m * a = 10 * 9.8 = 98 N
});
test('d4rt parses formula from list literal', () {
final literal = """
[
{
"name": "Newton's second law",
"input": [
{ "name": 'm', "magnitude": 'mass'},
{ "name": 'a', "magnitude": 'acceleration'}
],
"output": { "name": 'F', "magnitude": 'force'},
"d4rtCode": '''
F = a * m;
'''
},
{
"name": "Newton's second law, again",
"input": [
{ "name": 'mass', "magnitude": 'mass'},
{ "name": 'acc', "magnitude": 'acceleration'}
],
"output": { "name": 'force', "magnitude": 'force'},
"d4rtCode": '''
force = mass * acc;
'''
}
]
""";
final formulas = Formula.fromArrayStringLiteral(literal);
final evaluator = FormulaEvaluator();
final formula = formulas[0];
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
});
}