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(
GetAirQualityDistributionParam param,
) async {
return List.generate(30, (index) {
final date = DateTime(2025, 5, 1).add(Duration(days: index));
return Future.delayed(
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(
date: date,
good: values[0],
moderate: values[1],
poor: values[2],
unhealthy: values[3],
severe: values[4],
hazardous: values[5],
);
// If all values are null, force at least one to be non-null
if (nullMask.every((isNull) => isNull)) {
nullMask[_random.nextInt(6)] = false;
}
// Redistribute percentages among non-null values
final nonNullValues = _redistributePercentages(values, nullMask);
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() {
final values = List.generate(6, (_) => _random.nextDouble());