// Copyright (c) 2017, 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.md file.

library testing.expectation;

/// An expectation represents the expected outcome of a test (or if it should
/// be skipped).
///
/// An expectation belongs to a group, for example, [ExpectationGroup.Fail].
///
/// Each expectation group has a canonical expectation, defined below. You can
/// use the canonical expectation instead of a more specific one. Note this
/// isn't implemented yet.
class Expectation {
  static const Expectation Pass =
      const Expectation("Pass", ExpectationGroup.Pass);

  static const Expectation Crash =
      const Expectation("Crash", ExpectationGroup.Crash);

  static const Expectation Timeout =
      const Expectation("Timeout", ExpectationGroup.Timeout);

  static const Expectation Fail =
      const Expectation("Fail", ExpectationGroup.Fail);

  static const Expectation Skip =
      const Expectation("Skip", ExpectationGroup.Skip);

  final String name;

  final ExpectationGroup group;

  const Expectation(this.name, this.group);

  /// Returns the canonical expectation representing [group]. That is, one of
  /// the above expectations (except for `Meta` which returns `this`).
  Expectation get canonical => fromGroup(group) ?? this;

  String toString() => name;

  static Expectation fromGroup(ExpectationGroup group) {
    switch (group) {
      case ExpectationGroup.Crash:
        return Expectation.Crash;
      case ExpectationGroup.Fail:
        return Expectation.Fail;
      case ExpectationGroup.Meta:
        return null;
      case ExpectationGroup.Pass:
        return Expectation.Pass;
      case ExpectationGroup.Skip:
        return Expectation.Skip;
      case ExpectationGroup.Timeout:
        return Expectation.Timeout;
    }
    throw "Unhandled group: '$group'.";
  }
}

class ExpectationSet {
  static const ExpectationSet Default =
      const ExpectationSet(const <String, Expectation>{
    "pass": Expectation.Pass,
    "crash": Expectation.Crash,
    "timeout": Expectation.Timeout,
    "fail": Expectation.Fail,
    "skip": Expectation.Skip,
    "missingcompiletimeerror":
        const Expectation("MissingCompileTimeError", ExpectationGroup.Fail),
    "missingruntimeerror":
        const Expectation("MissingRuntimeError", ExpectationGroup.Fail),
    "runtimeerror": const Expectation("RuntimeError", ExpectationGroup.Fail),
  });

  final Map<String, Expectation> internalMap;

  const ExpectationSet(this.internalMap);

  Expectation operator [](String name) {
    return internalMap[name.toLowerCase()] ??
        (throw "No expectation named: '$name'.");
  }

  factory ExpectationSet.fromJsonList(List data) {
    Map<String, Expectation> internalMap =
        new Map<String, Expectation>.from(Default.internalMap);
    for (Map map in data) {
      String name;
      String group;
      map.forEach((_key, _value) {
        String key = _key;
        String value = _value;
        switch (key) {
          case "name":
            name = value;
            break;

          case "group":
            group = value;
            break;

          default:
            throw "Unrecoginized key: '$key' in '$map'.";
        }
      });
      if (name == null) {
        throw "No name provided in '$map'";
      }
      if (group == null) {
        throw "No group provided in '$map'";
      }
      Expectation expectation = new Expectation(name, groupFromString(group));
      name = name.toLowerCase();
      if (internalMap.containsKey(name)) {
        throw "Duplicated expectation name: '$name'.";
      }
      internalMap[name] = expectation;
    }
    return new ExpectationSet(internalMap);
  }
}

enum ExpectationGroup {
  Crash,
  Fail,
  Meta,
  Pass,
  Skip,
  Timeout,
}

ExpectationGroup groupFromString(String name) {
  switch (name) {
    case "Crash":
      return ExpectationGroup.Crash;
    case "Fail":
      return ExpectationGroup.Fail;
    case "Meta":
      return ExpectationGroup.Meta;
    case "Pass":
      return ExpectationGroup.Pass;
    case "Skip":
      return ExpectationGroup.Skip;
    case "Timeout":
      return ExpectationGroup.Timeout;
    default:
      throw "Unrecognized group: '$name'.";
  }
}
