// Copyright (c) 2013, 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.

// Test of the graph segmentation algorithm used by deferred loading
// to determine which elements can be deferred and which libraries
// much be included in the initial download (loaded eagerly).

import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart';
import 'package:expect/expect.dart';
import '../memory_compiler.dart';

void main() {
  asyncTest(() async {
    print('--test from kernel------------------------------------------------');
    await runTest();
  });
}

runTest() async {
  CompilationResult result =
      await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
  Compiler compiler = result.compiler;
  var closedWorld = compiler.backendClosedWorldForTesting;
  var outputUnitForMember = compiler.backend.outputUnitData.outputUnitForMember;
  var outputUnitForClass = compiler.backend.outputUnitData.outputUnitForClass;
  var mainOutputUnit = compiler.backend.outputUnitData.mainOutputUnit;
  var elementEnvironment = closedWorld.elementEnvironment;
  dynamic lib = elementEnvironment.lookupLibrary(Uri.parse("memory:lib.dart"));
  var customType = elementEnvironment.lookupClass(lib, "CustomType");
  var foo = elementEnvironment.lookupLibraryMember(lib, "foo");
  Expect.notEquals(mainOutputUnit, outputUnitForMember(foo));
  // Native elements are not deferred
  Expect.equals(mainOutputUnit, outputUnitForClass(customType));
}

// The main library imports a file defining a custom element.
// Registering this class implicitly causes the constructors to be
// live. Check that this is handled.
const Map<String, String> MEMORY_SOURCE_FILES = const {
  "main.dart": """
import "lib.dart" deferred as a;
import 'dart:html';

main() {
  document.registerElement("foo-tag", a.a);
  a.foo();
}
""",
  "lib.dart": """
import 'dart:html';
var a = CustomType;

class CustomType extends HtmlElement {
  factory CustomType() => null;
  CustomType.created() : super.created() ;
}

foo() {}
""",
};
