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

library kernel.batch_util;

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

enum CompilerOutcome { Ok, Fail }

typedef BatchCallback = Future<CompilerOutcome> Function(
  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');
    }
  }
}
