// Copyright (c) 2011, 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 StatusExpressionTest;

import "package:expect/expect.dart";
import "../../tools/testing/dart/status_expression.dart";

main() {
  testExpression();
  testSyntaxError();
  testBoolean();
  testNotEqual();
}

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 = <String, dynamic>{"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) && (bool $checked)) || ($mode == release))",
      expression.toString());

  // Test BooleanExpression.evaluate().
  var environment = <String, dynamic>{
    "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 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 = <String, dynamic>{
    "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));
}
