// 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 'package:test/test.dart'; import 'package:vm_service/vm_service.dart'; import 'common/service_test_common.dart'; import 'contexts_lib.dart' as testee_lib; void main(List args) => IsolateTestHarness( 'contexts_lib.dart', args, ).addCustomTest((VmService service, IsolateRef isolateRef) async { final isolateId = isolateRef.id!; final isolate = await service.getIsolate(isolateId); final rootLib = await service.getObject( isolateId, isolate.libraries! .firstWhere((l) => l.uri!.contains('contexts_lib')) .id!) as Library; final fieldRef = rootLib.variables!.singleWhere((v) => v.name == 'cleanBlock'); final field = await service.getObject(isolateId, fieldRef.id!) as Field; final block = await service.getObject( isolateId, field.staticValue.id!, ) as Instance; expect(block.closureFunction, isNotNull); expect(block.closureContext, isNull); }).addCustomTest((VmService service, IsolateRef isolateRef) async { final isolateId = isolateRef.id!; final isolate = await service.getIsolate(isolateId); final rootLib = await service.getObject( isolateId, isolate.libraries! .firstWhere((l) => l.uri!.contains('contexts_lib')) .id!) as Library; final fieldRef = rootLib.variables!.singleWhere((v) => v.name == 'copyingBlock'); final field = await service.getObject(isolateId, fieldRef.id!) as Field; final block = await service.getObject( isolateId, field.staticValue.id!, ) as Instance; expect(block.closureFunction, isNotNull); expect(block.closureContext, isNotNull); final closureContext = block.closureContext!; expect(closureContext.length, 1); final ctxt = await service.getObject(isolateId, closureContext.id!) as Context; final value = ctxt.variables!.single.value as InstanceRef; expect(value.kind, InstanceKind.kString); expect(value.valueAsString, 'I could be copied into the block'); expect(ctxt.parent, isNull); }).addCustomTest((VmService service, IsolateRef isolateRef) async { final isolateId = isolateRef.id!; final isolate = await service.getIsolate(isolateId); final rootLib = await service.getObject( isolateId, isolate.libraries! .firstWhere((l) => l.uri!.contains('contexts_lib')) .id!) as Library; final fieldRef = rootLib.variables!.singleWhere((v) => v.name == 'fullBlock'); final field = await service.getObject(isolateId, fieldRef.id!) as Field; final block = await service.getObject( isolateId, field.staticValue.id!, ) as Instance; expect(block.closureFunction, isNotNull); expect(block.closureContext, isNotNull); final closureContext = block.closureContext!; expect(block.closureContext!.length, 1); final ctxt = await service.getObject(isolateId, closureContext.id!) as Context; final value = ctxt.variables!.single.value as InstanceRef; expect(value.kind, InstanceKind.kInt); expect(value.valueAsString, '43'); expect(ctxt.parent, isNull); }).addCustomTest((VmService service, IsolateRef isolateRef) async { final isolateId = isolateRef.id!; final isolate = await service.getIsolate(isolateId); final rootLib = await service.getObject( isolateId, isolate.libraries! .firstWhere((l) => l.uri!.contains('contexts_lib')) .id!) as Library; final fieldRef = rootLib.variables!.singleWhere((v) => v.name == 'fullBlockWithChain'); final field = await service.getObject(isolateId, fieldRef.id!) as Field; final block = await service.getObject( isolateId, field.staticValue.id!, ) as Instance; expect(block.closureFunction, isNotNull); expect(block.closureContext, isNotNull); final closureContext = block.closureContext!; expect(block.closureContext!.length, 1); final ctxt = await service.getObject(isolateId, closureContext.id!) as Context; final value = ctxt.variables!.single.value as InstanceRef; expect(value.kind, InstanceKind.kInt); expect(value.valueAsString, '4201'); final parent = ctxt.parent!; expect(parent.length, 1); final outerCtxt = await service.getObject(isolateId, parent.id!) as Context; final outerValue = outerCtxt.variables!.single.value as InstanceRef; expect(outerValue.kind, InstanceKind.kInt); expect(outerValue.valueAsString, '421'); expect(outerCtxt.parent, isNull); }).run(testeeMain: testee_lib.main);