/*
 * Copyright (c) 2019, 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.
 */
/**
 * @assertion an extension declaration is a top-level declaration with a grammar
 * similar to:
 * <extension> ::=
 *   `extension' <identifier>? <typeParameters>? `on' <type> `?'? `{'
 *     memberDeclaration*
 *   `}'
 * ...
 * The member declarations can be any non-abstract static or instance member
 * declaration except for instance variables and constructors, and they cannot
 * have the same name as a member declared by Object (==, hashCode , toString,
 * runtimeType or noSuchMethod)
 *
 * @description Check that the member declarations can be any non-abstract
 * static or instance member
 * @author sgrekhov@unipro.ru
 */

import "../../Utils/expect.dart";

extension ExtendedList<T> on List<T> {
  int get getter => this.length * 2;
  List<T> operator -() => this.reversed.toList();
  List<List<T>> split(int at) => <List<T>>[this.sublist(0, at), this.sublist(at)];
  void set setter(int v) {this.length = v;}

  static String get staticGetter => "List";
  static void set staticSetter(String v) {staticVar = v;}
  static String staticMethod(String s) => s;
  static String staticVar = "Run, Forrest, run";
  static const staticConst = "Nothing is constant, everything is changing";
}

main() {
  List<String> list = ["Lily", "was", "here"];

  Expect.equals(6, list.getter);
  Expect.listEquals([["Lily"], ["was", "here"]], list.split(1));
  Expect.listEquals(["here", "was", "Lily"], -list);
  Expect.listEquals([["was", "here"], ["Lily"]], -list.split(1));
  list.setter = 2;
  Expect.equals(2, list.length);

  Expect.equals("List", ExtendedList.staticGetter);
  Expect.equals("Lily was here", ExtendedList.staticMethod("Lily was here"));
  Expect.equals("Run, Forrest, run", ExtendedList.staticVar);
  ExtendedList.staticSetter = "Lily was here";
  Expect.equals("Lily was here", ExtendedList.staticVar);
  Expect.equals("Nothing is constant, everything is changing", ExtendedList.staticConst);
}
