Skip to content

Commit 0b7c628

Browse files
authored
[LOOP-4470] correctly round recommended bolus (#546)
* correctly round recommended bolus * fixed unit tests
1 parent 56ceced commit 0b7c628

File tree

3 files changed

+13
-7
lines changed

3 files changed

+13
-7
lines changed

Loop/View Models/BolusEntryViewModel.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -687,18 +687,23 @@ final class BolusEntryViewModel: ObservableObject {
687687
private func updateRecommendedBolusAndNotice(from state: LoopState, isUpdatingFromUserInput: Bool) {
688688
dispatchPrecondition(condition: .notOnQueue(.main))
689689

690+
guard let delegate = delegate else {
691+
assertionFailure("Missing BolusEntryViewModelDelegate")
692+
return
693+
}
694+
690695
let now = Date()
691696
var recommendation: ManualBolusRecommendation?
692697
let recommendedBolus: HKQuantity?
693698
let notice: Notice?
694699
do {
695700
recommendation = try computeBolusRecommendation(from: state)
696701
if let recommendation = recommendation {
697-
recommendedBolus = HKQuantity(unit: .internationalUnit(), doubleValue: recommendation.amount)
702+
recommendedBolus = HKQuantity(unit: .internationalUnit(), doubleValue: delegate.roundBolusVolume(units: recommendation.amount))
698703

699704
switch recommendation.notice {
700705
case .glucoseBelowSuspendThreshold:
701-
if let suspendThreshold = delegate?.settings.suspendThreshold {
706+
if let suspendThreshold = delegate.settings.suspendThreshold {
702707
notice = .predictedGlucoseBelowSuspendThreshold(suspendThreshold: suspendThreshold.quantity)
703708
} else {
704709
notice = nil

Loop/Views/BolusEntryView.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ struct BolusEntryView: View {
273273
private static let doseAmountFormatter: NumberFormatter = {
274274
let quantityFormatter = QuantityFormatter()
275275
quantityFormatter.setPreferredNumberFormatter(for: .internationalUnit())
276+
quantityFormatter.numberFormatter.roundingMode = .down
276277
return quantityFormatter.numberFormatter
277278
}()
278279

LoopTests/ViewModels/BolusEntryViewModelTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ class BolusEntryViewModelTests: XCTestCase {
299299
XCTAssertTrue(bolusEntryViewModel.isBolusRecommended)
300300
let recommendedBolus = bolusEntryViewModel.recommendedBolus
301301
XCTAssertNotNil(recommendedBolus)
302-
XCTAssertEqual(mockState.bolusRecommendationResult?.amount, recommendedBolus?.doubleValue(for: .internationalUnit()))
302+
XCTAssertEqual(delegate.roundBolusVolume(units: mockState.bolusRecommendationResult!.amount), recommendedBolus?.doubleValue(for: .internationalUnit()))
303303
let consideringPotentialCarbEntryPassed = try XCTUnwrap(mockState.consideringPotentialCarbEntryPassed)
304304
XCTAssertEqual(mockPotentialCarbEntry, consideringPotentialCarbEntryPassed)
305305
let replacingCarbEntryPassed = try XCTUnwrap(mockState.replacingCarbEntryPassed)
@@ -316,7 +316,7 @@ class BolusEntryViewModelTests: XCTestCase {
316316
XCTAssertTrue(bolusEntryViewModel.isBolusRecommended)
317317
let recommendedBolus = bolusEntryViewModel.recommendedBolus
318318
XCTAssertNotNil(recommendedBolus)
319-
XCTAssertEqual(mockState.bolusRecommendationResult?.amount, recommendedBolus?.doubleValue(for: .internationalUnit()))
319+
XCTAssertEqual(delegate.roundBolusVolume(units: mockState.bolusRecommendationResult!.amount), recommendedBolus!.doubleValue(for: .internationalUnit()))
320320
XCTAssertEqual(BolusEntryViewModel.Notice.predictedGlucoseBelowSuspendThreshold(suspendThreshold: Self.exampleCGMGlucoseQuantity), bolusEntryViewModel.activeNotice)
321321
}
322322

@@ -329,7 +329,7 @@ class BolusEntryViewModelTests: XCTestCase {
329329
XCTAssertTrue(bolusEntryViewModel.isBolusRecommended)
330330
let recommendedBolus = bolusEntryViewModel.recommendedBolus
331331
XCTAssertNotNil(recommendedBolus)
332-
XCTAssertEqual(mockState.bolusRecommendationResult?.amount, recommendedBolus?.doubleValue(for: .internationalUnit()))
332+
XCTAssertEqual(delegate.roundBolusVolume(units: mockState.bolusRecommendationResult!.amount), recommendedBolus!.doubleValue(for: .internationalUnit()))
333333
XCTAssertNil(bolusEntryViewModel.activeNotice)
334334
}
335335

@@ -341,7 +341,7 @@ class BolusEntryViewModelTests: XCTestCase {
341341
XCTAssertTrue(bolusEntryViewModel.isBolusRecommended)
342342
let recommendedBolus = bolusEntryViewModel.recommendedBolus
343343
XCTAssertNotNil(recommendedBolus)
344-
XCTAssertEqual(mockState.bolusRecommendationResult?.amount, recommendedBolus?.doubleValue(for: .internationalUnit()))
344+
XCTAssertEqual(delegate.roundBolusVolume(units: mockState.bolusRecommendationResult!.amount), recommendedBolus!.doubleValue(for: .internationalUnit()))
345345
XCTAssertNil(bolusEntryViewModel.activeNotice)
346346
}
347347

@@ -388,7 +388,7 @@ class BolusEntryViewModelTests: XCTestCase {
388388
XCTAssertTrue(bolusEntryViewModel.isBolusRecommended)
389389
let recommendedBolus = bolusEntryViewModel.recommendedBolus
390390
XCTAssertNotNil(recommendedBolus)
391-
XCTAssertEqual(mockState.bolusRecommendationResult?.amount, recommendedBolus?.doubleValue(for: .internationalUnit()))
391+
XCTAssertEqual(delegate.roundBolusVolume(units: mockState.bolusRecommendationResult!.amount), recommendedBolus!.doubleValue(for: .internationalUnit()))
392392
let consideringPotentialCarbEntryPassed = try XCTUnwrap(mockState.consideringPotentialCarbEntryPassed)
393393
XCTAssertEqual(mockPotentialCarbEntry, consideringPotentialCarbEntryPassed)
394394
let replacingCarbEntryPassed = try XCTUnwrap(mockState.replacingCarbEntryPassed)

0 commit comments

Comments
 (0)