// Copyright (c) 2020, 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 'fasta.dart' as fasta;

const List<String> standardSuites = <String>[
  'weak',
  'outline',
  'strong',
  'text_serialization',
  'textual_outline',
];

const List<String> specialSuites = <String>[
  'expression',
  'incremental',
];

Future<void> runStandardSuites([List<String>? args]) async {
  // Assert that 'strong' is the first suite - we use the assumption below.
  assert(standardSuites.first == 'weak', "Suite 'weak' most be the first.");
  bool first = true;
  for (String suite in standardSuites) {
    List<String> tests = args == null
        ? [suite]
        : args.map((String arg) => '${suite}/$arg').toList();
    await fasta.main([
      'testing',
      ...tests,
      // Only update comments in the first suite. Note that this only works
      // if the first compilation is a full compilation, i.e. not outline,
      // because comments are generated during body building and inference.
      if (first) '-DupdateComments=true',
      '-DupdateExpectations=true'
    ]);
    first = false;
  }
}

Future<void> main(List<String> args) async {
  if (args.isEmpty) {
    await runStandardSuites();
    for (String suite in specialSuites) {
      await fasta.main(['testing', suite, '-DupdateExpectations=true']);
    }
  } else {
    List<String> standardTests = <String>[];
    for (String arg in args) {
      bool isSpecial = false;
      for (String suite in specialSuites) {
        if (arg.startsWith('$suite/')) {
          await fasta.main(['testing', arg, '-DupdateExpectations=true']);
          isSpecial = true;
          break;
        }
      }
      if (!isSpecial) {
        standardTests.add(arg);
      }
    }
    if (standardTests.isNotEmpty) {
      await runStandardSuites(args);
    }
  }
}
