// 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 implements = 0;
    var import = 0;
    var library = 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 0;  /// 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);
}
