// Copyright (c) 2016, 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:async_helper/async_helper.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:expect/expect.dart';
import '../helpers/memory_compiler.dart';

main() {
  asyncTest(() async {
    print('--test from kernel------------------------------------------------');
    await test([]);
  });
}

test(List<String> options) async {
  DiagnosticCollector collector = new DiagnosticCollector();
  String fileName = 'sdk/tests/compiler/dart2js_native/main.dart';
  Uri entryPoint = Uri.parse('memory:$fileName');
  await runCompiler(
      entryPoint: entryPoint,
      memorySourceFiles: {
        fileName: '''
        import 'dart:html';
        import 'dart:_js_helper';
        
        method(o) native;
        
        main() {
          method(document);
        }
        '''
      },
      diagnosticHandler: collector,
      options: [Flags.verbose]..addAll(options));
  int allNativeUsedCount =
      collector.verboseInfos.where((CollectedMessage message) {
    return message.text.startsWith('All native types marked as used due to ');
  }).length;
  Expect.equals(
      1, allNativeUsedCount, "Unexpected message count: $allNativeUsedCount");
}
