Fix prediction units and stabilize tests

This commit is contained in:
rhanarmt 2026-06-25 02:30:20 +07:00
parent 119ff3c734
commit e5d75787cf
3 changed files with 82 additions and 30 deletions

View File

@ -387,8 +387,8 @@ class PredictionController extends ChangeNotifier {
}
String formatQuantityWithUnit(double amount, String unit) {
final displayUnit = _displayUnitLabel(unit);
return '${formatQuantity(amount)} $displayUnit';
final display = _displayQuantity(amount, unit);
return '${formatQuantity(display['value'] as double)} ${display['unit'] as String}';
}
String formatStockQuantity(String ingredient, double value) {
@ -415,14 +415,46 @@ class PredictionController extends ChangeNotifier {
String _displayUnitLabel(String unit) {
final normalized = _normalizeUnit(unit);
if (normalized == 'gr') return 'kg';
if (normalized == 'ml') return 'L';
if (normalized == 'gr') return 'gr';
if (normalized == 'ml') return 'ml';
if (normalized == 'l') return 'L';
if (normalized == 'kg') return 'kg';
if (normalized == 'butir') return 'butir';
return unit.trim().isEmpty ? 'unit' : unit.trim();
}
Map<String, dynamic> _displayQuantity(double amount, String unit) {
final normalized = _normalizeUnit(unit);
if (normalized == 'gr') {
if (amount >= 1000) {
return {'value': amount / 1000, 'unit': 'kg'};
}
return {'value': amount, 'unit': 'gr'};
}
if (normalized == 'ml') {
if (amount >= 1000) {
return {'value': amount / 1000, 'unit': 'L'};
}
return {'value': amount, 'unit': 'ml'};
}
if (normalized == 'l') {
return {'value': amount, 'unit': 'L'};
}
if (normalized == 'butir') {
return {'value': amount, 'unit': 'butir'};
}
if (normalized == 'kg') {
return {'value': amount, 'unit': 'kg'};
}
return {'value': amount, 'unit': _displayUnitLabel(unit)};
}
double _toDouble(dynamic value) {
if (value is num) return value.toDouble();
return double.tryParse(value?.toString() ?? '') ?? 0;

View File

@ -156,20 +156,52 @@ class ProductListController extends ChangeNotifier {
}
String formatQuantityWithUnit(double amount, String rawUnit) {
final displayUnit = _displayUnitLabel(rawUnit);
return '${formatStock(amount)} $displayUnit';
final display = _displayQuantity(amount, rawUnit);
return '${formatStock(display['value'] as double)} ${display['unit'] as String}';
}
String _displayUnitLabel(String unit) {
final normalized = _normalizeUnit(unit);
if (normalized == 'pcs' || normalized == 'butir') return 'pcs';
if (normalized == 'gr') return 'kg';
if (normalized == 'ml') return 'L';
if (normalized == 'gr') return 'gr';
if (normalized == 'ml') return 'ml';
if (normalized == 'l') return 'L';
if (normalized == 'kg') return 'kg';
return unit.trim().isEmpty ? 'kg' : unit.trim();
}
Map<String, dynamic> _displayQuantity(double amount, String unit) {
final normalized = _normalizeUnit(unit);
if (normalized == 'gr') {
if (amount >= 1000) {
return {'value': amount / 1000, 'unit': 'kg'};
}
return {'value': amount, 'unit': 'gr'};
}
if (normalized == 'ml') {
if (amount >= 1000) {
return {'value': amount / 1000, 'unit': 'L'};
}
return {'value': amount, 'unit': 'ml'};
}
if (normalized == 'l') {
return {'value': amount, 'unit': 'L'};
}
if (normalized == 'pcs' || normalized == 'butir') {
return {'value': amount, 'unit': 'pcs'};
}
if (normalized == 'kg') {
return {'value': amount, 'unit': 'kg'};
}
return {'value': amount, 'unit': _displayUnitLabel(unit)};
}
String _normalizeUnit(String unit) {
final normalized = unit.trim().toLowerCase();
if (['g', 'gr', 'gram', 'grams'].contains(normalized)) return 'gr';

View File

@ -1,30 +1,18 @@
// This is a basic Flutter widget test.
//
// To perform an interaction with a widget in your test, use the WidgetTester
// utility in the flutter_test package. For example, you can send tap and scroll
// gestures. You can also use WidgetTester to find child widgets in the widget
// tree, read text, and verify that the values of widget properties are correct.
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:finalproject/main.dart';
import 'package:finalproject/theme/app_theme.dart';
void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(const MyApp());
testWidgets('App theme builds', (WidgetTester tester) async {
await tester.pumpWidget(
MaterialApp(
theme: AppTheme.lightTheme(),
home: const Scaffold(body: Center(child: Text('ok'))),
),
);
// Verify that our counter starts at 0.
expect(find.text('0'), findsOneWidget);
expect(find.text('1'), findsNothing);
// Tap the '+' icon and trigger a frame.
await tester.tap(find.byIcon(Icons.add));
await tester.pump();
// Verify that our counter has incremented.
expect(find.text('0'), findsNothing);
expect(find.text('1'), findsOneWidget);
expect(find.text('ok'), findsOneWidget);
expect(find.byType(Scaffold), findsOneWidget);
});
}