Skip to content

Commit

Permalink
[LOOP-4470] correctly round recommended bolus (LoopKit#546)
Browse files Browse the repository at this point in the history
* correctly round recommended bolus

* fixed unit tests
  • Loading branch information
nhamming authored Jan 13, 2023
1 parent 56ceced commit 0b7c628
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 7 deletions.
9 changes: 7 additions & 2 deletions Loop/View Models/BolusEntryViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -687,18 +687,23 @@ final class BolusEntryViewModel: ObservableObject {
private func updateRecommendedBolusAndNotice(from state: LoopState, isUpdatingFromUserInput: Bool) {
dispatchPrecondition(condition: .notOnQueue(.main))

guard let delegate = delegate else {
assertionFailure("Missing BolusEntryViewModelDelegate")
return
}

let now = Date()
var recommendation: ManualBolusRecommendation?
let recommendedBolus: HKQuantity?
let notice: Notice?
do {
recommendation = try computeBolusRecommendation(from: state)
if let recommendation = recommendation {
recommendedBolus = HKQuantity(unit: .internationalUnit(), doubleValue: recommendation.amount)
recommendedBolus = HKQuantity(unit: .internationalUnit(), doubleValue: delegate.roundBolusVolume(units: recommendation.amount))

switch recommendation.notice {
case .glucoseBelowSuspendThreshold:
if let suspendThreshold = delegate?.settings.suspendThreshold {
if let suspendThreshold = delegate.settings.suspendThreshold {
notice = .predictedGlucoseBelowSuspendThreshold(suspendThreshold: suspendThreshold.quantity)
} else {
notice = nil
Expand Down
1 change: 1 addition & 0 deletions Loop/Views/BolusEntryView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,7 @@ struct BolusEntryView: View {
private static let doseAmountFormatter: NumberFormatter = {
let quantityFormatter = QuantityFormatter()
quantityFormatter.setPreferredNumberFormatter(for: .internationalUnit())
quantityFormatter.numberFormatter.roundingMode = .down
return quantityFormatter.numberFormatter
}()

Expand Down
10 changes: 5 additions & 5 deletions LoopTests/ViewModels/BolusEntryViewModelTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ class BolusEntryViewModelTests: XCTestCase {
XCTAssertTrue(bolusEntryViewModel.isBolusRecommended)
let recommendedBolus = bolusEntryViewModel.recommendedBolus
XCTAssertNotNil(recommendedBolus)
XCTAssertEqual(mockState.bolusRecommendationResult?.amount, recommendedBolus?.doubleValue(for: .internationalUnit()))
XCTAssertEqual(delegate.roundBolusVolume(units: mockState.bolusRecommendationResult!.amount), recommendedBolus?.doubleValue(for: .internationalUnit()))
let consideringPotentialCarbEntryPassed = try XCTUnwrap(mockState.consideringPotentialCarbEntryPassed)
XCTAssertEqual(mockPotentialCarbEntry, consideringPotentialCarbEntryPassed)
let replacingCarbEntryPassed = try XCTUnwrap(mockState.replacingCarbEntryPassed)
Expand All @@ -316,7 +316,7 @@ class BolusEntryViewModelTests: XCTestCase {
XCTAssertTrue(bolusEntryViewModel.isBolusRecommended)
let recommendedBolus = bolusEntryViewModel.recommendedBolus
XCTAssertNotNil(recommendedBolus)
XCTAssertEqual(mockState.bolusRecommendationResult?.amount, recommendedBolus?.doubleValue(for: .internationalUnit()))
XCTAssertEqual(delegate.roundBolusVolume(units: mockState.bolusRecommendationResult!.amount), recommendedBolus!.doubleValue(for: .internationalUnit()))
XCTAssertEqual(BolusEntryViewModel.Notice.predictedGlucoseBelowSuspendThreshold(suspendThreshold: Self.exampleCGMGlucoseQuantity), bolusEntryViewModel.activeNotice)
}

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

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

Expand Down Expand Up @@ -388,7 +388,7 @@ class BolusEntryViewModelTests: XCTestCase {
XCTAssertTrue(bolusEntryViewModel.isBolusRecommended)
let recommendedBolus = bolusEntryViewModel.recommendedBolus
XCTAssertNotNil(recommendedBolus)
XCTAssertEqual(mockState.bolusRecommendationResult?.amount, recommendedBolus?.doubleValue(for: .internationalUnit()))
XCTAssertEqual(delegate.roundBolusVolume(units: mockState.bolusRecommendationResult!.amount), recommendedBolus!.doubleValue(for: .internationalUnit()))
let consideringPotentialCarbEntryPassed = try XCTUnwrap(mockState.consideringPotentialCarbEntryPassed)
XCTAssertEqual(mockPotentialCarbEntry, consideringPotentialCarbEntryPassed)
let replacingCarbEntryPassed = try XCTUnwrap(mockState.replacingCarbEntryPassed)
Expand Down

0 comments on commit 0b7c628

Please sign in to comment.