// 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.

// @dart = 2.9

library kernel.batch_util;

import 'dart:convert';
import 'dart:io';

enum CompilerOutcome {
  Ok,
  Fail,
}

typedef Future<CompilerOutcome> BatchCallback(List<String> arguments);

/// Runs the given [callback] in the batch mode for use by the test framework in
/// `dart-lang/sdk`.
///
/// The [callback] should behave as a main method, except it should return a
/// [CompilerOutcome] for reporting its outcome to the testing framework.
Future runBatch(BatchCallback callback) async {
  int totalTests = 0;
  int testsFailed = 0;
  Stopwatch watch = new Stopwatch()..start();
  print('>>> BATCH START');
  Stream input = stdin.transform(utf8.decoder).transform(new LineSplitter());
  await for (String line in input) {
    if (line.isEmpty) {
      int time = watch.elapsedMilliseconds;
      print('>>> BATCH END '
          '(${totalTests - testsFailed})/$totalTests ${time}ms');
      break;
    }
    ++totalTests;
    List<String> arguments = line.split(new RegExp(r'\s+'));
    try {
      CompilerOutcome outcome = await callback(arguments);
      stderr.writeln('>>> EOF STDERR');
      if (outcome == CompilerOutcome.Ok) {
        print('>>> TEST PASS ${watch.elapsedMilliseconds}ms');
      } else {
        print('>>> TEST FAIL ${watch.elapsedMilliseconds}ms');
      }
    } catch (e, stackTrace) {
      stderr.writeln(e);
      stderr.writeln(stackTrace);
      stderr.writeln('>>> EOF STDERR');
      print('>>> TEST CRASH');
    }
  }
}
