d4t_formulas/test/physics_trigonometry_formulas_test.dart
2026-02-07 16:16:00 +01:00

159 lines
No EOL
5 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:d4rt_formulas/corpus.dart';
import 'package:d4rt_formulas/defaults/default_corpus.dart';
import 'package:d4rt_formulas/formula_evaluator.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:d4rt_formulas/formula_models.dart';
void main() {
TestWidgetsFlutterBinding.ensureInitialized();
Future<Corpus> createTestCorpus() async {
return createDefaultCorpus();
}
Future<Corpus> testCorpus = createTestCorpus();
group('Physics Formulas Tests', () {
test('evaluates Mass-Energy Equivalence formula (E=mc²)', () async {
final corpus = await testCorpus;
final formula = corpus.getFormula("Mass-Energy Equivalence")!;
final evaluator = FormulaEvaluator();
// Test with 1 kg of mass
final result = evaluator.evaluate(formula, {
'm': 1.0, // 1 kg
});
// E = mc² = 1 * (299792458)² ≈ 8.98755179 × 10^16 Joules
expect(result, closeTo(8.98755179e16, 1e12));
});
test('evaluates Ohm\'s Law formula (V=IR)', () async {
final corpus = await testCorpus;
final formula = corpus.getFormula("Ohm's Law")!;
final evaluator = FormulaEvaluator();
// Test with 2 amperes and 5 ohms
final result = evaluator.evaluate(formula, {
'I': 2.0, // 2 Amperes
'R': 5.0, // 5 Ohms
});
// V = I * R = 2 * 5 = 10 Volts
expect(result, 10.0);
});
test('evaluates Hooke\'s Law formula (F=-kx)', () async {
final corpus = await testCorpus;
final formula = corpus.getFormula("Hooke's Law")!;
final evaluator = FormulaEvaluator();
// Test with spring constant k=100 N/m and displacement x=0.5 m
final result = evaluator.evaluate(formula, {
'k': 100.0, // 100 N/m
'x': 0.5, // 0.5 m
});
// F = -k * x = -100 * 0.5 = -50 N
expect(result, -50.0);
});
test('evaluates Centripetal Force formula (F=mv²/r)', () async {
final corpus = await testCorpus;
final formula = corpus.getFormula("Centripetal Force")!;
final evaluator = FormulaEvaluator();
// Test with m=10 kg, v=5 m/s, r=2 m
final result = evaluator.evaluate(formula, {
'm': 10.0, // 10 kg
'v': 5.0, // 5 m/s
'r': 2.0, // 2 m
});
// F = (m * v²) / r = (10 * 25) / 2 = 250 / 2 = 125 N
expect(result, 125.0);
});
test('evaluates Wave Equation formula (v=fλ)', () async {
final corpus = await testCorpus;
final formula = corpus.getFormula("Wave Equation")!;
final evaluator = FormulaEvaluator();
// Test with frequency f=50 Hz and wavelength λ=2 m
final result = evaluator.evaluate(formula, {
'f': 50.0, // 50 Hz
'lambda': 2.0, // 2 m
});
// v = f * λ = 50 * 2 = 100 m/s
expect(result, 100.0);
});
});
group('Trigonometry Formulas Tests', () {
test('evaluates Pythagorean Theorem formula (a²+b²=c²)', () async {
final corpus = await testCorpus;
final formula = corpus.getFormula("Pythagorean Theorem")!;
final evaluator = FormulaEvaluator();
// Test with a=3, b=4 (classic 3-4-5 triangle)
final result = evaluator.evaluate(formula, {
'a': 3.0, // 3 m
'b': 4.0, // 4 m
});
// c = √(a² + b²) = √(9 + 16) = √25 = 5
expect(result, 5.0);
});
test('evaluates Sine Rule formula (a/sin A = b/sin B)', () async {
final corpus = await testCorpus;
final formula = corpus.getFormula("Sine Rule")!;
final evaluator = FormulaEvaluator();
// Test with a=5, angle A=30°, angle B=60°
final result = evaluator.evaluate(formula, {
'a': 5.0, // Side a = 5 m
'A': 30.0, // Angle A = 30 degrees
'B': 60.0, // Angle B = 60 degrees
});
// b = (a * sin(B)) / sin(A) = (5 * sin(60°)) / sin(30°)
// b = (5 * 0.866) / 0.5 = 4.33 / 0.5 = 8.66
expect(result, closeTo(8.66, 0.01));
});
test('evaluates Cosine Rule formula (c²=a²+b²-2ab cos C)', () async {
final corpus = await testCorpus;
final formula = corpus.getFormula("Cosine Rule")!;
final evaluator = FormulaEvaluator();
// Test with a=5, b=7, angle C=60°
final result = evaluator.evaluate(formula, {
'a': 5.0, // Side a = 5 m
'b': 7.0, // Side b = 7 m
'C': 60.0, // Angle C = 60 degrees
});
// c = √(a² + b² - 2ab*cos(C))
// c = √(25 + 49 - 2*5*7*cos(60°))
// c = √(74 - 70*0.5) = √(74 - 35) = √39 ≈ 6.24
expect(result, closeTo(6.24, 0.01));
});
test('evaluates Trigonometric Identity formula (sin²θ + cos²θ = 1)', () async {
final corpus = await testCorpus;
final formula = corpus.getFormula("Trigonometric Identity")!;
final evaluator = FormulaEvaluator();
// Test with θ=45°
final result = evaluator.evaluate(formula, {
'theta': 45.0, // 45 degrees
});
// sin²(45°) + cos²(45°) should equal 1
// (≈0.707)² + (≈0.707)² = 0.5 + 0.5 = 1
expect(result, closeTo(1.0, 0.001));
});
});
}