G7GlucoseMessageTests.swift 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. //
  2. // G7GlucoseMessageTests.swift
  3. // CGMBLEKitTests
  4. //
  5. // Created by Pete Schwamb on 9/25/22.
  6. // Copyright © 2022 LoopKit Authors. All rights reserved.
  7. //
  8. import XCTest
  9. @testable import G7SensorKit
  10. final class G7GlucoseMessageTests: XCTestCase {
  11. func testG7MessageData() {
  12. let data = Data(hexadecimalString: "4e00c35501002601000106008a00060187000f")!
  13. let message = G7GlucoseMessage(data: data)!
  14. XCTAssertEqual(138, message.glucose)
  15. XCTAssertEqual(87485, message.glucoseTimestamp)
  16. XCTAssert(!message.glucoseIsDisplayOnly)
  17. }
  18. func testG7MessageDataWithCalibration() {
  19. let data = Data(hexadecimalString: "4e000ec10d00c00b00010000680006fe63001f")!
  20. let message = G7GlucoseMessage(data: data)!
  21. XCTAssertEqual(104, message.glucose)
  22. XCTAssertEqual(901390, message.glucoseTimestamp)
  23. XCTAssert(message.glucoseIsDisplayOnly)
  24. }
  25. func testG7MessageDataLifecycle() {
  26. let startupMessagesHex = [
  27. "4e00b6000000010000006600ffff017fffff00", // 0
  28. "4e00cd000000030000010500ffff027fffff01", // 1
  29. "4e00f90100000400000105009100027effff02", // 2
  30. "4e00250300000500000105007d00027effff02", // 3
  31. "4e0051040000060000010500650002dfffff02", // 4
  32. "4e007d0500000700000105004e0002e7ffff02", // 5
  33. "4e00ab060000080000010700540006f5ffff0e", // 6
  34. "4e00d507000009000001050061000601ffff0e", // 7
  35. "4e004d440e00d40b0001d46b650018036a000e", // 8
  36. ]
  37. let messages = startupMessagesHex.map { G7GlucoseMessage(data: Data(hexadecimalString: $0)!)! }
  38. XCTAssertNil(messages[0].glucose)
  39. XCTAssertNil(messages[1].glucose)
  40. XCTAssertEqual(145, messages[2].glucose)
  41. XCTAssertEqual(.known(.stopped), messages[0].algorithmState)
  42. XCTAssertEqual(.known(.warmup), messages[1].algorithmState)
  43. XCTAssertEqual(.known(.warmup), messages[2].algorithmState)
  44. XCTAssertEqual(.known(.warmup), messages[3].algorithmState)
  45. XCTAssertEqual(.known(.warmup), messages[4].algorithmState)
  46. XCTAssertEqual(.known(.warmup), messages[5].algorithmState)
  47. XCTAssertEqual(.known(.ok), messages[6].algorithmState)
  48. XCTAssertEqual(.known(.ok), messages[7].algorithmState)
  49. XCTAssertEqual(.known(.expired), messages[8].algorithmState)
  50. XCTAssertEqual(1, messages[0].sequence)
  51. XCTAssertEqual(3, messages[1].sequence)
  52. XCTAssertEqual(4, messages[2].sequence)
  53. XCTAssertEqual(5, messages[3].sequence)
  54. XCTAssertEqual(6, messages[4].sequence)
  55. XCTAssertEqual(7, messages[5].sequence)
  56. XCTAssertEqual(8, messages[6].sequence)
  57. XCTAssertEqual(9, messages[7].sequence)
  58. XCTAssertEqual(3028, messages[8].sequence)
  59. XCTAssertEqual(80, messages[0].glucoseTimestamp)
  60. XCTAssertEqual(200, messages[1].glucoseTimestamp)
  61. XCTAssertEqual(500, messages[2].glucoseTimestamp)
  62. XCTAssertEqual(800, messages[3].glucoseTimestamp)
  63. XCTAssertEqual(1100, messages[4].glucoseTimestamp)
  64. XCTAssertEqual(1400, messages[5].glucoseTimestamp)
  65. XCTAssertEqual(1700, messages[6].glucoseTimestamp)
  66. XCTAssertEqual(2000, messages[7].glucoseTimestamp)
  67. XCTAssertEqual(934777, messages[8].glucoseTimestamp)
  68. }
  69. func testG7MessageDataDetails() {
  70. // 0 1 2 3 4 5 6 7 8 9 10 11 1213 14 15 16 17 18
  71. // TTTTTTTT SQSQ AG BGBG SS C
  72. // 4e 00 a89c0000 8800 00 01 04 00 8d00 06 03 8a 00 0f
  73. //2022-09-12 09:18:06.821253 readEGV(txTime=40104,seq=136,session=1,age=4,value=141,pred=138,algo=6,subAlgo=15,rate=3)
  74. let data = Data(hexadecimalString: "4e00a89c00008800000104008d0006038a000f")!
  75. let message = G7GlucoseMessage(data: data)!
  76. XCTAssertEqual(141, message.glucose)
  77. XCTAssertEqual(40100, message.glucoseTimestamp)
  78. XCTAssertEqual(136, message.sequence)
  79. XCTAssertEqual(4, message.age)
  80. XCTAssertEqual(138, message.predicted)
  81. XCTAssertEqual(0.3, message.trend)
  82. XCTAssertEqual(.known(.ok), message.algorithmState)
  83. XCTAssert(!message.glucoseIsDisplayOnly)
  84. }
  85. func testG7MessageDataNegativeRate() {
  86. let data = Data(hexadecimalString: "4e00c6cc0d00ca0b00010500610006fe5b000f")!
  87. let message = G7GlucoseMessage(data: data)!
  88. XCTAssertEqual(-0.2, message.trend)
  89. }
  90. func testG7MessageDataMissingRate() {
  91. let data = Data(hexadecimalString: "4e00c6cc0d00ca0b000105006100067f5b000f")!
  92. let message = G7GlucoseMessage(data: data)!
  93. XCTAssertNil(message.trend)
  94. }
  95. }
  96. // Activated 2022-09-24 17:39:31 +0000
  97. // 0 1 2 3 4 5 6 7 8 9 10 11 1213 14 15 16 17 18
  98. // TTTTTTTT BGBG SS C
  99. // 2022-09-24 17:47:23 4e 00 ea010000 04 00 00 01 05 00 6c00 02 7e ff ff 02
  100. // 2022-09-24 17:52:27 4e 00 1a030000 05 00 00 01 09 00 5300 02 7e ff ff 02
  101. // 2022-09-24 17:57:25 4e 00 44040000 06 00 00 01 07 00 4500 02 e7 ff ff 02
  102. // 2022-09-24 18:02:27 4e 00 73050000 07 00 00 01 0a 00 3a00 02 f4 ff ff 02
  103. // 2022-09-24 18:07:21 4e 00 99060000 08 00 00 01 04 00 4800 06 02 ff ff 0e
  104. // 2022-09-24 18:22:26 4e 00 220a0000 0b 00 00 01 09 00 4f00 06 fe ff ff 0e
  105. // 2022-09-24 18:27:22 4e 00 4a0b0000 0c 00 00 01 05 00 4900 06 f9 37 00 0f
  106. // 2022-09-24 18:27:23 (txInfo: 7815(379013053518), SW13354, 73 mg⁠/⁠dL, Predictive: 55 mg⁠/⁠dL, Rate: -0.7 @ 2022-09-24T13:27:17-05:00, sessionInfo: Optional(Start: 2022-09-24T12:40:17-05:00, End: 2022-10-05T00:40:17-05:00)), isTimeCertain: true
  107. // 2022-09-24 22:32:24 4e 00 b7440000 3d 00 00 01 06 00 7f00 06 03 83 00 0f
  108. //2022-09-24 17:32:27.248461 -0500 info 388 <Missing Description> Dexcom G7 DisplayState: displayingGlucose(txInfo: 7815(379013053518), SW13354, 127 mg⁠/⁠dL, Predictive: 131 mg⁠/⁠dL, Rate: 0.3 @ 2022-09-24T17:32:18-05:00, sessionInfo: Optional(Start: 2022-09-24T12:40:18-05:00, End: 2022-10-05T00:40:18-05:00)), isTimeCertain: true
  109. // 0 1 2 3 4 5 6 7 8 9 10 11 1213 14 15 16 17 18
  110. // TTTTTTTT BGBG SS C
  111. // 2022-10-04 23:27:39 106 timestamp:902888 4e 00 e8c60d00 c5 0b 00 01 03 00 6a00 06 01 6a 00 0f
  112. // 2022-10-04 23:32:40 101 timestamp:903189 4e 00 15c80d00 c6 0b 00 01 04 00 6500 06 fe 61 00 0f
  113. // 2022-10-04 23:37:39 98 timestamp:903488 4e 00 40c90d00 c7 0b 00 01 03 00 6200 06 fc 5e 00 0f
  114. // 2022-10-04 23:42:39 100 timestamp:903789 4e 00 6dca0d00 c8 0b 00 01 04 00 6400 06 ff 5e 00 0f
  115. // 2022-10-04 23:47:41 97 timestamp:904090 4e 00 9acb0d00 c9 0b 00 01 05 00 6100 06 fd 5c 00 0f
  116. // 2022-10-04 23:52:41 97 timestamp:904390 4e 00 c6cc0d00 ca 0b 00 01 05 00 6100 06 fe 5b 00 0f
  117. // 2022-10-04 23:52:41.100991 -0500 info 289 <Missing Description> Dexcom G7 calBounds(signature=65,lastBG=100,lastBGTime=901259,processing=completeHigh,permitted=true,lastDisplay=phone,lastProcessingTime=901565)
  118. // 2022-10-04 23:52:41.260740 -0500 info 289 <Missing Description> Dexcom G7 DisplayState: displayingGlucose(txInfo: 7815(379013053518), SW13354, 97 mg⁠/⁠dL, Predictive: 91 mg⁠/⁠dL, Rate: -0.2 @ 2022-10-04T23:52:36-05:00, sessionInfo: Optional(Start: 2022-09-24T12:40:36-05:00, End: 2022-10-05T00:40:36-05:00)), isTimeCertain: true
  119. //
  120. // 2022-10-04 23:57:52 98 timestamp:904701 4e 00 fdcd0d00 cb 0b 00 01 10 00 6200 06 00 5c 00 0f
  121. // 2022-10-05 00:02:40 96 timestamp:904989 4e 00 1dcf0d00 cc 0b 00 01 04 00 6000 06 fe 5b 00 0f
  122. // 2022-10-05 00:07:39 95 timestamp:905288 4e 00 48d00d00 cd 0b 00 01 03 00 5f00 06 fe 5a 00 0f
  123. // 2022-10-05 08:17:43 101 timestamp:934692 4e 00 24430e00 d4 0b 00 01 ab 6a 6500 18 03 6a 00 0e
  124. // 2022-10-05 08:22:40 101 timestamp:934989 4e 00 4d440e00 d4 0b 00 01 d4 6b 6500 18 03 6a 00 0e
  125. // 2022-10-05 08:27:40 101 timestamp:935289 4e 00 79450e00 d4 0b 00 01 00 6d 6500 18 03 6a 00 0e
  126. // 2022-10-05 08:32:42 101 timestamp:935590 4e 00 a6460e00 d4 0b 00 01 2d 6e 6500 18 03 6a 00 0e
  127. // 2022-10-05 08:37:42 101 timestamp:935890 4e 00 d2470e00 d4 0b 00 01 59 6f 6500 18 03 6a 00 0e
  128. // 2022-10-05 08:42:39 101 timestamp:936188 4e 00 fc480e00 d4 0b 00 01 83 70 6500 18 03 6a 00 0e
  129. // 2022-10-05 08:47:39 101 timestamp:936488 4e 00 284a0e00 d4 0b 00 01 af 71 6500 18 03 6a 00 0e