// Copyright (c) 2018, 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:args/args.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/serialization/strategies.dart';
import 'serialization_test_helper.dart';
import '../helpers/args_helper.dart';

main(List<String> args) {
  ArgParser argParser = createArgParser();
  argParser.addFlag('debug', abbr: 'd', defaultsTo: false);
  argParser.addFlag('object', abbr: 'o', defaultsTo: false);
  argParser.addFlag('kinds', abbr: 'k', defaultsTo: false);

  asyncTest(() async {
    ArgResults argResults = argParser.parse(args);
    bool useDataKinds = argResults['kinds'] || argResults['debug'];
    SerializationStrategy strategy =
        new BytesInMemorySerializationStrategy(useDataKinds: useDataKinds);
    if (argResults['object'] || argResults['debug']) {
      strategy =
          new ObjectsInMemorySerializationStrategy(useDataKinds: useDataKinds);
    }

    Uri entryPoint = getEntryPoint(argResults) ??
        Uri.base.resolve('samples-dev/swarm/swarm.dart');
    Uri librariesSpecificationUri = getLibrariesSpec(argResults);
    Uri packageConfig = getPackages(argResults);
    List<String> options = getOptions(argResults);
    await runTest(
        entryPoint: entryPoint,
        packageConfig: packageConfig,
        librariesSpecificationUri: librariesSpecificationUri,
        options: options,
        strategy: strategy,
        useDataKinds: useDataKinds);
  });
}
