@@ -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