// Copyright (c) 2011, 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 final List positionalArguments
/// An unmodifiable view of the positional arguments of the call.
/// If the member is a getter, the positional arguments is empty.
/// @description Checks that positionalArguments is unmodifiable and returns
/// expected results on getters, setters and instance methods invocations.
/// @author ilya
/// @issue 13714

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

List? expect;

class D {
  method(x, y, z) {}
  get getOnly {}
  set setOnly (x) {}
  noSuchMethod(Invocation i) {
    Expect.throws(() => i.positionalArguments.clear());
    Expect.listEquals(expect, i.positionalArguments);
  }
}

@proxy
class C extends D {
  noSuchMethod(Invocation i) {
    Expect.throws(() => i.positionalArguments.clear());
    Expect.listEquals(expect, i.positionalArguments);
  }
  var d;
  C() : d = new D();
}

test(dynamic x) {
  var y = new C();
  expect = [y]; x + y;
  expect = []; -x;
  expect = []; x.foo;
  expect = [1]; x.bar = 1;
  expect = []; x.setOnly;
  expect = [2]; x.getOnly = 2;
  expect = [3, 'baz']; x.foo(3, 'baz');
  expect = [4, 'baz']; x.method(4, 'baz');
  expect = [5, 'baz']; x.d(5, 'baz');
}

main() {
  test(new C());
}
