/* Ċ Ġ* ĠCopyright Ġ( c ) ĠKon ink lij ke ĠPhil ips ĠN . V ., Ġ 2 0 2 1 . Ċ Ġ* ĠAll Ġrights Ġreserved . Ċ Ġ*/ Ċ package Ġcom . phil ips . ble client . service . gh s Ċ Ċ import Ġandroid . bluetooth . Bluetooth GattCharacteristic Ċ import Ġcom . phil ips . ble client . ac om . A com Object Ċ import Ġcom . phil ips . ble client . ac om . Observation Ċ import Ġcom . phil ips . bt server . generic health service . Observation Type Ċ import Ġcom . w el ie . bles sed . Bluetooth Per ipheral Ċ import Ġcom . w el ie . bles sed . Gatt Status Ċ import Ġio . mock k . Mock K Annotations Ċ import Ġio . mock k . every Ċ import Ġio . mock k . impl . annotations . Mock K Ċ Ċ import Ġio . mock k .* Ċ import Ġkotlin . test .* Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ Ċ @ Experimental Std lib Api Ċ @ Experimental Cor outines Api Ċ class ĠGeneric Health Sensor Service Handler Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġfake Address Ġ= Ġ" 1 2 : 3 4 : 5 6 : 6 5 : 4 3 : 2 1 " ĊĠĠĠ Ġprivate Ġval Ġfake Device Name Ġ= Ġ" G HS ĠOr al ĠTh er mo meter " ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhandler : ĠGeneric Health Sensor Service Handler ĊĊĠĠĠ Ġ@ Mock K ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlistener : ĠGeneric Health Sensor Handler Listener ĊĊĠĠĠ Ġ@ Mock K ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġperipheral : ĠBluetooth Per ipheral ĊĊĠĠĠ Ġ@ Before Test ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ ĠMock K Annotations . init ( this , Ġrelax Unit Fun Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġperipheral . address Ġ} Ġreturns Ġfake Address ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġperipheral . name Ġ} Ġreturns Ġfake Device Name ĊĊĠĠĠĠĠĠĠ Ġhandler Ġ= ĠGeneric Health Sensor Service Handler () ĊĠĠĠĠĠĠĠ Ġhandler . addListener ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġa Ġbyte Ġarray Ġof Ġtwo Ġobservations , Ġwhen Ġdata Ġis Ġparsed , Ġthen Ġan ĠA com Object Ġwith Ġtwo Ġobservations Ġis Ġcreated `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠbyteArray Ġ= Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst ĠOb servation ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 9 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 2 F , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 xE 0 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 8 , Ġ// ĠType : ĠO bs ĠType , ĠLength : Ġ 4 , Ġvalue : ĠOr al ĠTemp ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 9 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 2 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType : ĠHandle , ĠLength : Ġ 2 , ĠValue : Ġ 0 x 0 0 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 A , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 5 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 xFF . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 7 A , Ġ// ĠType : ĠSimple ĠNum , ĠLength : Ġ 4 , Ġvalue : Ġ 3 8 . 7 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 9 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 9 6 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 1 7 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 xA 0 . to Byte (), Ġ// ĠType : ĠUnit ĠCode , ĠLength : Ġ 4 , Ġvalue : ĠC els ius ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 9 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 9 0 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 7 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 2 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 1 E , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 xE 8 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 8 2 . to Byte (), Ġ// ĠType : ĠAbs ĠTimestamp , ĠLength : Ġ 8 , Ġvalue : ĠWed ĠDec Ġ 0 2 Ġ 2 0 2 0 Ġ 1 5 : 4 2 : 5 4 Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , Ġ 0 x 0 1 , Ġ 0 x 0 9 , Ġ 0 x 9 0 . to Byte (), Ġ 0 x 0 0 , Ġ 0 x 0 8 , Ġ 0 x 2 0 , Ġ 0 x 2 0 , Ġ 0 x 1 1 , Ġ 0 x 2 6 , Ġ 0 x 1 6 , Ġ 0 x 4 3 , Ġ 0 x 4 4 , Ġ 0 x 7 7 , Ġ// ĠType : ĠAbs ĠTimestamp , ĠLength : Ġ 8 , Ġvalue : Ġ 2 0 2 0 / 1 1 / 2 6 Ġ 1 6 : 4 3 : 4 4 . 7 7 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSecond ĠOb servation ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 9 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 2 F , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 xE 0 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 8 , Ġ// ĠType : ĠO bs ĠType , ĠLength : Ġ 4 , Ġvalue : ĠOr al ĠTemp ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 9 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 2 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType : ĠHandle , ĠLength : Ġ 2 , ĠValue : Ġ 0 x 0 0 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 A , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 5 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 xFF . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 7 A , Ġ// ĠType : ĠSimple ĠNum , ĠLength : Ġ 4 , Ġvalue : Ġ 3 8 . 7 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 9 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 9 6 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 1 7 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 xA 0 . to Byte (), Ġ// ĠType : ĠUnit ĠCode , ĠLength : Ġ 4 , Ġvalue : ĠC els ius ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 9 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 9 0 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 7 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 2 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 1 E , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 xE 8 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 8 2 . to Byte () Ġ// ĠType : ĠAbs ĠTimestamp , ĠLength : Ġ 8 , Ġvalue : ĠWed ĠDec Ġ 0 2 Ġ 2 0 2 0 Ġ 1 5 : 4 2 : 5 4 Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , Ġ 0 x 0 1 , Ġ 0 x 0 9 , Ġ 0 x 9 0 . to Byte (), Ġ 0 x 0 0 , Ġ 0 x 0 8 , Ġ 0 x 2 0 , Ġ 0 x 2 0 , Ġ 0 x 1 1 , Ġ 0 x 2 6 , Ġ 0 x 1 6 , Ġ 0 x 4 3 , Ġ 0 x 4 4 , Ġ 0 x 7 7 Ġ// ĠType : ĠAbs ĠTimestamp , ĠLength : Ġ 8 , Ġvalue : Ġ 2 0 2 0 / 1 1 / 2 6 Ġ 1 6 : 4 3 : 4 4 . 7 7 ĊĊĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġa com Object Ġ= ĠA com Object ( byteArray ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( ac om Object ) ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġa com Object . observations . size Ġ== Ġ 2 Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġa com Object . observations . first (). type . value Ġ== ĠOb servation Type . M DC _ TEMP _ OR AL . value Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġa com Object . observations . last (). type . value Ġ== ĠOb servation Type . M DC _ TEMP _ OR AL . value Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġa ĠG HS Ġservice Ġhandler Ġwith Ġa Ġlistener , Ġwhen Ġan Ġobservation Ġcharacteristic Ġoccurs , Ġthen Ġthe Ġobservations Ġare Ġsent Ġto Ġlistener `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcharacteristic Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspy k ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth GattCharacteristic ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneric Health Sensor Service Handler . OB SERV ATION _ CHARACTER ISTIC _ UUID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth GattCharacteristic . PROPERTY _ READ , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth GattCharacteristic . PERMISSION _ READ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcharacteristic . uuid Ġ} Ġreturns ĠGeneric Health Sensor Service Handler . OB SERV ATION _ CHARACTER ISTIC _ UUID ĊĊĠĠĠĠĠĠĠ Ġval Ġsegment 1 Ġ= Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSegment Ġheader , Ġfirst Ġsegment , Ġse gem nt Ġ# 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 b 1 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType : ĠO bs ĠType , ĠLength : Ġ 4 , Ġvalue : ĠOr al ĠTemp ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , Ġ 0 x 0 1 , Ġ 0 x 0 9 , Ġ 0 x 2 F , Ġ 0 x 0 0 , Ġ 0 x 0 4 , Ġ 0 x 0 0 , Ġ 0 x 0 2 , Ġ 0 xE 0 . to Byte (), Ġ 0 x 0 8 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsegment 2 Ġ= Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSegment Ġheader , Ġmiddle Ġsegment , Ġse gem nt Ġ# 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 b 1 0 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType : ĠHandle , ĠLength : Ġ 2 , ĠValue : Ġ 0 x 0 0 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , Ġ 0 x 0 1 , Ġ 0 x 0 9 , Ġ 0 x 2 1 , Ġ 0 x 0 0 , Ġ 0 x 0 2 , Ġ 0 x 0 0 , Ġ 0 x 0 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsegment 3 Ġ= Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSegment Ġheader , Ġmiddle Ġsegment , Ġse gem nt Ġ# 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 b 1 1 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType : ĠSimple ĠNum , ĠLength : Ġ 4 , Ġvalue : Ġ 3 8 . 7 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , Ġ 0 x 0 1 , Ġ 0 x 0 A , Ġ 0 x 5 6 , Ġ 0 x 0 0 , Ġ 0 x 0 4 , Ġ 0 xFF . to Byte (), Ġ 0 x 0 0 , Ġ 0 x 0 1 , Ġ 0 x 7 A ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsegment 4 Ġ= Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSegment Ġheader , Ġmiddle Ġsegment , Ġse gem nt Ġ# 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 b 1 0 0 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType : ĠUnit ĠCode , ĠLength : Ġ 4 , Ġvalue : ĠC els ius ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , Ġ 0 x 0 1 , Ġ 0 x 0 9 , Ġ 0 x 9 6 . to Byte (), Ġ 0 x 0 0 , Ġ 0 x 0 4 , Ġ 0 x 0 0 . to Byte (), Ġ 0 x 0 4 , Ġ 0 x 1 7 , Ġ 0 xA 0 . to Byte (), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsegment 5 Ġ= Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSegment Ġheader , Ġlast Ġsegment , Ġse gem nt Ġ# 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 b 1 0 1 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType : ĠAbs ĠTimestamp , ĠLength : Ġ 8 , Ġvalue : ĠWed ĠDec Ġ 0 2 Ġ 2 0 2 0 Ġ 1 5 : 4 2 : 5 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 9 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 9 0 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 7 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 2 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 1 E , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 xE 8 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 8 2 . to Byte () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsegments Ġ= ĠlistOf ( segment 1 , Ġsegment 2 , Ġsegment 3 , Ġsegment 4 , Ġsegment 5 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġobservations Ġ= Ġslot < List < Observation >>() ĊĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġlistener . on Received Ob servations ( any (), Ġcapture ( observations )) Ġ} Ġanswers Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġsegments . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . on Characteristic Update ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperipheral , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG att Status . SUCCESS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġval Ġobs List Ġ= Ġobservations . captured ĊĠĠĠĠĠĠĠ ĠassertNotNull ( obs List ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Given Ġa ĠG HS Ġservice Ġhandler Ġwith Ġa Ġlistener , Ġwhen Ġan Ġ 2 Ġobservation Ġcharacteristic Ġoccurs , Ġthen Ġthe Ġobservations Ġare Ġsent Ġto Ġlistener `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcharacteristic Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspy k ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth GattCharacteristic ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneric Health Sensor Service Handler . OB SERV ATION _ CHARACTER ISTIC _ UUID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth GattCharacteristic . PROPERTY _ READ , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth GattCharacteristic . PERMISSION _ READ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġcharacteristic . uuid Ġ} Ġreturns ĠGeneric Health Sensor Service Handler . OB SERV ATION _ CHARACTER ISTIC _ UUID ĊĊĠĠĠĠĠĠĠ Ġval Ġsegment 1 Ġ= Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSegment Ġheader , Ġfirst Ġsegment , Ġse gem nt Ġ# 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 b 1 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType : ĠO bs ĠType , ĠLength : Ġ 4 , Ġvalue : ĠOr al ĠTemp ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , Ġ 0 x 0 1 , Ġ 0 x 0 9 , Ġ 0 x 2 F , Ġ 0 x 0 0 , Ġ 0 x 0 4 , Ġ 0 x 0 0 , Ġ 0 x 0 2 , Ġ 0 xE 0 . to Byte (), Ġ 0 x 0 8 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsegment 2 Ġ= Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSegment Ġheader , Ġmiddle Ġsegment , Ġse gem nt Ġ# 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 b 1 0 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType : ĠHandle , ĠLength : Ġ 2 , ĠValue : Ġ 0 x 0 0 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , Ġ 0 x 0 1 , Ġ 0 x 0 9 , Ġ 0 x 2 1 , Ġ 0 x 0 0 , Ġ 0 x 0 2 , Ġ 0 x 0 0 , Ġ 0 x 0 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsegment 3 Ġ= Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSegment Ġheader , Ġmiddle Ġsegment , Ġse gem nt Ġ# 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 b 1 1 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType : ĠSimple ĠNum , ĠLength : Ġ 4 , Ġvalue : Ġ 3 8 . 7 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , Ġ 0 x 0 1 , Ġ 0 x 0 A , Ġ 0 x 5 6 , Ġ 0 x 0 0 , Ġ 0 x 0 4 , Ġ 0 xFF . to Byte (), Ġ 0 x 0 0 , Ġ 0 x 0 1 , Ġ 0 x 7 A ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsegment 4 Ġ= Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSegment Ġheader , Ġmiddle Ġsegment , Ġse gem nt Ġ# 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 b 1 0 0 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType : ĠUnit ĠCode , ĠLength : Ġ 4 , Ġvalue : ĠC els ius ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , Ġ 0 x 0 1 , Ġ 0 x 0 9 , Ġ 0 x 9 6 . to Byte (), Ġ 0 x 0 0 , Ġ 0 x 0 4 , Ġ 0 x 0 0 . to Byte (), Ġ 0 x 0 4 , Ġ 0 x 1 7 , Ġ 0 xA 0 . to Byte (), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsegment 5 Ġ= Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSegment Ġheader , Ġmiddle Ġsegment , Ġse gem nt Ġ# 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 b 1 0 1 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType : ĠAbs ĠTimestamp , ĠLength : Ġ 8 , Ġvalue : ĠWed ĠDec Ġ 0 2 Ġ 2 0 2 0 Ġ 1 5 : 4 2 : 5 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 9 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 9 0 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 7 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 2 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 1 E , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 xE 8 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 8 2 . to Byte () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsegment 6 Ġ= Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSegment Ġheader , Ġmiddle Ġsegment , Ġse gem nt Ġ# 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 b 1 1 0 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType : ĠO bs ĠType , ĠLength : Ġ 4 , Ġvalue : ĠHeart ĠRate ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , Ġ 0 x 0 1 , Ġ 0 x 0 9 , Ġ 0 x 2 F , Ġ 0 x 0 0 , Ġ 0 x 0 4 , Ġ 0 x 0 0 , Ġ 0 x 0 2 , Ġ 0 x 4 1 , Ġ 0 x 8 2 . to Byte () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsegment 7 Ġ= Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSegment Ġheader , Ġmiddle Ġsegment , Ġse gem nt Ġ# 7 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 b 1 1 1 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType : ĠHandle , ĠLength : Ġ 2 , ĠValue : Ġ 0 x 0 0 0 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , Ġ 0 x 0 1 , Ġ 0 x 0 9 , Ġ 0 x 2 1 , Ġ 0 x 0 0 , Ġ 0 x 0 2 , Ġ 0 x 0 0 , Ġ 0 x 0 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsegment 8 Ġ= Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSegment Ġheader , Ġmiddle Ġsegment , Ġse gem nt Ġ# 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 b 1 0 0 0 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType : ĠSimple ĠNum , ĠLength : Ġ 4 , Ġvalue : Ġ 6 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , Ġ 0 x 0 1 , Ġ 0 x 0 A , Ġ 0 x 5 6 , Ġ 0 x 0 0 , Ġ 0 x 0 4 , Ġ 0 x 0 0 , Ġ 0 x 0 0 , Ġ 0 x 0 0 , Ġ 0 x 4 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsegment 9 Ġ= Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSegment Ġheader , Ġmiddle Ġsegment , Ġse gem nt Ġ# 9 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 b 1 0 0 1 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType : ĠUnit ĠCode , ĠLength : Ġ 4 , Ġvalue : Ġb pm Ġ 0 x 0 0 0 4 0 AA 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , Ġ 0 x 0 1 , Ġ 0 x 0 9 , Ġ 0 x 9 6 . to Byte (), Ġ 0 x 0 0 , Ġ 0 x 0 4 , Ġ 0 x 0 0 . to Byte (), Ġ 0 x 0 4 , Ġ 0 x 0 A , Ġ 0 xA 0 . to Byte (), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsegment 1 0 Ġ= Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSegment Ġheader , Ġlast Ġsegment , Ġse gem nt Ġ# 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 b 1 0 1 0 1 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠType : ĠAbs ĠTimestamp , ĠLength : Ġ 8 , Ġvalue : ĠWed ĠDec Ġ 0 2 Ġ 2 0 2 0 Ġ 1 5 : 4 2 : 5 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 9 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 9 0 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 0 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 7 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 2 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 1 E , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 xE 8 . to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 x 8 2 . to Byte () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsegments Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegment 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegment 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegment 3 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegment 4 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegment 5 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegment 6 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegment 7 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegment 8 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegment 9 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsegment 1 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġobservations Ġ= Ġslot < List < Observation >>() ĊĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġlistener . on Received Ob servations ( any (), Ġcapture ( observations )) Ġ} Ġanswers Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġsegments . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . on Characteristic Update ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperipheral , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristic , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG att Status . SUCCESS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġval Ġobs List Ġ= Ġobservations . captured ĊĠĠĠĠĠĠĠ ĠassertNotNull ( obs List ) ĊĠĠĠ Ġ} Ċ Ċ }