// Copyright (c) 2015, 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. // @dart = 2.7 import 'dart:convert'; import 'package:expect/expect.dart'; import 'package:async_helper/async_helper.dart'; import 'package:compiler/compiler_new.dart'; import '../helpers/memory_compiler.dart'; void testLoadMap() async { var collector = new OutputCollector(); await runCompiler( memorySourceFiles: MEMORY_SOURCE_FILES, options: ['--deferred-map=deferred_map.json'], outputProvider: collector); // Ensure a mapping file is output. var deferredMap = collector.getOutput("deferred_map.json", OutputType.deferredMap); Expect.isNotNull(deferredMap); var mapping = jsonDecode(deferredMap); // Test structure of mapping. Expect.equals("", mapping["main.dart"]["name"]); Expect.equals(2, mapping["main.dart"]["imports"]["lib1"].length); Expect.equals(2, mapping["main.dart"]["imports"]["lib2"].length); Expect.equals(1, mapping["main.dart"]["imports"]["convert"].length); Expect.equals("lib1", mapping["memory:lib1.dart"]["name"]); Expect.equals(1, mapping["memory:lib1.dart"]["imports"]["lib4_1"].length); Expect.equals(1, mapping["memory:lib2.dart"]["imports"]["lib4_2"].length); } void testDumpDeferredGraph() async { var collector = new OutputCollector(); await runCompiler( memorySourceFiles: MEMORY_SOURCE_FILES, options: ['--dump-deferred-graph=deferred_graph.txt'], outputProvider: collector); var actual = collector.getOutput("deferred_graph.txt", OutputType.debug).split('\n'); // This program has 5 deferred imports `convert`, `lib1`, `lib2`, `lib4_1`, // and `lib4_2`. Most are independent of one another, except for `lib1` // and `lib2`, that happen to both use common code (foo3 in lib3). As a // result we expect to have an 6 output files: // * one for code that is only use by an individual deferred import, and // * an extra one for the intersection of lib1 and lib2. var expected = ['10000', '01000', '00100', '00010', '00001', '00110']; expected.sort(); actual.sort(); Expect.listEquals(expected, actual); } void main() { asyncTest(() async { testLoadMap(); testDumpDeferredGraph(); }); } const Map MEMORY_SOURCE_FILES = const { "main.dart": """ import 'dart:convert' deferred as convert; import 'lib1.dart' deferred as lib1; import 'lib2.dart' deferred as lib2; void main() { lib1.loadLibrary().then((_) { lib1.foo1(); new lib1.C(); lib2.loadLibrary().then((_) { lib2.foo2(); }); }); convert.loadLibrary().then((_) { new convert.JsonCodec(); }); } """, "lib1.dart": """ library lib1; import "dart:async"; import "dart:html"; import "lib3.dart" as l3; import "lib4.dart" deferred as lib4_1; class C {} foo1() { new InputElement(); lib4_1.loadLibrary().then((_) { lib4_1.bar1(); }); return () {return 1 + l3.foo3();} (); } """, "lib2.dart": """ library lib2; import "dart:async"; import "lib3.dart" as l3; import "lib4.dart" deferred as lib4_2; foo2() { lib4_2.loadLibrary().then((_) { lib4_2.bar2(); }); return () {return 2+l3.foo3();} (); } """, "lib3.dart": """ library lib3; foo3() { return () {return 3;} (); } """, "lib4.dart": """ library lib4; bar1() { return "hello"; } bar2() { return 2; } """, };