// 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; //# 01: ok
    var as = 0;
    var dynamic = 0;
    var export = 0;
    var external = 0; //# 01: ok
    var factory = 0;
    var get = 0;
    var interface = 0;
    var implements = 0;
    var import = 0;
    var library = 0;
    var mixin = 0;
    var operator = 0;
    var part = 0;
    var set = 0;
    var static = 0; //# 01: ok
    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; //# 01: ok
      }
    }

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

    return
        static + //# 01: ok
        library * operator;
  }
}

typedef(x) => "typedef $x"; //# 01: ok

static(abstract) { //# 01: ok
  return abstract == true; //# 01: ok
} //# 01: ok

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

  set(x) {
    typedef = x;
  }

  get() => typedef - 5;

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

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

  static() { //# 01: ok
    var set = new B(); //# 01: ok
    set.get = set; //# 01: ok
    Expect.equals(200, set.get); //# 01: ok
  } //# 01: ok
  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(); //# 01: ok
  Expect.equals(1, new B().operator());
  Expect.equals(1, A.static()); //# 01: ok
  typedef("T"); //# 01: ok
  Expect.equals("typedef T", typedef("T")); //# 01: ok
  static("true"); //# 01: ok
  Expect.equals(false, static("true")); //# 01: ok
  Expect.equals(5, C.operator);
  Expect.equals(null, C.get);
  C.set = 0;
  Expect.equals(111, C.set);
}
