fix: Fixes crashes when estimating pressures with a filter pressure drop.
This commit is contained in:
@@ -144,45 +144,47 @@ extension EstimatedPressureDependency {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func setFilterPressureDrop(
|
||||||
|
_ filterDrop: Positive<Double>,
|
||||||
|
measurement: inout EquipmentMeasurement
|
||||||
|
) {
|
||||||
|
switch measurement {
|
||||||
|
case var .airHandler(airHandler):
|
||||||
|
airHandler.postFilterPressure = airHandler.returnPlenumPressure +
|
||||||
|
filterDrop.positiveValue
|
||||||
|
measurement = .airHandler(airHandler)
|
||||||
|
case var .furnaceAndCoil(furnace):
|
||||||
|
furnace.postFilterPressure = furnace.returnPlenumPressure + filterDrop.positiveValue
|
||||||
|
measurement = .furnaceAndCoil(furnace)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public func estimatedPressure(
|
public func estimatedPressure(
|
||||||
equipmentMeasurement: EquipmentMeasurement,
|
equipmentMeasurement: EquipmentMeasurement,
|
||||||
airflow updatedAirflow: Positive<Double>,
|
airflow updatedAirflow: Positive<Double>,
|
||||||
filterPressureDrop: Positive<Double>
|
filterPressureDrop: Positive<Double>?
|
||||||
) async throws -> EquipmentMeasurement {
|
) async throws -> EquipmentMeasurement {
|
||||||
let estimate = try await estimatedPressure(
|
var estimate = try await estimatedPressure(
|
||||||
equipmentMeasurement: equipmentMeasurement,
|
equipmentMeasurement: equipmentMeasurement,
|
||||||
airflow: updatedAirflow.positiveValue
|
airflow: updatedAirflow.positiveValue
|
||||||
)
|
)
|
||||||
|
guard let filterPressureDrop else { return estimate }
|
||||||
switch estimate {
|
setFilterPressureDrop(filterPressureDrop, measurement: &estimate)
|
||||||
|
return estimate
|
||||||
case var .airHandler(airHandler):
|
|
||||||
airHandler.postFilterPressure = airHandler.returnPlenumPressure + filterPressureDrop.positiveValue
|
|
||||||
return .airHandler(airHandler)
|
|
||||||
|
|
||||||
case var .furnaceAndCoil(furnaceAndCoil):
|
|
||||||
furnaceAndCoil.postFilterPressure = furnaceAndCoil.returnPlenumPressure + filterPressureDrop.positiveValue
|
|
||||||
return .furnaceAndCoil(furnaceAndCoil)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public func estimatedPressure(
|
public func estimatedPressure(
|
||||||
equipmentMeasurement: EquipmentMeasurement,
|
equipmentMeasurement: EquipmentMeasurement,
|
||||||
airflow updatedAirflow: Double,
|
airflow updatedAirflow: Double,
|
||||||
filterPressureDrop: Positive<Double>?
|
filterPressureDrop: Double?
|
||||||
) async throws -> EquipmentMeasurement {
|
) async throws -> EquipmentMeasurement {
|
||||||
guard let filterPressureDrop else {
|
try await estimatedPressure(
|
||||||
return try await estimatedPressure(
|
|
||||||
equipmentMeasurement: equipmentMeasurement,
|
equipmentMeasurement: equipmentMeasurement,
|
||||||
airflow: updatedAirflow
|
airflow: Positive(updatedAirflow),
|
||||||
)
|
filterPressureDrop: filterPressureDrop != nil ? Positive(filterPressureDrop!) : nil
|
||||||
}
|
|
||||||
return try await estimatedPressure(
|
|
||||||
equipmentMeasurement: equipmentMeasurement,
|
|
||||||
airflow: updatedAirflow,
|
|
||||||
filterPressureDrop: Positive(filterPressureDrop.positiveValue)
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension EstimatedPressureDependency: DependencyKey {
|
extension EstimatedPressureDependency: DependencyKey {
|
||||||
|
|||||||
@@ -298,7 +298,7 @@ public struct FlaggedMeasurementsList: Sendable {
|
|||||||
|
|
||||||
let measurement = try await estimatedPressuresClient.estimatedPressure(
|
let measurement = try await estimatedPressuresClient.estimatedPressure(
|
||||||
equipmentMeasurement: equipmentMeasurement,
|
equipmentMeasurement: equipmentMeasurement,
|
||||||
airflow: airflow,
|
airflow: Positive(airflow),
|
||||||
filterPressureDrop: filterPressureDrop
|
filterPressureDrop: filterPressureDrop
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -24,45 +24,83 @@ struct FlaggedMeasurementListStateTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test(
|
@Test(
|
||||||
"Handle Estimation Form",
|
"Pressure Estimation",
|
||||||
.tags(.flaggedMeasurementList)
|
.tags(.flaggedMeasurementList),
|
||||||
|
arguments: [
|
||||||
|
(EquipmentMeasurement.EquipmentType.airHandler, Optional<Double>.none),
|
||||||
|
(.furnaceAndCoil, nil),
|
||||||
|
(.airHandler, 0.1),
|
||||||
|
(.furnaceAndCoil, 0.1),
|
||||||
|
]
|
||||||
)
|
)
|
||||||
func handleEstimationForm() async throws {
|
func pressureEstimation(
|
||||||
|
equipmentType: EquipmentMeasurement.EquipmentType,
|
||||||
|
filterPressureDrop: Double?
|
||||||
|
) async throws {
|
||||||
|
try await withDependencies {
|
||||||
|
$0.estimatedPressuresClient = .liveValue
|
||||||
|
} operation: {
|
||||||
|
@Dependency(\.estimatedPressuresClient) var client
|
||||||
|
let equipmentMeasurement = EquipmentMeasurement.mock(type: equipmentType)
|
||||||
|
|
||||||
|
let measurement = try await client.estimatedPressure(
|
||||||
|
equipmentMeasurement: equipmentMeasurement,
|
||||||
|
airflow: 1050,
|
||||||
|
filterPressureDrop: filterPressureDrop
|
||||||
|
)
|
||||||
|
|
||||||
|
print(measurement)
|
||||||
|
#expect(measurement.equipmentType == equipmentType)
|
||||||
|
#expect(measurement.manufacturersIncludedFilterPressureDrop == equipmentMeasurement.manufacturersIncludedFilterPressureDrop)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(
|
||||||
|
"Handle Estimation Form",
|
||||||
|
.tags(.flaggedMeasurementList),
|
||||||
|
arguments: [nil, 0.1]
|
||||||
|
)
|
||||||
|
func handleEstimationForm(filterPressureDrop: Double?) async throws {
|
||||||
try await withDependencies {
|
try await withDependencies {
|
||||||
$0.estimatedPressuresClient = .liveValue
|
$0.estimatedPressuresClient = .liveValue
|
||||||
$0.uuid = .incrementing
|
$0.uuid = .incrementing
|
||||||
} operation: {
|
} operation: {
|
||||||
@Dependency(\.estimatedPressuresClient) var client
|
@Dependency(\.estimatedPressuresClient) var client
|
||||||
|
|
||||||
let reducer = FlaggedMeasurementsList()
|
let equipmentMeasurement = EquipmentMeasurement.mock(type: .airHandler)
|
||||||
let result = try await reducer._handleEstimationForm(
|
let budgets = BudgetedPercentEnvelope(equipmentType: .airHandler, fanType: .constantSpeed)
|
||||||
form: .init(
|
let flaggedMeasurement = EquipmentMeasurement.FlaggedMeasurement(
|
||||||
existingMeasurement: SharedReader(Shared(.mock(type: .airHandler))),
|
budgets: budgets,
|
||||||
cfmTextField: 350,
|
measurement: equipmentMeasurement,
|
||||||
name: "Test"
|
|
||||||
),
|
|
||||||
state: .init(sharedSettings: Shared(.init(
|
|
||||||
budgets: .init(equipmentType: .airHandler, fanType: .constantSpeed),
|
|
||||||
equipmentMeasurement: .mock(type: .airHandler),
|
|
||||||
flaggedEquipmentMeasurement: .init(
|
|
||||||
budgets: .init(equipmentType: .airHandler, fanType: .constantSpeed),
|
|
||||||
measurement: .mock(type: .airHandler),
|
|
||||||
ratedPressures: .init(),
|
ratedPressures: .init(),
|
||||||
tons: .three
|
tons: .three
|
||||||
)
|
)
|
||||||
|
|
||||||
|
let reducer = FlaggedMeasurementsList()
|
||||||
|
let result = try await reducer._handleEstimationForm(
|
||||||
|
form: .init(
|
||||||
|
existingMeasurement: SharedReader(Shared(equipmentMeasurement)),
|
||||||
|
cfmTextField: 350,
|
||||||
|
filterPressureDrop: filterPressureDrop,
|
||||||
|
name: "Test"
|
||||||
|
),
|
||||||
|
state: .init(sharedSettings: Shared(.init(
|
||||||
|
budgets: budgets,
|
||||||
|
equipmentMeasurement: equipmentMeasurement,
|
||||||
|
flaggedEquipmentMeasurement: flaggedMeasurement
|
||||||
)))
|
)))
|
||||||
)
|
)
|
||||||
|
|
||||||
let measurement = try await client.estimatedPressure(
|
let measurement = try await client.estimatedPressure(
|
||||||
equipmentMeasurement: .mock(type: .airHandler),
|
equipmentMeasurement: equipmentMeasurement,
|
||||||
airflow: 1050,
|
airflow: 1050,
|
||||||
filterPressureDrop: 0.1
|
filterPressureDrop: filterPressureDrop
|
||||||
)
|
)
|
||||||
|
|
||||||
#expect(result != nil)
|
#expect(result != nil)
|
||||||
#expect(result?.estimationState == .init(
|
#expect(result?.estimationState == .init(
|
||||||
cfm: .cfmPerTon(350, .three),
|
cfm: .cfmPerTon(350, .three),
|
||||||
filterPressureDrop: 0.1,
|
filterPressureDrop: filterPressureDrop,
|
||||||
name: "Test"
|
name: "Test"
|
||||||
))
|
))
|
||||||
|
|
||||||
@@ -206,6 +244,57 @@ final class FlaggedMeasurementListReducerTests: XCTestCase {
|
|||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
@MainActor
|
||||||
|
func testPressureEstimation() async throws {
|
||||||
|
_ = try await pressureEstimation(
|
||||||
|
equipmentType: .airHandler,
|
||||||
|
filterPressureDrop: 0.1
|
||||||
|
)
|
||||||
|
// XCTFail()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private func pressureEstimation(
|
||||||
|
equipmentType: EquipmentMeasurement.EquipmentType,
|
||||||
|
filterPressureDrop: Double?
|
||||||
|
) async throws -> EquipmentMeasurement {
|
||||||
|
try await withDependencies {
|
||||||
|
$0.estimatedPressuresClient = .liveValue
|
||||||
|
} operation: {
|
||||||
|
@Dependency(\.estimatedPressuresClient) var client
|
||||||
|
let equipmentMeasurement = EquipmentMeasurement.mock(type: equipmentType)
|
||||||
|
|
||||||
|
var estimate = try await client.estimatedPressure(
|
||||||
|
equipmentMeasurement: equipmentMeasurement,
|
||||||
|
airflow: 1050
|
||||||
|
)
|
||||||
|
|
||||||
|
guard let filterPressureDrop else { return estimate }
|
||||||
|
setFilterPressureDrop(Positive(filterPressureDrop), measurement: &estimate)
|
||||||
|
return estimate
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func setFilterPressureDrop(
|
||||||
|
_ filterDrop: Positive<Double>,
|
||||||
|
measurement: inout EquipmentMeasurement
|
||||||
|
) {
|
||||||
|
switch measurement {
|
||||||
|
case var .airHandler(airHandler):
|
||||||
|
// let newPressure = airHandler.$returnPlenumPressure + filterDrop
|
||||||
|
// print("newPressure: \(newPressure)")
|
||||||
|
airHandler.postFilterPressure = airHandler.returnPlenumPressure +
|
||||||
|
filterDrop.positiveValue
|
||||||
|
measurement = .airHandler(airHandler)
|
||||||
|
case var .furnaceAndCoil(furnace):
|
||||||
|
furnace.postFilterPressure = furnace.returnPlenumPressure + filterDrop.positiveValue
|
||||||
|
measurement = .furnaceAndCoil(furnace)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension Tag {
|
extension Tag {
|
||||||
|
|||||||
Reference in New Issue
Block a user