89 lines
2.8 KiB
Dart
89 lines
2.8 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:slrpg_app/src/shared/domain/logic/plate_calculator.dart';
|
|
|
|
void main() {
|
|
group('PlateCalculator', () {
|
|
final plates = [20.0, 10.0, 5.0, 2.5, 1.25];
|
|
final bands = {'Green': 20.0, 'Blue': 10.0};
|
|
|
|
test('Calculates barbell plates correctly', () {
|
|
// Target 70kg, Bar 20kg -> Need 50kg -> 25kg per side -> 20 + 5
|
|
final result = PlateCalculator.calculate(
|
|
targetWeight: 70.0,
|
|
barWeight: 20.0,
|
|
availablePlates: plates,
|
|
isTwoSided: true,
|
|
);
|
|
|
|
expect(result.success, true);
|
|
expect(result.plateConfiguration, [20.0, 5.0]);
|
|
expect(result.totalAchieved, 70.0);
|
|
});
|
|
|
|
test('Calculates belt weight correctly (One Sided)', () {
|
|
// Need 30kg added -> 20 + 10
|
|
final result = PlateCalculator.calculate(
|
|
targetWeight: 110.0, // 80 BW + 30 Added
|
|
barWeight: 80.0, // BW
|
|
availablePlates: plates,
|
|
isTwoSided: false,
|
|
);
|
|
|
|
expect(result.success, true);
|
|
expect(result.plateConfiguration, [20.0, 10.0]);
|
|
expect(result.totalAchieved, 110.0);
|
|
});
|
|
|
|
test('Band Selection: Correct band chosen', () {
|
|
// Need -10kg support
|
|
final result = PlateCalculator.calculate(
|
|
targetWeight: 70.0,
|
|
barWeight: 80.0, // BW
|
|
availablePlates: plates,
|
|
availableBands: bands,
|
|
isTwoSided: false,
|
|
);
|
|
|
|
expect(result.success, true);
|
|
expect(result.plateConfiguration, isEmpty);
|
|
expect(result.bandAssistance, 'Blue'); // 10kg band
|
|
expect(result.totalAchieved, 70.0);
|
|
});
|
|
|
|
test('Smart Switch: Bodyweight is better than oversized band', () {
|
|
// Need -2kg support. Smallest band is 10kg.
|
|
// With band: -10kg (8kg error). Without band: 0kg (2kg error).
|
|
// Should choose Bodyweight Only.
|
|
|
|
final result = PlateCalculator.calculate(
|
|
targetWeight: 78.0,
|
|
barWeight: 80.0,
|
|
availablePlates: plates,
|
|
availableBands: {'BigBand': 10.0},
|
|
isTwoSided: false,
|
|
);
|
|
|
|
expect(result.success, true);
|
|
expect(result.bandAssistance, null); // No band!
|
|
expect(result.message, contains('Bodyweight Only'));
|
|
});
|
|
|
|
test('Rounding Logic handles uneven weights', () {
|
|
// Need 9kg. Smallest plate 1.25.
|
|
// 9 / 1.25 = 7.2. Should round to 7 * 1.25 = 8.75kg or 8 * 1.25 = 10kg.
|
|
// 8.75 is closer (0.25 diff) than 10 (1.0 diff).
|
|
|
|
final result = PlateCalculator.calculate(
|
|
targetWeight: 29.0,
|
|
barWeight: 20.0,
|
|
availablePlates: [1.25], // Only small plates
|
|
isTwoSided: false, // Belt
|
|
);
|
|
|
|
// Needed 9.0. Found 8.75 (7x 1.25). Total 28.75.
|
|
expect(result.success, true);
|
|
expect(result.totalAchieved, 28.75);
|
|
expect(result.plateConfiguration.length, 7);
|
|
});
|
|
});
|
|
}
|