@@ -152,6 +152,154 @@ void main() {
152152 null ,
153153 );
154154 });
155+
156+ test ('orientation handles portrait' , () {
157+ final map = {'orientation' : 'portrait' };
158+ final sentryDevice = SentryDevice .fromJson (map);
159+ expect (sentryDevice.orientation, SentryOrientation .portrait);
160+ });
161+
162+ test ('orientation handles landscape' , () {
163+ final map = {'orientation' : 'landscape' };
164+ final sentryDevice = SentryDevice .fromJson (map);
165+ expect (sentryDevice.orientation, SentryOrientation .landscape);
166+ });
167+
168+ test ('orientation returns null for invalid enum value' , () {
169+ final map = {'orientation' : 'invalid' };
170+ final sentryDevice = SentryDevice .fromJson (map);
171+ expect (sentryDevice.orientation, isNull);
172+ });
173+
174+ test ('orientation returns null for non-string value' , () {
175+ final map = {'orientation' : 123 };
176+ final sentryDevice = SentryDevice .fromJson (map);
177+ expect (sentryDevice.orientation, isNull);
178+ });
179+
180+ test ('bootTime parses valid ISO8601 string' , () {
181+ final dateTime = DateTime (2023 , 10 , 15 , 12 , 30 , 45 );
182+ final map = {'boot_time' : dateTime.toIso8601String ()};
183+ final sentryDevice = SentryDevice .fromJson (map);
184+ expect (sentryDevice.bootTime, isNotNull);
185+ expect (sentryDevice.bootTime! .year, 2023 );
186+ expect (sentryDevice.bootTime! .month, 10 );
187+ expect (sentryDevice.bootTime! .day, 15 );
188+ });
189+
190+ test ('bootTime returns null for invalid date string' , () {
191+ final map = {'boot_time' : 'not a date' };
192+ final sentryDevice = SentryDevice .fromJson (map);
193+ expect (sentryDevice.bootTime, isNull);
194+ });
195+
196+ test ('bootTime returns null for non-string value' , () {
197+ final map = {'boot_time' : 12345 };
198+ final sentryDevice = SentryDevice .fromJson (map);
199+ expect (sentryDevice.bootTime, isNull);
200+ });
201+
202+ test ('string fields return null for non-string values' , () {
203+ final map = {
204+ 'name' : 123 ,
205+ 'family' : true ,
206+ 'model' : ['array' ],
207+ 'arch' : {'object' : 'value' },
208+ };
209+ final sentryDevice = SentryDevice .fromJson (map);
210+ expect (sentryDevice.name, isNull);
211+ expect (sentryDevice.family, isNull);
212+ expect (sentryDevice.model, isNull);
213+ expect (sentryDevice.arch, isNull);
214+ });
215+
216+ test ('int fields return null for non-numeric values' , () {
217+ final map = {
218+ 'screen_height_pixels' : 'not a number' ,
219+ 'screen_width_pixels' : true ,
220+ 'screen_dpi' : ['array' ],
221+ 'processor_count' : {'object' : 'value' },
222+ };
223+ final sentryDevice = SentryDevice .fromJson (map);
224+ expect (sentryDevice.screenHeightPixels, isNull);
225+ expect (sentryDevice.screenWidthPixels, isNull);
226+ expect (sentryDevice.screenDpi, isNull);
227+ expect (sentryDevice.processorCount, isNull);
228+ });
229+
230+ test ('double fields return null for non-numeric values' , () {
231+ final map = {
232+ 'screen_density' : 'not a number' ,
233+ 'processor_frequency' : true ,
234+ };
235+ final sentryDevice = SentryDevice .fromJson (map);
236+ expect (sentryDevice.screenDensity, isNull);
237+ expect (sentryDevice.processorFrequency, isNull);
238+ });
239+
240+ test ('bool fields return null for non-boolean values' , () {
241+ final map = {
242+ 'online' : 'true' ,
243+ 'simulator' : 'false' ,
244+ };
245+ final sentryDevice = SentryDevice .fromJson (map);
246+ expect (sentryDevice.online, isNull);
247+ expect (sentryDevice.simulator, isNull);
248+ });
249+
250+ test ('bool fields accept numeric 0 and 1 as false and true' , () {
251+ final map = {
252+ 'charging' : 1 ,
253+ 'low_memory' : 0 ,
254+ 'online' : 1.0 ,
255+ 'simulator' : 0.0 ,
256+ };
257+ final sentryDevice = SentryDevice .fromJson (map);
258+ expect (sentryDevice.charging, true );
259+ expect (sentryDevice.lowMemory, false );
260+ expect (sentryDevice.online, true );
261+ expect (sentryDevice.simulator, false );
262+ });
263+
264+ test ('bool fields return null for other numeric values' , () {
265+ final map = {
266+ 'charging' : 2 ,
267+ 'low_memory' : - 1 ,
268+ 'online' : 0.5 ,
269+ };
270+ final sentryDevice = SentryDevice .fromJson (map);
271+ expect (sentryDevice.charging, isNull);
272+ expect (sentryDevice.lowMemory, isNull);
273+ expect (sentryDevice.online, isNull);
274+ });
275+
276+ test ('mixed valid and invalid data deserializes partially' , () {
277+ final map = {
278+ 'name' : 'valid name' ,
279+ 'family' : 123 , // invalid
280+ 'battery_level' : 75.5 ,
281+ 'orientation' : 'invalid' , // invalid enum
282+ 'online' : true ,
283+ 'charging' : 'not a bool' , // invalid
284+ 'screen_height_pixels' : 1920 ,
285+ 'screen_width_pixels' : 'not a number' , // invalid
286+ 'boot_time' : 'not a date' , // invalid
287+ };
288+ final sentryDevice = SentryDevice .fromJson (map);
289+
290+ // Valid fields should deserialize correctly
291+ expect (sentryDevice.name, 'valid name' );
292+ expect (sentryDevice.batteryLevel, 75.5 );
293+ expect (sentryDevice.online, true );
294+ expect (sentryDevice.screenHeightPixels, 1920 );
295+
296+ // Invalid fields should be null
297+ expect (sentryDevice.family, isNull);
298+ expect (sentryDevice.orientation, isNull);
299+ expect (sentryDevice.charging, isNull);
300+ expect (sentryDevice.screenWidthPixels, isNull);
301+ expect (sentryDevice.bootTime, isNull);
302+ });
155303 });
156304
157305 test ('copyWith keeps unchanged' , () {
0 commit comments