@@ -19,6 +19,10 @@ var _ = Describe("Glucose", func() {
1919 Expect (glucose .Mmoll ).To (Equal ("mmol/l" ))
2020 })
2121
22+ It ("has MmolLMinute" , func () {
23+ Expect (glucose .MmolLMinute ).To (Equal ("mmol/L/minute" ))
24+ })
25+
2226 It ("has MgdL" , func () {
2327 Expect (glucose .MgdL ).To (Equal ("mg/dL" ))
2428 })
@@ -27,6 +31,10 @@ var _ = Describe("Glucose", func() {
2731 Expect (glucose .Mgdl ).To (Equal ("mg/dl" ))
2832 })
2933
34+ It ("has MgdLMinute" , func () {
35+ Expect (glucose .MgdLMinute ).To (Equal ("mg/dL/minute" ))
36+ })
37+
3038 It ("has MmolLMinimum" , func () {
3139 Expect (glucose .MmolLMinimum ).To (Equal (0.0 ))
3240 })
@@ -35,6 +43,14 @@ var _ = Describe("Glucose", func() {
3543 Expect (glucose .MmolLMaximum ).To (Equal (55.0 ))
3644 })
3745
46+ It ("has MmolLMinuteMinimum" , func () {
47+ Expect (glucose .MmolLMinuteMinimum ).To (Equal (- 5.5 ))
48+ })
49+
50+ It ("has MmolLMinuteMaximum" , func () {
51+ Expect (glucose .MmolLMinuteMaximum ).To (Equal (5.5 ))
52+ })
53+
3854 It ("has MgdLMinimum" , func () {
3955 Expect (glucose .MgdLMinimum ).To (Equal (0.0 ))
4056 })
@@ -43,6 +59,14 @@ var _ = Describe("Glucose", func() {
4359 Expect (glucose .MgdLMaximum ).To (Equal (1000.0 ))
4460 })
4561
62+ It ("has MgdLMinuteMinimum" , func () {
63+ Expect (glucose .MgdLMinuteMinimum ).To (Equal (- 100.0 ))
64+ })
65+
66+ It ("has MgdLMinuteMaximum" , func () {
67+ Expect (glucose .MgdLMinuteMaximum ).To (Equal (100.0 ))
68+ })
69+
4670 It ("has MmolLToMgdLConversionFactor" , func () {
4771 Expect (glucose .MmolLToMgdLConversionFactor ).To (Equal (18.01559 ))
4872 })
@@ -57,6 +81,12 @@ var _ = Describe("Glucose", func() {
5781 })
5882 })
5983
84+ Context ("RateUnits" , func () {
85+ It ("returns the expected units" , func () {
86+ Expect (glucose .RateUnits ()).To (ConsistOf ("mmol/L/minute" , "mg/dL/minute" ))
87+ })
88+ })
89+
6090 DescribeTable ("ValueRangeForUnits" ,
6191 func (units * string , expectedLower float64 , expectedUpper float64 ) {
6292 actualLower , actualUpper := glucose .ValueRangeForUnits (units )
@@ -125,4 +155,67 @@ var _ = Describe("Glucose", func() {
125155 }
126156 })
127157 })
158+
159+ DescribeTable ("ValueRangeForRateUnits" ,
160+ func (rateUnits * string , expectedLower float64 , expectedUpper float64 ) {
161+ actualLower , actualUpper := glucose .ValueRangeForRateUnits (rateUnits )
162+ Expect (actualLower ).To (Equal (expectedLower ))
163+ Expect (actualUpper ).To (Equal (expectedUpper ))
164+ },
165+ Entry ("returns no range for nil" , nil , - math .MaxFloat64 , math .MaxFloat64 ),
166+ Entry ("returns no range for unknown units" , pointer .FromString ("unknown" ), - math .MaxFloat64 , math .MaxFloat64 ),
167+ Entry ("returns expected range for mmol/L/minute units" , pointer .FromString ("mmol/L/minute" ), - 5.5 , 5.5 ),
168+ Entry ("returns expected range for mg/dL/minute units" , pointer .FromString ("mg/dL/minute" ), - 100.0 , 100.0 ),
169+ )
170+
171+ DescribeTable ("NormalizeRateUnits" ,
172+ func (rateUnits * string , expectedRateUnits * string ) {
173+ actualRateUnits := glucose .NormalizeRateUnits (rateUnits )
174+ if expectedRateUnits == nil {
175+ Expect (actualRateUnits ).To (BeNil ())
176+ } else {
177+ Expect (actualRateUnits ).ToNot (BeNil ())
178+ Expect (* actualRateUnits ).To (Equal (* expectedRateUnits ))
179+ }
180+ },
181+ Entry ("returns nil for nil" , nil , nil ),
182+ Entry ("returns unchanged units for unknown units" , pointer .FromString ("unknown" ), pointer .FromString ("unknown" )),
183+ Entry ("returns mmol/L/minute for mmol/L/minute" , pointer .FromString ("mmol/L/minute" ), pointer .FromString ("mmol/L/minute" )),
184+ Entry ("returns mmol/L/minute for mg/dL/minute" , pointer .FromString ("mg/dL/minute" ), pointer .FromString ("mmol/L/minute" )),
185+ )
186+
187+ Context ("NormalizeValueForRateUnits" , func () {
188+ DescribeTable ("given value and units" ,
189+ func (value * float64 , rateUnits * string , expectedValue * float64 ) {
190+ actualValue := glucose .NormalizeValueForRateUnits (value , rateUnits )
191+ if expectedValue == nil {
192+ Expect (actualValue ).To (BeNil ())
193+ } else {
194+ Expect (actualValue ).ToNot (BeNil ())
195+ Expect (* actualValue ).To (Equal (* expectedValue ))
196+ }
197+ },
198+ Entry ("returns nil for nil value" , nil , pointer .FromString ("mmol/L/minute" ), nil ),
199+ Entry ("returns unchanged value for nil units" , pointer .FromFloat64 (1.0 ), nil , pointer .FromFloat64 (1.0 )),
200+ Entry ("returns unchanged value for unknown units" , pointer .FromFloat64 (1.0 ), pointer .FromString ("unknown" ), pointer .FromFloat64 (1.0 )),
201+ Entry ("returns unchanged value for mmol/L/minute units" , pointer .FromFloat64 (1.0 ), pointer .FromString ("mmol/L/minute" ), pointer .FromFloat64 (1.0 )),
202+ Entry ("returns converted value for mg/dL/minute units" , pointer .FromFloat64 (18.0 ), pointer .FromString ("mg/dL/minute" ), pointer .FromFloat64 (0.99913 )),
203+ )
204+
205+ It ("properly normalizes a range of mmol/L/minute values" , func () {
206+ for value := glucose .MmolLMinuteMinimum ; value <= glucose .MmolLMinuteMaximum ; value += 0.1 {
207+ normalizedValue := glucose .NormalizeValueForRateUnits (pointer .FromFloat64 (float64 (value )), pointer .FromString ("mmol/L/minute" ))
208+ Expect (normalizedValue ).ToNot (BeNil ())
209+ Expect (* normalizedValue ).To (Equal (value ))
210+ }
211+ })
212+
213+ It ("properly normalizes a range of mg/dL/minute values" , func () {
214+ for value := int (glucose .MgdLMinuteMinimum ); value <= int (glucose .MgdLMinuteMaximum ); value ++ {
215+ normalizedValue := glucose .NormalizeValueForRateUnits (pointer .FromFloat64 (float64 (value )), pointer .FromString ("mg/dL/minute" ))
216+ Expect (normalizedValue ).ToNot (BeNil ())
217+ Expect (int (* normalizedValue * 18.01559 + math .Copysign (0.5 , float64 (value )))).To (Equal (value ))
218+ }
219+ })
220+ })
128221})
0 commit comments