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

import "package:expect/expect.dart";

import "package:status_file/environment.dart";
import "package:status_file/src/expression.dart";

class TestEnvironment implements Environment {
  final Map<String, String> _values;

  TestEnvironment(this._values);

  void validate(String name, String value, List<String> errors) {
    throw new UnimplementedError();
  }

  /// Looks up the value of the variable with [name].
  String? lookUp(String name) => _values[name];

  operator []=(String key, String value) => _values[key] = value;
}

main() {
  testExpression();
  testSyntaxError();
  testBoolean();
  testNotBoolean();
  testNotEqual();
  testNormalize();
  testCompareTo();
}

void testExpression() {
  var expression = Expression.parse(
      r" $mode == debug && ($arch == chromium || $arch == dartc) ");
  Expect.equals(r"$mode == debug && ($arch == chromium || $arch == dartc)",
      expression.toString());

  // Test BooleanExpression.evaluate().
  var environment = new TestEnvironment({"arch": "dartc", "mode": "debug"});

  Expect.isTrue(expression.evaluate(environment));
  environment["mode"] = "release";
  Expect.isFalse(expression.evaluate(environment));
  environment["arch"] = "ia32";
  Expect.isFalse(expression.evaluate(environment));
  environment["mode"] = "debug";
  Expect.isFalse(expression.evaluate(environment));
  environment["arch"] = "chromium";
  Expect.isTrue(expression.evaluate(environment));
}

void testSyntaxError() {
  var input = r"($arch == (-dartc || $arch == chromium) && $mode == release";
  Expect.throws(() {
    Expression.parse(input);
  }, (e) => e.toString() == "FormatException: Syntax error in '$input'");
}

void testBoolean() {
  var expression =
      Expression.parse(r"  $arch == ia32 && $checked || $mode == release    ");
  Expect.equals(
      r"$arch == ia32 && $checked || $mode == release", expression.toString());

  // Test BooleanExpression.evaluate().
  var environment =
      new TestEnvironment({"arch": "ia32", "checked": "true", "mode": "debug"});

  Expect.isTrue(expression.evaluate(environment));
  environment["mode"] = "release";
  Expect.isTrue(expression.evaluate(environment));
  environment["checked"] = "false";
  Expect.isTrue(expression.evaluate(environment));
  environment["mode"] = "debug";
  Expect.isFalse(expression.evaluate(environment));
  environment["arch"] = "arm";
  Expect.isFalse(expression.evaluate(environment));
  environment["checked"] = "true";
  Expect.isFalse(expression.evaluate(environment));
}

void testNotBoolean() {
  var expression =
      Expression.parse(r"  $arch == ia32 && ! $checked || $mode == release ");
  Expect.equals(
      r"$arch == ia32 && !$checked || $mode == release", expression.toString());

  var environment = new TestEnvironment(
      {"arch": "ia32", "checked": "false", "mode": "debug"});

  Expect.isTrue(expression.evaluate(environment));
  environment["mode"] = "release";
  Expect.isTrue(expression.evaluate(environment));
  environment["checked"] = "true";
  Expect.isTrue(expression.evaluate(environment));
  environment["mode"] = "debug";
  Expect.isFalse(expression.evaluate(environment));
  environment["arch"] = "arm";
  Expect.isFalse(expression.evaluate(environment));
  environment["checked"] = "false";
  Expect.isFalse(expression.evaluate(environment));
}

void testNotEqual() {
  // Test the != operator.
  var expression = Expression.parse(r"$compiler == dart2js && $runtime != ie9");
  Expect.equals(
      r"$compiler == dart2js && $runtime != ie9", expression.toString());

  // Test BooleanExpression.evaluate().
  var environment = new TestEnvironment({
    "compiler": "none",
    "runtime": "ie9",
  });

  Expect.isFalse(expression.evaluate(environment));
  environment["runtime"] = "chrome";
  Expect.isFalse(expression.evaluate(environment));

  environment["compiler"] = "dart2js";
  environment["runtime"] = "ie9";
  Expect.isFalse(expression.evaluate(environment));
  environment["runtime"] = "chrome";
  Expect.isTrue(expression.evaluate(environment));
}

void testNormalize() {
  shouldNormalizeTo(String input, String expected) {
    var expression = Expression.parse(input);
    Expect.equals(expected, expression.normalize().toString());
  }

  // Comparison.
  shouldNormalizeTo(r"$foo == bar", r"$foo == bar");
  shouldNormalizeTo(r"$foo != bar", r"$foo != bar");

  // Simplify Boolean comparisons.
  shouldNormalizeTo(r"$foo == true", r"$foo");
  shouldNormalizeTo(r"$foo == false", r"!$foo");
  shouldNormalizeTo(r"$foo != true", r"!$foo");
  shouldNormalizeTo(r"$foo != false", r"$foo");

  // Variable.
  shouldNormalizeTo(r"$foo", r"$foo");
  shouldNormalizeTo(r"!$foo", r"!$foo");

  // Logic.
  shouldNormalizeTo(r"$a || $b", r"$a || $b");
  shouldNormalizeTo(r"$a && $b", r"$a && $b");

  // Collapse identical clauses.
  shouldNormalizeTo(r"$a && $a", r"$a");
  shouldNormalizeTo(r"$a && !$a", r"$a && !$a");
  shouldNormalizeTo(r"$a == b && $a == b", r"$a == b");
  shouldNormalizeTo(r"$a == b && $a != b", r"$a == b && $a != b");
  shouldNormalizeTo(r"$a && $b || $b && $a", r"$a && $b");

  // Order logic clauses.
  shouldNormalizeTo(
      r"$b || ! $b || $b == b || $b && $d || $a || ! $a || $a == a || $a && $c",
      r"$a == a || $b == b || $a || !$a || $b || !$b || $a && $c || $b && $d");

  // Recursively normalize.
  shouldNormalizeTo(r"$c == true || $b && $a", r"$c || $a && $b");
}

void testCompareTo() {
  shouldCompare(String a, String b, int comparison) {
    var expressionA = Expression.parse(a);
    var expressionB = Expression.parse(b);
    Expect.equals(comparison, expressionA.compareTo(expressionB));
    Expect.equals(-comparison, expressionB.compareTo(expressionA));
  }

  shouldCompareEqual(String a, String b) {
    shouldCompare(a, b, 0);
  }

  shouldCompareLess(String a, String b) {
    shouldCompare(a, b, -1);
  }

  // Same.
  shouldCompareEqual(r"$a", r"$a");
  shouldCompareEqual(r"! $a", r"! $a");

  // Order comparisons before variables.
  shouldCompareLess(r"$b == c", r"$a");

  // Order variable clauses by name then negation.
  shouldCompareLess(r"$a", r"$b");
  shouldCompareLess(r"$a", r"!$b");
  shouldCompareLess(r"$a", r"!$a");

  // Order comparisons by variable then value then negation.
  shouldCompareLess(r"$a == x", r"$b != w");
  shouldCompareLess(r"$a == w", r"$a != x");
  shouldCompareLess(r"$a == x", r"$a != x");

  // Order variables before logic.
  shouldCompareLess(r"$b", r"$a && $b");

  // Order comparisons before logic.
  shouldCompareLess(r"$b == c", r"$a && $b");

  // Order && before ||.
  shouldCompareLess(r"$a && $b", r"$a || $b");

  // Order logic by their clauses from left to right.
  shouldCompareLess(r"$b && $a", r"$c && $d");
}
