// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:io'; import 'package:jni/jni.dart'; import 'package:test/test.dart'; import 'test_util/test_util.dart'; void main() { // Don't forget to initialize JNI. if (!Platform.isAndroid) { spawnJvm(); } run(testRunner: test); } void run({required TestRunnerCallback testRunner}) { JMap testDataMap(Arena arena) { return { '1'.toJString()..releasedBy(arena): 'One'.toJString()..releasedBy(arena), '2'.toJString()..releasedBy(arena): 'Two'.toJString()..releasedBy(arena), '3'.toJString()..releasedBy(arena): 'Three'.toJString() ..releasedBy(arena), }.toJMap() ..releasedBy(arena); } JMap testNullableDataMap(Arena arena) { return { '1'.toJString()..releasedBy(arena): 'One'.toJString()..releasedBy(arena), '2'.toJString()..releasedBy(arena): 'Two'.toJString()..releasedBy(arena), '3'.toJString()..releasedBy(arena): null, null: null, }.toJMap() ..releasedBy(arena); } testRunner('length', () { using((arena) { final map = testDataMap(arena); expect(map.size(), 3); expect(map.asDart().length, 3); }); }); testRunner('[]', () { using((arena) { final map = testDataMap(arena).asDart(); // ignore: collection_methods_unrelated_type expect(map[1], null); expect( map['1'.toJString()..releasedBy(arena)] ?.toDartString(releaseOriginal: true), 'One', ); expect( map['4'.toJString()..releasedBy(arena)], null, ); }); }); testRunner('nullable []', () { using((arena) { final map = testNullableDataMap(arena).asDart(); // ignore: collection_methods_unrelated_type expect(map[1], null); expect( map['1'.toJString()..releasedBy(arena)] ?.toDartString(releaseOriginal: true), 'One', ); expect( map['4'.toJString()..releasedBy(arena)], null, ); expect( map['3'.toJString()..releasedBy(arena)], null, ); expect( map[null], null, ); }); }); testRunner('[]=', () { using((arena) { final map = testDataMap(arena).asDart(); map['0'.toJString()..releasedBy(arena)] = 'Zero'.toJString() ..releasedBy(arena); expect( map['0'.toJString()..releasedBy(arena)] ?.toDartString(releaseOriginal: true), 'Zero', ); expect(map.length, 4); map['1'.toJString()..releasedBy(arena)] = 'one!'.toJString() ..releasedBy(arena); expect( map['1'.toJString()..releasedBy(arena)] ?.toDartString(releaseOriginal: true), 'one!', ); expect(map.length, 4); }); }); testRunner('nullable []=', () { using((arena) { final map = testNullableDataMap(arena).asDart(); map['0'.toJString()..releasedBy(arena)] = 'Zero'.toJString() ..releasedBy(arena); expect( map['0'.toJString()..releasedBy(arena)] ?.toDartString(releaseOriginal: true), 'Zero', ); expect(map.length, 5); map['1'.toJString()..releasedBy(arena)] = 'one!'.toJString() ..releasedBy(arena); expect( map['1'.toJString()..releasedBy(arena)] ?.toDartString(releaseOriginal: true), 'one!', ); expect(map.length, 5); map['1'.toJString()..releasedBy(arena)] = null; expect(map['1'.toJString()..releasedBy(arena)], null); expect(map.length, 5); map[null] = 'null'.toJString()..releasedBy(arena); expect( map[null]?.toDartString(releaseOriginal: true), 'null', ); }); }); testRunner('addAll', () { using((arena) { final map = testDataMap(arena).asDart(); final toAdd = { '0'.toJString()..releasedBy(arena): 'Zero'.toJString() ..releasedBy(arena), '1'.toJString()..releasedBy(arena): 'one!'.toJString() ..releasedBy(arena), }; map.addAll(toAdd); expect(map.length, 4); expect( map['0'.toJString()..releasedBy(arena)] ?.toDartString(releaseOriginal: true), 'Zero', ); expect( map['1'.toJString()..releasedBy(arena)] ?.toDartString(releaseOriginal: true), 'one!', ); map.addAll({ '4'.toJString()..releasedBy(arena): 'Four'.toJString() ..releasedBy(arena) }); expect(map.length, 5); }); }); testRunner('clear, isEmpty, isNotEmpty', () { using((arena) { final map = testDataMap(arena).asDart(); expect(map.isEmpty, false); expect(map.isNotEmpty, true); map.clear(); expect(map.isEmpty, true); expect(map.isNotEmpty, false); }); }); testRunner('containsKey', () { using((arena) { final map = testDataMap(arena).asDart(); // ignore: collection_methods_unrelated_type expect(map.containsKey(1), false); expect(map.containsKey('1'.toJString()..releasedBy(arena)), true); expect(map.containsKey('4'.toJString()..releasedBy(arena)), false); }); }); testRunner('nullable containsKey', () { using((arena) { final map = testNullableDataMap(arena).asDart(); // ignore: collection_methods_unrelated_type expect(map.containsKey(1), false); expect(map.containsKey('1'.toJString()..releasedBy(arena)), true); expect(map.containsKey('4'.toJString()..releasedBy(arena)), false); expect(map.containsKey(null), true); }); }); testRunner('containsValue', () { using((arena) { final map = testDataMap(arena).asDart(); // ignore: collection_methods_unrelated_type expect(map.containsValue(1), false); expect(map.containsValue('One'.toJString()..releasedBy(arena)), true); expect(map.containsValue('Four'.toJString()..releasedBy(arena)), false); }); }); testRunner('nullable containsValue', () { using((arena) { final map = testNullableDataMap(arena).asDart(); // ignore: collection_methods_unrelated_type expect(map.containsValue(1), false); expect(map.containsValue('One'.toJString()..releasedBy(arena)), true); expect(map.containsValue('Four'.toJString()..releasedBy(arena)), false); expect(map.containsValue(null), true); }); }); testRunner('keys', () { using((arena) { final map = testDataMap(arena).asDart(); final keys = map.keys; expect( keys .map((element) => element.toDartString(releaseOriginal: true)) .toSet(), {'1', '2', '3'}, ); }); }); testRunner('remove', () { using((arena) { final map = testDataMap(arena).asDart(); // ignore: collection_methods_unrelated_type expect(map.remove(1), null); expect(map.remove('4'.toJString()..releasedBy(arena)), null); expect(map.length, 3); expect( map .remove('3'.toJString()..releasedBy(arena)) ?.toDartString(releaseOriginal: true), 'Three', ); expect(map.length, 2); }); }); testRunner('nullable remove', () { using((arena) { final map = testNullableDataMap(arena).asDart(); // ignore: collection_methods_unrelated_type expect(map.remove(1), null); expect(map.remove('4'.toJString()..releasedBy(arena)), null); expect(map.length, 4); expect( map .remove('3'.toJString()..releasedBy(arena)) ?.toDartString(releaseOriginal: true), null, ); expect(map.length, 3); expect( map.remove(null), null, ); expect(map.length, 2); }); }); }