package Ġuk . n hs . n hs x . an alytic ss ub mission . model Ċ Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . fail Ċ import Ġstri kt . api . expect That Ċ import Ġstri kt . assertions . isEqualTo Ċ import Ġstri kt . assertions . is GreaterThan Ċ import Ġstri kt . assertions . isNull Ċ import Ġuk . n hs . n hs x . an alytic ss ub mission . analytics Submission I os Ċ import Ġuk . n hs . n hs x . an alytic ss ub mission . analytics Submission I os Complete Ċ import Ġuk . n hs . n hs x . an alytic ss ub mission . analytics Submission Android Ċ import Ġuk . n hs . n hs x . core . Json Ċ import Ġkotlin . reflect . full . member Properties Ċ Ċ class ĠClient Analytics Submission Payload Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġdeserialize Ġfirst Ġversion Ġof Ġandroid Ġpayload `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġanalytics Submission Android () ĊĊĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= ĠJson . read Json OrThrow < Client Analytics Submission Payload >( json ) ĊĠĠĠĠĠĠĠ Ġexpect That ( payload . metadata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġoperating System Version Ġ}. isEqualTo (" 2 9 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġlatest Application Version Ġ}. isEqualTo (" 3 . 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġdevice Model Ġ}. isEqualTo (" Pixel Ġ 4 XL ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġpostal District Ġ}. isEqualTo (" AB 1 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġlocal Authority Ġ}. isNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect That ( payload . metrics ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġcumulative Download Bytes Ġ}. isEqualTo ( 1 4 0 0 0 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġcumulative Upload Bytes Ġ}. isEqualTo ( 1 6 0 0 0 0 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġcumulative Cell ular Download Bytes Ġ}. isNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġcumulative Cell ular Upload Bytes Ġ}. isNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġcumulative Wifi Download Bytes Ġ}. isNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġcumulative Wifi Upload Bytes Ġ}. isNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġdeserialize Ġfirst Ġversion Ġios Ġpayload `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠiOS Ġhas Ġextra Ġfields Ġfor Ġcell ular Ġand Ġwifi Ġbytes ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġanalytics Submission I os () ĊĊĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= ĠJson . read Json OrThrow < Client Analytics Submission Payload >( json ) ĊĠĠĠĠĠĠĠ Ġexpect That ( payload . metadata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġoperating System Version Ġ}. isEqualTo (" iPhone ĠOS Ġ 1 3 . 5 . 1 Ġ( 1 7 F 8 0 )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġlatest Application Version Ġ}. isEqualTo (" 3 . 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġdevice Model Ġ}. isEqualTo (" iPhone 1 1 , 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġpostal District Ġ}. isEqualTo (" AB 1 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġlocal Authority Ġ}. isNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġdeserialize Ġwith Ġlocal Ġauthority Ġfield `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġanalytics Submission I os ( local Authority Ġ= Ġ" E 0 6 0 0 0 0 5 1 ") ĊĊĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= ĠJson . read Json OrThrow < Client Analytics Submission Payload >( json ) ĊĠĠĠĠĠĠĠ Ġexpect That ( payload . metadata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġoperating System Version Ġ}. isEqualTo (" iPhone ĠOS Ġ 1 3 . 5 . 1 Ġ( 1 7 F 8 0 )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġlatest Application Version Ġ}. isEqualTo (" 3 . 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġdevice Model Ġ}. isEqualTo (" iPhone 1 1 , 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġpostal District Ġ}. isEqualTo (" AB 1 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġlocal Authority Ġ}. isEqualTo (" E 0 6 0 0 0 0 5 1 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġdeserialize Ġwith Ġall Ġoptional Ġmetrics Ġin Ġnewer Ġversions Ġof Ġpayload `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġanalytics Submission I os Complete ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Authority Ġ= Ġ" E 0 6 0 0 0 0 5 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Counter Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= ĠJson . read Json OrThrow < Client Analytics Submission Payload >( json ) ĊĠĠĠĠĠĠĠ Ġexpect That ( payload . metadata ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġoperating System Version Ġ}. isEqualTo (" iPhone ĠOS Ġ 1 3 . 5 . 1 Ġ( 1 7 F 8 0 )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġlatest Application Version Ġ}. isEqualTo (" 3 . 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġdevice Model Ġ}. isEqualTo (" iPhone 1 1 , 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġpostal District Ġ}. isEqualTo (" AB 1 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ Ġlocal Authority Ġ}. isEqualTo (" E 0 6 0 0 0 0 5 1 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpayload . metrics :: class . member Properties . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Value Ġ= Ġit . getter . call ( payload . metrics ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġfail (" unexpected Ġfield Ġ[ ${ it . name }], Ġif Ġthis Ġis Ġa Ġnew Ġfield Ġthen Ġadd Ġit Ġto Ġthe Ġunit Ġtest Ġpayload Ġwith Ġnon - null Ġvalue Ġgreater Ġthan Ġ 0 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( property Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInt Ġ-> Ġexpect That ( property Value ). is GreaterThan ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLong Ġ-> Ġexpect That ( property Value ). is GreaterThan ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfail (" metrics Ġin Ġthis Ġclass Ġshould Ġbe Ġnumbers , Ġunexpected Ġtype Ġ[ ${ it . returnType }] Ġfor Ġfield Ġ[ ${ it . name }] ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ