@@ -204,6 +204,168 @@ void main() {
204204 );
205205 });
206206
207+ test ('nested null class nullsafe' , () {
208+ final Root root = Root (apis: < Api > [], classes: < Class > [
209+ Class (
210+ name: 'Input' ,
211+ fields: < NamedType > [
212+ NamedType (
213+ type: const TypeDeclaration (
214+ baseName: 'String' ,
215+ isNullable: true ,
216+ ),
217+ name: 'input' ,
218+ offset: null )
219+ ],
220+ ),
221+ Class (
222+ name: 'Nested' ,
223+ fields: < NamedType > [
224+ NamedType (
225+ type: const TypeDeclaration (
226+ baseName: 'Input' ,
227+ isNullable: true ,
228+ ),
229+ name: 'nested' ,
230+ offset: null )
231+ ],
232+ )
233+ ], enums: < Enum > []);
234+ final StringBuffer sink = StringBuffer ();
235+ generateDart (const DartOptions (isNullSafe: true ), root, sink);
236+ final String code = sink.toString ();
237+ expect (
238+ code,
239+ contains (
240+ 'pigeonMap[\' nested\' ] = nested?.encode()' ,
241+ ),
242+ );
243+ expect (
244+ code.replaceAll ('\n ' , ' ' ).replaceAll (' ' , '' ),
245+ contains (
246+ 'nested: pigeonMap[\' nested\' ] != null ? Input.decode(pigeonMap[\' nested\' ]!) : null' ,
247+ ),
248+ );
249+ });
250+
251+ test ('nested non-null class nullsafe' , () {
252+ final Root root = Root (apis: < Api > [], classes: < Class > [
253+ Class (
254+ name: 'Input' ,
255+ fields: < NamedType > [
256+ NamedType (
257+ type: const TypeDeclaration (
258+ baseName: 'String' ,
259+ isNullable: true ,
260+ ),
261+ name: 'input' ,
262+ offset: null )
263+ ],
264+ ),
265+ Class (
266+ name: 'Nested' ,
267+ fields: < NamedType > [
268+ NamedType (
269+ type: const TypeDeclaration (
270+ baseName: 'Input' ,
271+ isNullable: false ,
272+ ),
273+ name: 'nested' ,
274+ offset: null )
275+ ],
276+ )
277+ ], enums: < Enum > []);
278+ final StringBuffer sink = StringBuffer ();
279+ generateDart (const DartOptions (isNullSafe: true ), root, sink);
280+ final String code = sink.toString ();
281+ expect (
282+ code,
283+ contains (
284+ 'pigeonMap[\' nested\' ] = nested.encode()' ,
285+ ),
286+ );
287+ expect (
288+ code.replaceAll ('\n ' , ' ' ).replaceAll (' ' , '' ),
289+ contains (
290+ 'nested: Input.decode(pigeonMap[\' nested\' ]!)' ,
291+ ),
292+ );
293+ });
294+
295+ test ('nested null enum nullsafe' , () {
296+ final Root root = Root (apis: < Api > [], classes: < Class > [
297+ Class (
298+ name: 'Nested' ,
299+ fields: < NamedType > [
300+ NamedType (
301+ type: const TypeDeclaration (
302+ baseName: 'Input' ,
303+ isNullable: true ,
304+ ),
305+ name: 'nested' ,
306+ offset: null )
307+ ],
308+ )
309+ ], enums: < Enum > [
310+ Enum (
311+ name: 'Input' ,
312+ members: < String > ['A' , 'B' ],
313+ )
314+ ]);
315+ final StringBuffer sink = StringBuffer ();
316+ generateDart (const DartOptions (isNullSafe: true ), root, sink);
317+ final String code = sink.toString ();
318+ expect (
319+ code,
320+ contains (
321+ 'pigeonMap[\' nested\' ] = nested?.index' ,
322+ ),
323+ );
324+ expect (
325+ code.replaceAll ('\n ' , ' ' ).replaceAll (' ' , '' ),
326+ contains (
327+ 'nested: pigeonMap[\' nested\' ] != null ? Input.values[pigeonMap[\' nested\' ]! as int] : null' ,
328+ ),
329+ );
330+ });
331+
332+ test ('nested non-null enum nullsafe' , () {
333+ final Root root = Root (apis: < Api > [], classes: < Class > [
334+ Class (
335+ name: 'Nested' ,
336+ fields: < NamedType > [
337+ NamedType (
338+ type: const TypeDeclaration (
339+ baseName: 'Input' ,
340+ isNullable: false ,
341+ ),
342+ name: 'nested' ,
343+ offset: null )
344+ ],
345+ )
346+ ], enums: < Enum > [
347+ Enum (
348+ name: 'Input' ,
349+ members: < String > ['A' , 'B' ],
350+ )
351+ ]);
352+ final StringBuffer sink = StringBuffer ();
353+ generateDart (const DartOptions (isNullSafe: true ), root, sink);
354+ final String code = sink.toString ();
355+ expect (
356+ code,
357+ contains (
358+ 'pigeonMap[\' nested\' ] = nested.index' ,
359+ ),
360+ );
361+ expect (
362+ code.replaceAll ('\n ' , ' ' ).replaceAll (' ' , '' ),
363+ contains (
364+ 'nested: Input.values[pigeonMap[\' nested\' ]! as int]' ,
365+ ),
366+ );
367+ });
368+
207369 test ('flutterapi' , () {
208370 final Root root = Root (apis: < Api > [
209371 Api (name: 'Api' , location: ApiLocation .flutter, methods: < Method > [
@@ -443,10 +605,7 @@ void main() {
443605 final StringBuffer sink = StringBuffer ();
444606 generateDart (const DartOptions (isNullSafe: true ), root, sink);
445607 final String code = sink.toString ();
446- expect (
447- code,
448- contains (
449- 'pigeonMap[\' enum1\' ] = enum1 == null ? null : enum1!.index;' ));
608+ expect (code, contains ('pigeonMap[\' enum1\' ] = enum1?.index;' ));
450609 expect (code, contains ('? Enum.values[pigeonMap[\' enum1\' ]! as int]' ));
451610 expect (code, contains ('EnumClass doSomething(EnumClass arg0);' ));
452611 });
0 commit comments