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

/**
 * A simple unit test library for running tests on the VM.
 */
library unittest_vm_config;

import 'dart:async';
import 'dart:io';
import 'unittest.dart';

class VMConfiguration extends SimpleConfiguration {
  // Color constants used for generating messages.
  final String GREEN_COLOR = '\u001b[32m';
  final String RED_COLOR = '\u001b[31m';
  final String MAGENTA_COLOR = '\u001b[35m';
  final String NO_COLOR = '\u001b[0m';

  // We make this public so the user can turn it off if they want.
  bool useColor;

  VMConfiguration() :
    super(), useColor = stdioType(stdout) == StdioType.TERMINAL;

  String formatResult(TestCase testCase) {
    String result = super.formatResult(testCase);
    if (useColor) {
      if (testCase.result == PASS) {
        return "${GREEN_COLOR}${result}${NO_COLOR}";
      } else if (testCase.result == FAIL) {
        return "${RED_COLOR}${result}${NO_COLOR}";
      } else if (testCase.result == ERROR) {
        return "${MAGENTA_COLOR}${result}${NO_COLOR}";
      }
    }
    return result;
  }

  void onInit() {
    super.onInit();
    filterStacks = formatStacks = true;
  }

  void onDone(bool success) {
    int status;
    try {
      super.onDone(success);
      status = 0;
    } catch (ex) {
      // A non-zero exit code is used by the test infrastructure to detect
      // failure.
      status = 1;
    }
    Future.wait([stdout.close(), stderr.close()]).then((_) {
      exit(status);
    });
  }
}

void useVMConfiguration() {
  unittestConfiguration = _singleton;
}

final _singleton = new VMConfiguration();
