Skip to content

Commit 6873e64

Browse files
authored
Merge pull request #2059 from LoopKit/functional-loop-algorithm
Functional loop algorithm
2 parents 3367e60 + d190fd5 commit 6873e64

20 files changed

+1435
-1840
lines changed

Loop.xcodeproj/project.pbxproj

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -414,9 +414,6 @@
414414
C1201E2C23ECDBD0002DA84A /* WatchContextRequestUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1201E2B23ECDBD0002DA84A /* WatchContextRequestUserInfo.swift */; };
415415
C1201E2D23ECDF3D002DA84A /* WatchContextRequestUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1201E2B23ECDBD0002DA84A /* WatchContextRequestUserInfo.swift */; };
416416
C13072BA2A76AF31009A7C58 /* live_capture_predicted_glucose.json in Resources */ = {isa = PBXBuildFile; fileRef = C13072B92A76AF31009A7C58 /* live_capture_predicted_glucose.json */; };
417-
C13072BE2A76AF97009A7C58 /* live_capture_doses.json in Resources */ = {isa = PBXBuildFile; fileRef = C13072BD2A76AF97009A7C58 /* live_capture_doses.json */; };
418-
C13072C02A76B041009A7C58 /* live_capture_carb_entries.json in Resources */ = {isa = PBXBuildFile; fileRef = C13072BF2A76B041009A7C58 /* live_capture_carb_entries.json */; };
419-
C13072C42A76B0B1009A7C58 /* live_capture_historic_glucose.json in Resources */ = {isa = PBXBuildFile; fileRef = C13072C32A76B0B1009A7C58 /* live_capture_historic_glucose.json */; };
420417
C13255D6223E7BE2008AF50C /* BolusProgressTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C1F8B1DB223862D500DD66CF /* BolusProgressTableViewCell.xib */; };
421418
C13DA2B024F6C7690098BB29 /* UIViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C13DA2AF24F6C7690098BB29 /* UIViewController.swift */; };
422419
C148CEE724FD91BD00711B3B /* DeliveryUncertaintyAlertManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C148CEE624FD91BD00711B3B /* DeliveryUncertaintyAlertManager.swift */; };
@@ -434,6 +431,7 @@
434431
C16B983E26B4893300256B05 /* DoseEnactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16B983D26B4893300256B05 /* DoseEnactor.swift */; };
435432
C16B984026B4898800256B05 /* DoseEnactorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16B983F26B4898800256B05 /* DoseEnactorTests.swift */; };
436433
C16DA84222E8E112008624C2 /* PluginManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16DA84122E8E112008624C2 /* PluginManager.swift */; };
434+
C16FC0B02A99392F0025E239 /* live_capture_input.json in Resources */ = {isa = PBXBuildFile; fileRef = C16FC0AF2A99392F0025E239 /* live_capture_input.json */; };
437435
C1735B1E2A0809830082BB8A /* ZIPFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = C1735B1D2A0809830082BB8A /* ZIPFoundation */; };
438436
C1742332259BEADC00399C9D /* ManualEntryDoseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1742331259BEADC00399C9D /* ManualEntryDoseView.swift */; };
439437
C174233C259BEB0F00399C9D /* ManualEntryDoseViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C174233B259BEB0F00399C9D /* ManualEntryDoseViewModel.swift */; };
@@ -470,6 +468,7 @@
470468
C1D0B6302986D4D90098D215 /* LocalizedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1D0B62F2986D4D90098D215 /* LocalizedString.swift */; };
471469
C1D0B6312986D4D90098D215 /* LocalizedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1D0B62F2986D4D90098D215 /* LocalizedString.swift */; };
472470
C1D289B522F90A52003FFBD9 /* BasalDeliveryState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1D289B422F90A52003FFBD9 /* BasalDeliveryState.swift */; };
471+
C1D476B42A8ED179002C1C87 /* LoopAlgorithmTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1D476B32A8ED179002C1C87 /* LoopAlgorithmTests.swift */; };
473472
C1D6EEA02A06C7270047DE5C /* MKRingProgressView in Frameworks */ = {isa = PBXBuildFile; productRef = C1D6EE9F2A06C7270047DE5C /* MKRingProgressView */; };
474473
C1DE5D23251BFC4D00439E49 /* SimpleBolusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1DE5D22251BFC4D00439E49 /* SimpleBolusView.swift */; };
475474
C1E2773E224177C000354103 /* ClockKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1E2773D224177C000354103 /* ClockKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
@@ -1420,9 +1419,6 @@
14201419
C12CB9B623106A6200F84978 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Intents.strings; sourceTree = "<group>"; };
14211420
C12CB9B823106A6300F84978 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Intents.strings; sourceTree = "<group>"; };
14221421
C13072B92A76AF31009A7C58 /* live_capture_predicted_glucose.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = live_capture_predicted_glucose.json; sourceTree = "<group>"; };
1423-
C13072BD2A76AF97009A7C58 /* live_capture_doses.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = live_capture_doses.json; sourceTree = "<group>"; };
1424-
C13072BF2A76B041009A7C58 /* live_capture_carb_entries.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = live_capture_carb_entries.json; sourceTree = "<group>"; };
1425-
C13072C32A76B0B1009A7C58 /* live_capture_historic_glucose.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = live_capture_historic_glucose.json; sourceTree = "<group>"; };
14261422
C13DA2AF24F6C7690098BB29 /* UIViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIViewController.swift; sourceTree = "<group>"; };
14271423
C148CEE624FD91BD00711B3B /* DeliveryUncertaintyAlertManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeliveryUncertaintyAlertManager.swift; sourceTree = "<group>"; };
14281424
C14952142995822A0095AA84 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = "<group>"; };
@@ -1445,6 +1441,7 @@
14451441
C16B983D26B4893300256B05 /* DoseEnactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DoseEnactor.swift; sourceTree = "<group>"; };
14461442
C16B983F26B4898800256B05 /* DoseEnactorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DoseEnactorTests.swift; sourceTree = "<group>"; };
14471443
C16DA84122E8E112008624C2 /* PluginManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PluginManager.swift; sourceTree = "<group>"; };
1444+
C16FC0AF2A99392F0025E239 /* live_capture_input.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = live_capture_input.json; sourceTree = "<group>"; };
14481445
C1742331259BEADC00399C9D /* ManualEntryDoseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManualEntryDoseView.swift; sourceTree = "<group>"; };
14491446
C174233B259BEB0F00399C9D /* ManualEntryDoseViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManualEntryDoseViewModel.swift; sourceTree = "<group>"; };
14501447
C174571329830930009EFCF2 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = "<group>"; };
@@ -1542,6 +1539,7 @@
15421539
C1D0B62F2986D4D90098D215 /* LocalizedString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedString.swift; sourceTree = "<group>"; };
15431540
C1D197FE232CF92D0096D646 /* capture-build-details.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "capture-build-details.sh"; sourceTree = "<group>"; };
15441541
C1D289B422F90A52003FFBD9 /* BasalDeliveryState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasalDeliveryState.swift; sourceTree = "<group>"; };
1542+
C1D476B32A8ED179002C1C87 /* LoopAlgorithmTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoopAlgorithmTests.swift; sourceTree = "<group>"; };
15451543
C1D70F7A2A914F71009FE129 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/InfoPlist.strings; sourceTree = "<group>"; };
15461544
C1DA986B2843B6F9001D04CC /* PersistedProperty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersistedProperty.swift; sourceTree = "<group>"; };
15471545
C1DE5D22251BFC4D00439E49 /* SimpleBolusView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SimpleBolusView.swift; sourceTree = "<group>"; };
@@ -1864,6 +1862,7 @@
18641862
E9B3552C293592B40076AB04 /* MealDetectionManagerTests.swift */,
18651863
1D70C40026EC0F9D00C62570 /* SupportManagerTests.swift */,
18661864
A9F5F1F4251050EC00E7C8A4 /* ZipArchiveTests.swift */,
1865+
C1D476B32A8ED179002C1C87 /* LoopAlgorithmTests.swift */,
18671866
);
18681867
path = Managers;
18691868
sourceTree = "<group>";
@@ -2755,9 +2754,7 @@
27552754
isa = PBXGroup;
27562755
children = (
27572756
C13072B92A76AF31009A7C58 /* live_capture_predicted_glucose.json */,
2758-
C13072BD2A76AF97009A7C58 /* live_capture_doses.json */,
2759-
C13072BF2A76B041009A7C58 /* live_capture_carb_entries.json */,
2760-
C13072C32A76B0B1009A7C58 /* live_capture_historic_glucose.json */,
2757+
C16FC0AF2A99392F0025E239 /* live_capture_input.json */,
27612758
);
27622759
path = live_capture;
27632760
sourceTree = "<group>";
@@ -3412,7 +3409,6 @@
34123409
E93E86CE24E2E02200FF40C8 /* high_and_stable_momentum_effect.json in Resources */,
34133410
C13072BA2A76AF31009A7C58 /* live_capture_predicted_glucose.json in Resources */,
34143411
E93E865424DB6CBA00FF40C8 /* retrospective_output.json in Resources */,
3415-
C13072BE2A76AF97009A7C58 /* live_capture_doses.json in Resources */,
34163412
E9C58A7F24DB529A00487A17 /* counteraction_effect_falling_glucose.json in Resources */,
34173413
E93E865624DB731900FF40C8 /* predicted_glucose_without_retrospective.json in Resources */,
34183414
E9B3553D293706CB0076AB04 /* long_interval_counteraction_effect.json in Resources */,
@@ -3425,12 +3421,12 @@
34253421
E90909D224E34AC500F963D2 /* high_and_rising_with_cob_insulin_effect.json in Resources */,
34263422
E90909F224E35B4D00F963D2 /* high_and_falling_counteraction_effect.json in Resources */,
34273423
E90909EE24E35B4000F963D2 /* high_and_falling_predicted_glucose.json in Resources */,
3428-
C13072C02A76B041009A7C58 /* live_capture_carb_entries.json in Resources */,
34293424
E90909DD24E34F1600F963D2 /* low_and_falling_carb_effect.json in Resources */,
34303425
E90909E924E3530200F963D2 /* low_with_low_treatment_predicted_glucose.json in Resources */,
34313426
E90909D124E34AC500F963D2 /* high_and_rising_with_cob_momentum_effect.json in Resources */,
34323427
E9C58A8024DB529A00487A17 /* insulin_effect.json in Resources */,
34333428
E90909DF24E34F1600F963D2 /* low_and_falling_insulin_effect.json in Resources */,
3429+
C16FC0B02A99392F0025E239 /* live_capture_input.json in Resources */,
34343430
E93E86BE24E1FDC400FF40C8 /* flat_and_stable_carb_effect.json in Resources */,
34353431
E90909E824E3530200F963D2 /* low_with_low_treatment_insulin_effect.json in Resources */,
34363432
E9B3553B293706CB0076AB04 /* noisy_cgm_counteraction_effect.json in Resources */,
@@ -3451,7 +3447,6 @@
34513447
E93E86C324E1FE6100FF40C8 /* flat_and_stable_counteraction_effect.json in Resources */,
34523448
E9C58A7E24DB529A00487A17 /* dynamic_glucose_effect_partially_observed.json in Resources */,
34533449
E90909F324E35B4D00F963D2 /* high_and_falling_carb_effect.json in Resources */,
3454-
C13072C42A76B0B1009A7C58 /* live_capture_historic_glucose.json in Resources */,
34553450
E93E86CA24E2E02200FF40C8 /* high_and_stable_insulin_effect.json in Resources */,
34563451
E93E86BB24E1FDC400FF40C8 /* flat_and_stable_momentum_effect.json in Resources */,
34573452
E93E86CB24E2E02200FF40C8 /* high_and_stable_carb_effect.json in Resources */,
@@ -3991,6 +3986,7 @@
39913986
E93E86A824DDCC4400FF40C8 /* MockDoseStore.swift in Sources */,
39923987
B4D4534128E5CA7900F1A8D9 /* AlertMuterTests.swift in Sources */,
39933988
E98A55F124EDD85E0008715D /* MockDosingDecisionStore.swift in Sources */,
3989+
C1D476B42A8ED179002C1C87 /* LoopAlgorithmTests.swift in Sources */,
39943990
8968B114240C55F10074BB48 /* LoopSettingsTests.swift in Sources */,
39953991
A9BD28E7272226B40071DF15 /* TestLocalizedError.swift in Sources */,
39963992
A9F5F1F5251050EC00E7C8A4 /* ZipArchiveTests.swift in Sources */,

Loop/AppDelegate.swift

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@ final class AppDelegate: UIResponder, UIApplicationDelegate, WindowProvider {
2222

2323
setenv("CFNETWORK_DIAGNOSTICS", "3", 1)
2424

25-
loopAppManager.initialize(windowProvider: self, launchOptions: launchOptions)
26-
loopAppManager.launch()
25+
if ProcessInfo.processInfo.environment["XCTestConfigurationFilePath"] == nil {
26+
// Code only executes when not running tests
27+
loopAppManager.initialize(windowProvider: self, launchOptions: launchOptions)
28+
loopAppManager.launch()
29+
}
2730
return loopAppManager.isLaunchComplete
2831
}
2932

@@ -32,7 +35,10 @@ final class AppDelegate: UIResponder, UIApplicationDelegate, WindowProvider {
3235
func applicationDidBecomeActive(_ application: UIApplication) {
3336
log.default(#function)
3437

35-
loopAppManager.didBecomeActive()
38+
if ProcessInfo.processInfo.environment["XCTestConfigurationFilePath"] == nil {
39+
// Code only executes when not running tests
40+
loopAppManager.didBecomeActive()
41+
}
3642
}
3743

3844
func applicationWillResignActive(_ application: UIApplication) {

Loop/Extensions/DosingDecisionStore+SimulatedCoreData.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -103,23 +103,23 @@ fileprivate extension StoredDosingDecision {
103103
historicalGlucose.append(HistoricalGlucoseValue(startDate: date.addingTimeInterval(.minutes(minutes)),
104104
quantity: HKQuantity(unit: .milligramsPerDeciliter, doubleValue: 125 + minutes / 5)))
105105
}
106-
let originalCarbEntry = StoredCarbEntry(uuid: UUID(uuidString: "C86DEB61-68E9-464E-9DD5-96A9CB445FD3")!,
106+
let originalCarbEntry = StoredCarbEntry(startDate: date.addingTimeInterval(-.minutes(15)),
107+
quantity: HKQuantity(unit: .gram(), doubleValue: 15),
108+
uuid: UUID(uuidString: "C86DEB61-68E9-464E-9DD5-96A9CB445FD3")!,
107109
provenanceIdentifier: Bundle.main.bundleIdentifier!,
108110
syncIdentifier: "2B03D96C-6F5D-4140-99CD-80C3E64D6010",
109111
syncVersion: 1,
110-
startDate: date.addingTimeInterval(-.minutes(15)),
111-
quantity: HKQuantity(unit: .gram(), doubleValue: 15),
112112
foodType: "Simulated",
113113
absorptionTime: .hours(3),
114114
createdByCurrentApp: true,
115115
userCreatedDate: date.addingTimeInterval(-.minutes(15)),
116116
userUpdatedDate: date.addingTimeInterval(-.minutes(1)))
117-
let carbEntry = StoredCarbEntry(uuid: UUID(uuidString: "71B699D7-0E8F-4B13-B7A1-E7751EB78E74")!,
117+
let carbEntry = StoredCarbEntry(startDate: date.addingTimeInterval(-.minutes(1)),
118+
quantity: HKQuantity(unit: .gram(), doubleValue: 25),
119+
uuid: UUID(uuidString: "71B699D7-0E8F-4B13-B7A1-E7751EB78E74")!,
118120
provenanceIdentifier: Bundle.main.bundleIdentifier!,
119121
syncIdentifier: "2B03D96C-6F5D-4140-99CD-80C3E64D6010",
120122
syncVersion: 2,
121-
startDate: date.addingTimeInterval(-.minutes(1)),
122-
quantity: HKQuantity(unit: .gram(), doubleValue: 25),
123123
foodType: "Simulated",
124124
absorptionTime: .hours(5),
125125
createdByCurrentApp: true,
@@ -147,7 +147,7 @@ fileprivate extension StoredDosingDecision {
147147
healthKitEligibleDate: nil)
148148
let carbsOnBoard = CarbValue(startDate: date,
149149
endDate: date.addingTimeInterval(.minutes(5)),
150-
quantity: HKQuantity(unit: .gram(), doubleValue: 45.5))
150+
value: 45.5)
151151
let insulinOnBoard = InsulinValue(startDate: date, value: 1.5)
152152
let glucoseTargetRangeSchedule = GlucoseRangeSchedule(rangeSchedule: DailyQuantitySchedule(unit: .milligramsPerDeciliter,
153153
dailyItems: [RepeatingScheduleValue(startTime: .hours(0), value: DoubleRange(minValue: 100.0, maxValue: 110.0)),

0 commit comments

Comments
 (0)