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

import 'dart:io' show File, Platform;

import 'package:kernel/target/targets.dart' show NoneTarget, TargetFlags;

import 'binary_md_dill_reader.dart' show BinaryMdDillReader;

import 'incremental_suite.dart' show getOptions, normalCompileToBytes;

import 'utils/io_utils.dart' show computeRepoDir;

void main() async {
  await testDart2jsCompile();
}

Future<void> testDart2jsCompile() async {
  final Uri dart2jsUrl = Uri.base.resolve("pkg/compiler/bin/dart2js.dart");
  Stopwatch stopwatch = new Stopwatch()..start();
  List<int> bytes = await normalCompileToBytes(dart2jsUrl,
      options: getOptions(target: new NoneTarget(new TargetFlags())));
  print("Compiled dart2js in ${stopwatch.elapsedMilliseconds} ms");

  stopwatch.reset();
  File binaryMd = new File("$repoDir/pkg/kernel/binary.md");
  String binaryMdContent = binaryMd.readAsStringSync();
  print("Read binary.md in ${stopwatch.elapsedMilliseconds} ms");

  stopwatch.reset();
  BinaryMdDillReader binaryMdDillReader =
      new BinaryMdDillReader(binaryMdContent, bytes);
  binaryMdDillReader.attemptRead();
  print("Parsed dart2js compiled bytes via binary.md "
      "in ${stopwatch.elapsedMilliseconds} ms");
}

final String repoDir = computeRepoDir();

String get dartVm => Platform.executable;
