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