// 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";


class StatusExpressionTest {
  static void testMain() {
    test1();
    test2();
    test3();
    test4();
    test5();
    test6();
  }

  static void test1() {
    Tokenizer tokenizer = new Tokenizer(
        r" $mode == debug && ($arch == chromium || $arch == dartc) ");
    tokenizer.tokenize();
    Expect.listEquals(tokenizer.tokens,
        ["\$", "mode", "==", "debug", "&&", "(", "\$", "arch", "==",
         "chromium", "||", "\$", "arch", "==", "dartc", ")"]);
    ExpressionParser parser =
        new ExpressionParser(new Scanner(tokenizer.tokens));
    BooleanExpression ast = parser.parseBooleanExpression();
    Expect.equals(
        r"(($mode == debug) && (($arch == chromium) || ($arch == dartc)))",
        ast.toString());
    // Test BooleanExpression.evaluate().
    Map environment = new Map();
    environment["arch"] = "dartc";
    environment["mode"] = "debug";
    Expect.isTrue(ast.evaluate(environment));
    environment["mode"] = "release";
    Expect.isFalse(ast.evaluate(environment));
    environment["arch"] = "ia32";
    Expect.isFalse(ast.evaluate(environment));
    environment["mode"] = "debug";
    Expect.isFalse(ast.evaluate(environment));
    environment["arch"] = "chromium";
    Expect.isTrue(ast.evaluate(environment));
  }

  static void test2() {
    Tokenizer tokenizer = new Tokenizer(
        r"($arch == dartc || $arch == chromium) && $mode == release");
    tokenizer.tokenize();
    Expect.listEquals(
        tokenizer.tokens,
        ["(", "\$", "arch", "==", "dartc", "||", "\$", "arch", "==",
        "chromium", ")", "&&", "\$", "mode", "==", "release"]);
  }

  static void test3() {
    var thrown;
    String input = r" $mode == debug && ($arch==chromium || *$arch == dartc)";
    Tokenizer tokenizer = new Tokenizer(input);
    try {
      tokenizer.tokenize();
    } on Exception catch (e) {
      thrown = e;
    }
    Expect.equals("FormatException: Syntax error in '$input'",
                  thrown.toString());
  }

  static void test4() {
    var thrown;
    String input =
        r"($arch == (-dartc || $arch == chromium) && $mode == release";
    Tokenizer tokenizer = new Tokenizer(input);
    try {
      tokenizer.tokenize();
    } on Exception catch (e) {
      thrown = e;
    }
    Expect.equals("FormatException: Syntax error in '$input'",
                  thrown.toString());
  }

  static void test5() {
    Tokenizer tokenizer = new Tokenizer(
        r"Skip , Pass if $arch == dartc, Fail || Timeout if "
        r"$arch == chromium && $mode == release");
    tokenizer.tokenize();
    ExpressionParser parser =
        new ExpressionParser(new Scanner(tokenizer.tokens));
    SetExpression ast = parser.parseSetExpression();
    Expect.equals(
        r"((skip || (pass if ($arch == dartc))) || ((fail || timeout) "
        r"if (($arch == chromium) && ($mode == release))))",
        ast.toString());

    // Test SetExpression.evaluate().
    Map environment = new Map();
    environment["arch"] = "ia32";
    environment["checked"] = true;
    environment["mode"] = "debug";
    Set<String> result = ast.evaluate(environment);
    Expect.setEquals(["skip"], result);

    environment["arch"] = "dartc";
    result = ast.evaluate(environment);
    Expect.setEquals(["skip", "pass"], result);

    environment["arch"] = "chromium";
    result = ast.evaluate(environment);
    Expect.setEquals(["skip"], result);

    environment["mode"] = "release";
    result = ast.evaluate(environment);
    Expect.setEquals(["skip", "fail", "timeout"], result);
  }

  static void test6() {
    Tokenizer tokenizer = new Tokenizer(
      r"  $arch == ia32 && $checked || $mode == release    ");
    tokenizer.tokenize();
    ExpressionParser parser =
        new ExpressionParser(new Scanner(tokenizer.tokens));
    BooleanExpression ast = parser.parseBooleanExpression();
    Expect.equals(
        r"((($arch == ia32) && (bool $checked)) || ($mode == release))",
        ast.toString());

    // Test BooleanExpression.evaluate().
    Map environment = new Map();
    environment["arch"] = "ia32";
    environment["checked"] = true;
    environment["mode"] = "debug";
    Expect.isTrue(ast.evaluate(environment));
    environment["mode"] = "release";
    Expect.isTrue(ast.evaluate(environment));
    environment["checked"] = false;
    Expect.isTrue(ast.evaluate(environment));
    environment["mode"] = "debug";
    Expect.isFalse(ast.evaluate(environment));
    environment["arch"] = "arm";
    Expect.isFalse(ast.evaluate(environment));
    environment["checked"] = true;
    Expect.isFalse(ast.evaluate(environment));
  }
}

main() {
  StatusExpressionTest.testMain();
}
