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

  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);
}
