import 'package:jni/jni.dart'; import 'package:test/test.dart'; import 'test_util/test_util.dart'; void main() { setUpAll(spawnJvm); group('converter', () { test('basics', () { expect(toJObject(false), isA()); expect(toJObject(true), isA()); expect(toDartObject(toJObject(false)), isFalse); expect(toDartObject(toJObject(true)), isTrue); expect(toJObject(123), isA()); expect(toDartObject(toJObject(123)), 123); expect(toJObject(1.23), isA()); expect(toDartObject(toJObject(1.23)), 1.23); expect(toJObject('hello'), isA()); expect(toDartObject(toJObject('hello')), 'hello'); }); test('list', () { final dartList = [123, 'abc', true]; final javaList = toJObject(dartList); expect(javaList, isA()); expect(toDartObject(javaList), dartList); }); test('nested list', () { final dartList = [ 123, ['abc', false], ]; expect( toDartObject(toJObject(dartList)), dartList, ); }); test('set', () { final dartSet = { 123, 'abc', true, }; expect( toJObject(dartSet), isA(), ); final javaSet = toJObject(dartSet) as JSet; expect( javaSet.asDart().length, 3, ); expect( javaSet.asDart().contains( toJObject(123), ), isTrue, ); expect( javaSet.asDart().contains( toJObject('abc'), ), isTrue, ); expect( javaSet.asDart().contains( toJObject(true), ), isTrue, ); expect( toDartObject(javaSet), dartSet, ); final nestedDartSet = { 1, {2, 3}, { 4, {5}, }, }; final nestedJavaSet = toJObject(nestedDartSet); expect( toDartObject(nestedJavaSet), nestedDartSet, ); }); test('map', () { final dartMap = { 123: 'abc', 'def': 456, true: 1.23, }; expect( toJObject(dartMap), isA(), ); final javaMap = toJObject(dartMap) as JMap; expect( javaMap.asDart().length, 3, ); expect( toDartObject( javaMap.asDart()[toJObject(123)]!, ), 'abc', ); expect( toDartObject( javaMap.asDart()[toJObject('def')]!, ), 456, ); expect( toDartObject( javaMap.asDart()[toJObject(true)]!, ), 1.23, ); expect( toDartObject(javaMap), dartMap, ); final nestedDartMap = { 1: { 2: 3, }, 4: { 5: { 6: 7, }, }, }; final nestedJavaMap = toJObject(nestedDartMap); expect( toDartObject(nestedJavaMap), nestedDartMap, ); }); test('primitive arrays', () { expect( toDartObject( JBooleanArray.of( [true, false, true], ), ), [true, false, true], ); expect( toDartObject( JByteArray.of( [1, 2, 3], ), ), [1, 2, 3], ); expect( toDartObject( JCharArray.of( [65, 66, 67], ), ), [65, 66, 67], ); expect( toDartObject( JShortArray.of( [1, 2, 3], ), ), [1, 2, 3], ); expect( toDartObject( JIntArray.of( [1, 2, 3], ), ), [1, 2, 3], ); expect( toDartObject( JLongArray.of( [1, 2, 3], ), ), [1, 2, 3], ); expect( toDartObject( JFloatArray.of( [1.0, 2.0, 3.0], ), ), [1.0, 2.0, 3.0], ); expect( toDartObject( JDoubleArray.of( [1.0, 2.0, 3.0], ), ), [1.0, 2.0, 3.0], ); }); test('unsupported type', () { expect( () => toJObject(Future.value()), throwsA(isA()), ); final obj = JClass.forName('java/lang/Object'); try { expect(toJObject(obj), same(obj)); expect(toDartObject(obj), same(obj)); } finally { obj.release(); } }); test('custom converter in toJObject', () { final future = Future.value(); JObject conv(Object _) => 'converted'.toJString(); expect( toDartObject( toJObject( future, convertOther: conv, ), ), 'converted', ); final list = toJObject( [123, future], convertOther: conv, ); expect( toDartObject(list), [123, 'converted'], ); }); test('custom converter in toDartObject', () { final future = Future.value(); final obj = JClass.forName('java/lang/Object'); try { Object conv(JObject _) => future; expect( toDartObject( obj, convertOther: conv, ), same(future), ); final list = toJObject( ['abc', obj], ); expect( toDartObject( list, convertOther: conv, ), ['abc', future], ); } finally { obj.release(); } }); test('nullable object', () { expect( toNullableDartObject(null), isNull, ); final javaString = 'hello'.toJString(); expect( toNullableDartObject(javaString), 'hello', ); }); test('null in list', () { final javaList = [ 'abc'.toJString(), null, 123.toJLong(), ].toJList(); expect( toDartObject(javaList), ['abc', null, 123], ); }); test('typed collection conversion', () { final javaList = [ 1.toJLong(), 2.toJLong(), ].toJList(); final dartList = javaList.toDartList(); expect( dartList.cast(), [1, 2], ); final javaSet = { 'a'.toJString(), 'b'.toJString(), }.toJSet(); final dartSet = javaSet.toDartSet(); expect( dartSet.cast(), {'a', 'b'}, ); final javaMap = { 'one'.toJString(): 1.toJLong(), 'two'.toJString(): 2.toJLong(), }.toJMap(); final dartMap = javaMap.toDartMap(); expect( dartMap.cast(), { 'one': 1, 'two': 2, }, ); }); test('object array is detected as JObject array', () { final array = JArray.of( JString.type, [ 'a'.toJString(), 'b'.toJString(), ], ); expect( array.isA( JArray.type(JObject.type), ), isTrue, ); }); test('object array', () { final array = JArray.of( JString.type, [ 'a'.toJString(), 'b'.toJString(), ], ); expect( toDartObject(array), ['a', 'b'], ); }); test('object array with null', () { final array = JArray.of( JObject.type, [ 'a'.toJString(), null, 123.toJLong(), ], ); expect( toDartObject(array), ['a', null, 123], ); }); test('object array deep conversion', () { final array = JArray.of( JObject.type, [ 'abc'.toJString(), null, 123.toJLong(), ], ); expect( array.toDartList(), ['abc', null, 123], ); }); test('custom converter in object array', () { final obj = JClass.forName('java/lang/Object'); try { final array = JArray.of( JObject.type, [ 'abc'.toJString(), obj, ], ); Object conv(JObject _) => 'converted'; expect( array.toDartList( convertOther: conv, ), ['abc', 'converted'], ); expect( toDartObject( array, convertOther: conv, ), ['abc', 'converted'], ); } finally { obj.release(); } }); test('nullable Dart object', () { expect( toNullableJObject(null), isNull, ); final javaString = toNullableJObject('hello'); expect( javaString, isA(), ); expect( toDartObject(javaString!), 'hello', ); }); test('null in Dart list', () { final dartList = [ 'abc', null, 123, ]; final javaList = toJObject(dartList); expect( toDartObject(javaList), dartList, ); }); test('null in Dart set', () { final dartSet = { 'abc', null, 123, }; final javaSet = toJObject(dartSet); expect( toDartObject(javaSet), dartSet, ); }); test('null in Dart map', () { final dartMap = { 'value': null, null: 123, }; final javaMap = toJObject(dartMap); expect( toDartObject(javaMap), dartMap, ); }); test('nested null conversion', () { final dartObject = [ 1, null, [ 'abc', null, ], { 'key': null, }, ]; expect( toDartObject(toJObject(dartObject)), dartObject, ); }); test('Dart list to object array', () { final dartList = [ 'abc', 123, null, true, ]; final javaArray = dartList.toJArray(); expect( toDartObject(javaArray), dartList, ); }); test('Dart list to nested object array', () { final dartList = [ 'abc', null, [ 123, true, ], ]; final javaArray = dartList.toJArray(); expect( toDartObject(javaArray), dartList, ); }); }); }