| // Copyright (c) 2014, 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. |
| // VMOptions=--error_on_bad_type --error_on_bad_override |
| |
| library inbound_references_test; |
| |
| import 'package:observatory/service_io.dart'; |
| import 'package:unittest/unittest.dart'; |
| import 'test_helper.dart'; |
| |
| var cleanBlock, copyingBlock, fullBlock, fullBlockWithChain; |
| |
| Function genCleanBlock() { |
| block(x) => x; |
| return block; |
| } |
| |
| Function genCopyingBlock() { |
| final x = 'I could be copied into the block'; |
| block() => x; |
| return block; |
| } |
| |
| Function genFullBlock() { |
| var x = 42; // I must captured in a context. |
| block() => x; |
| x++; |
| return block; |
| } |
| |
| Function genFullBlockWithChain() { |
| var x = 420; // I must captured in a context. |
| outerBlock() { |
| var y = 4200; |
| innerBlock() => x + y; |
| y++; |
| return innerBlock; |
| } |
| x++; |
| return outerBlock(); |
| } |
| |
| void script() { |
| cleanBlock = genCleanBlock(); |
| copyingBlock = genCopyingBlock(); |
| fullBlock = genFullBlock(); |
| fullBlockWithChain = genFullBlockWithChain(); |
| } |
| |
| var tests = [ |
| |
| (Isolate isolate) => |
| isolate.rootLibrary.load().then((Library lib) { |
| Field field = lib.variables.singleWhere((v) => v.name == 'cleanBlock'); |
| return field.load().then((_) { |
| return field.staticValue.load().then((Instance block) { |
| expect(block.isClosure, isTrue); |
| expect(block.closureContext.isContext, isTrue); |
| expect(block.closureContext.length, equals(0)); |
| return block.closureContext.load().then((Context ctxt) { |
| expect(ctxt.parentContext, isNull); |
| }); |
| }); |
| }); |
| }), |
| |
| (Isolate isolate) => |
| isolate.rootLibrary.load().then((Library lib) { |
| Field field = lib.variables.singleWhere((v) => v.name == 'copyingBlock'); |
| return field.load().then((_) { |
| return field.staticValue.load().then((Instance block) { |
| expect(block.isClosure, isTrue); |
| expect(block.closureContext.isContext, isTrue); |
| expect(block.closureContext.length, equals(1)); |
| return block.closureContext.load().then((Context ctxt) { |
| expect(ctxt.variables.single.value.asValue.isString, isTrue); |
| expect(ctxt.variables.single.value.asValue.valueAsString, |
| equals('I could be copied into the block')); |
| expect(ctxt.parentContext.isContext, isTrue); |
| expect(ctxt.parentContext.length, equals(0)); |
| return ctxt.parentContext.load().then((Context outerCtxt) { |
| expect(outerCtxt.parentContext, isNull); |
| }); |
| }); |
| }); |
| }); |
| }), |
| |
| (Isolate isolate) => |
| isolate.rootLibrary.load().then((Library lib) { |
| Field field = lib.variables.singleWhere((v) => v.name == 'fullBlock'); |
| return field.load().then((_) { |
| return field.staticValue.load().then((Instance block) { |
| expect(block.isClosure, isTrue); |
| expect(block.closureContext.isContext, isTrue); |
| expect(block.closureContext.length, equals(1)); |
| return block.closureContext.load().then((Context ctxt) { |
| expect(ctxt.variables.single.value.asValue.isInt, isTrue); |
| expect(ctxt.variables.single.value.asValue.valueAsString, equals('43')); |
| expect(ctxt.parentContext.isContext, isTrue); |
| expect(ctxt.parentContext.length, equals(0)); |
| return ctxt.parentContext.load().then((Context outerCtxt) { |
| expect(outerCtxt.parentContext, isNull); |
| }); |
| }); |
| }); |
| }); |
| }), |
| |
| (Isolate isolate) => |
| isolate.rootLibrary.load().then((Library lib) { |
| Field field = lib.variables.singleWhere((v) => v.name == 'fullBlockWithChain'); |
| return field.load().then((_) { |
| return field.staticValue.load().then((Instance block) { |
| expect(block.isClosure, isTrue); |
| expect(block.closureContext.isContext, isTrue); |
| expect(block.closureContext.length, equals(1)); |
| return block.closureContext.load().then((Context ctxt) { |
| expect(ctxt.variables.single.value.asValue.isInt, isTrue); |
| expect(ctxt.variables.single.value.asValue.valueAsString, |
| equals('4201')); |
| expect(ctxt.parentContext.isContext, isTrue); |
| expect(ctxt.parentContext.length, equals(1)); |
| return ctxt.parentContext.load().then((Context outerCtxt) { |
| expect(outerCtxt.variables.single.value.asValue.isInt, isTrue); |
| expect(outerCtxt.variables.single.value.asValue.valueAsString, |
| equals('421')); |
| expect(outerCtxt.parentContext.isContext, isTrue); |
| expect(outerCtxt.parentContext.length, equals(0)); |
| return outerCtxt.parentContext.load().then((Context outerCtxt2) { |
| expect(outerCtxt2.parentContext, isNull); |
| }); |
| }); |
| }); |
| }); |
| }); |
| }), |
| |
| ]; |
| |
| main(args) => runIsolateTests(args, tests, testeeBefore: script); |