// Copyright (c) 2012, 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.
// Check that we can use pseudo keywords as names in function level code.

import "package:expect/expect.dart";


class PseudoKWTest {
  static testMain() {

    // This is a list of built-in identifiers from the Dart spec.
    // It sanity checks that these pseudo-keywords are legal identifiers.

    var abstract = 0;
    var as = 0;
    var call = 0;
    var dynamic = 0;
    var factory = 0;
    var get = 0;
    var implements = 0;
    var import = 0;
    var interface = 0;
    var library = 0;
    var negate = 0;
    var operator = 0;
    var set = 0;
    var source = 0;
    var static = 0;
    var typedef = 0;

    // "native" is a per-implementation extension that is not a part of the
    // Dart language.  While it is not an official built-in identifier, it
    // is useful to ensure that it remains a legal identifier.
    var native = 0;


    // The code below adds a few additional variants of usage without any
    // attempt at complete coverage.
    {
      void factory(set) {
        return 0;
      }
    }

    get: while (import > 0) {
      break get;
    }

    return static + library * operator;
  }
}

typedef(x) => "typedef $x";

static(abstract) {
  return abstract == true;
}

class A {
  var typedef = 0;
  final operator = "smooth";

  set(x) { typedef = x; }
  get() => typedef - 5;

  static static() {
    return 1;
  }
  static check() {
    var o = new A();
    o.set(55);
    Expect.equals(50, o.get());
    static();
  }
}

class B {
  var set = 100;
  get get => set;
  set get(get) => set = 2 * get.get;

  static() {
    var set = new B();
    set.get = set;
    Expect.equals(200, set.get);
  }
  int operator() {
    return 1;
  }
}

class C {
  static int operator = (5);
  static var get;
  static get set => 111;
  static set set(set) { }
}


main() {
  PseudoKWTest.testMain();
  A.check();
  new B().static();
  Expect.equals(1, new B().operator());
  Expect.equals(1, A.static());
  typedef("T");
  Expect.equals("typedef T", typedef("T"));
  static("true");
  Expect.equals(false, static("true"));
  Expect.equals(5, C.operator);
  Expect.equals(null, C.get);
  C.set = 0;
  Expect.equals(111, C.set);
}
