randomize generated fake data in FakeAirQualityDistributionService.

This commit is contained in:
Faris Armoush
2025-06-01 13:11:29 +03:00
parent c50ed693ae
commit 2e12d73151

View File

@ -11,23 +11,54 @@ class FakeAirQualityDistributionService implements AirQualityDistributionService
Future<List<AirQualityDataModel>> getAirQualityDistribution( Future<List<AirQualityDataModel>> getAirQualityDistribution(
GetAirQualityDistributionParam param, GetAirQualityDistributionParam param,
) async { ) async {
return List.generate(30, (index) { return Future.delayed(
final date = DateTime(2025, 5, 1).add(Duration(days: index)); const Duration(milliseconds: 400),
() => List.generate(30, (index) {
final date = DateTime(2025, 5, 1).add(Duration(days: index));
final values = _generateRandomPercentages(); final values = _generateRandomPercentages();
final nullMask = List.generate(6, (_) => _shouldBeNull());
return AirQualityDataModel( // If all values are null, force at least one to be non-null
date: date, if (nullMask.every((isNull) => isNull)) {
good: values[0], nullMask[_random.nextInt(6)] = false;
moderate: values[1], }
poor: values[2],
unhealthy: values[3], // Redistribute percentages among non-null values
severe: values[4], final nonNullValues = _redistributePercentages(values, nullMask);
hazardous: values[5],
); return AirQualityDataModel(
date: date,
good: nullMask[0] ? null : nonNullValues[0],
moderate: nullMask[1] ? null : nonNullValues[1],
poor: nullMask[2] ? null : nonNullValues[2],
unhealthy: nullMask[3] ? null : nonNullValues[3],
severe: nullMask[4] ? null : nonNullValues[4],
hazardous: nullMask[5] ? null : nonNullValues[5],
);
}),
);
}
List<double> _redistributePercentages(
List<double> originalValues, List<bool> nullMask) {
// Calculate total of non-null values
double nonNullSum = 0;
for (int i = 0; i < originalValues.length; i++) {
if (!nullMask[i]) {
nonNullSum += originalValues[i];
}
}
// Redistribute percentages to maintain 100% total
return List.generate(originalValues.length, (i) {
if (nullMask[i]) return 0;
return (originalValues[i] / nonNullSum * 100).roundToDouble();
}); });
} }
bool _shouldBeNull() => _random.nextDouble() < 0.6;
List<double> _generateRandomPercentages() { List<double> _generateRandomPercentages() {
final values = List.generate(6, (_) => _random.nextDouble()); final values = List.generate(6, (_) => _random.nextDouble());