[ Service ] Add VM service testing for super-parameters language feature

Fixes https://github.com/dart-lang/sdk/issues/48076

TEST=super_constructor_invocation_test.dart

Change-Id: Ia823c228836e4f8fca06e8211f93849115eb6845
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/233343
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Siva Annamalai <asiva@google.com>
Commit-Queue: Ben Konyi <bkonyi@google.com>
diff --git a/pkg/vm_service/test/super_constructor_invocation_test.dart b/pkg/vm_service/test/super_constructor_invocation_test.dart
new file mode 100644
index 0000000..7a0d300
--- /dev/null
+++ b/pkg/vm_service/test/super_constructor_invocation_test.dart
@@ -0,0 +1,183 @@
+// Copyright (c) 2022, 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.
+//
+// SharedOptions=--enable-experiment=super-parameters
+
+// ignore_for_file: experiment_not_enabled
+// @dart=2.17
+
+import 'dart:developer';
+
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+import 'common/service_test_common.dart';
+import 'common/test_helper.dart';
+
+class S<T> {
+  num? n;
+  T? t;
+  String constrName;
+  S({this.n, this.t}) : constrName = "S";
+  S.named({this.t, this.n}) : constrName = "S.named";
+}
+
+class C<T> extends S<T> {
+  C.constr1(String s, {super.t});
+  C.constr2(int i, String s, {super.n}) : super();
+  C.constr3(int i, String s, {super.n, super.t}) : super.named() {
+    debugger();
+  }
+}
+
+class R<T> {
+  final f1;
+  var v1;
+  num i1;
+  T t1;
+  R(this.f1, this.v1, this.i1, this.t1);
+}
+
+class B<T> extends R<T> {
+  // ignore: no_default_super_constructor
+  B(super.f1, super.v1, super.i1, super.t1) {
+    debugger();
+  }
+}
+
+void testMain() {
+  debugger();
+  C.constr3(1, 'abc', n: 3.14, t: 42);
+  B('a', 3.14, 2.718, 42);
+}
+
+late final String isolateId;
+late final String rootLibId;
+
+createInstance(VmService service, String expr) async {
+  return await service.evaluate(
+      isolateId,
+      rootLibId,
+      expr,
+      disableBreakpoints: true,
+    );
+}
+
+evaluateGetter(VmService service, String instanceId, String getter) async {
+  dynamic result = await service.evaluate(isolateId, instanceId, getter);
+  return await service.getObject(isolateId, result.id);
+}
+
+final tests = <IsolateTest>[
+  (VmService service, IsolateRef isolateRef) async {
+    // Initialization
+    isolateId = isolateRef.id!;
+    final isolate = await service.getIsolate(isolateId);
+    rootLibId = isolate.rootLib!.id!;
+  },
+  (VmService service, _) async {
+    dynamic instance = await createInstance(service, 'C.constr1("abc", t: 42)');
+    dynamic result = await evaluateGetter(service, instance.id, 'n');
+    expect(result.valueAsString, 'null');
+    result = await evaluateGetter(service, instance.id, 't');
+    expect(result.valueAsString, '42');
+    result = await evaluateGetter(service, instance.id, 'constrName');
+    expect(result.valueAsString, 'S');
+    result = await service.evaluate(isolateId, instance.id, 'T');
+    expect(result.json['name'], 'int');
+
+    instance = await createInstance(service, 'C.constr1("abc", t: "42")');
+    result = await evaluateGetter(service, instance.id, 'n');
+    expect(result.valueAsString, 'null');
+    result = await evaluateGetter(service, instance.id, 't');
+    expect(result.valueAsString, '42');
+    result = await evaluateGetter(service, instance.id, 'constrName');
+    expect(result.valueAsString, 'S');
+    result = await service.evaluate(isolateId, instance.id, 'T');
+    expect(result.json['name'], 'String');
+  },
+  (VmService service, _) async {
+    dynamic instance = await createInstance(service, 'C.constr2(1, "abc", n: 3.14)');
+    dynamic result = await evaluateGetter(service, instance.id, 'n');
+    expect(result.valueAsString, '3.14');
+    result = await evaluateGetter(service, instance.id, 't');
+    expect(result.valueAsString, 'null');
+    result = await evaluateGetter(service, instance.id, 'constrName');
+    expect(result.valueAsString, 'S');
+    result = await service.evaluate(isolateId, instance.id, 'T');
+    expect(result.json['name'], 'dynamic');
+
+    instance = await createInstance(service, 'C.constr2(1, "abc", n: 2)');
+    result = await evaluateGetter(service, instance.id, 'n');
+    expect(result.valueAsString, '2');
+    result = await evaluateGetter(service, instance.id, 't');
+    expect(result.valueAsString, 'null');
+    result = await evaluateGetter(service, instance.id, 'constrName');
+    expect(result.valueAsString, 'S');
+    result = await service.evaluate(isolateId, instance.id, 'T');
+    expect(result.json['name'], 'dynamic');
+  },
+  (VmService service, _) async {
+    dynamic instance = await createInstance(service, 'C.constr3(1, "abc", n: 42, t: 3.14)');
+    dynamic result = await evaluateGetter(service, instance.id, 'n');
+    expect(result.valueAsString, '42');
+    result = await evaluateGetter(service, instance.id, 't');
+    expect(result.valueAsString, '3.14');
+    result = await evaluateGetter(service, instance.id, 'constrName');
+    expect(result.valueAsString, 'S.named');
+    result = await service.evaluate(isolateId, instance.id, 'T');
+    expect(result.json['name'], 'double');
+
+    instance = await createInstance(service, 'C.constr3(1, "abc", n: 3.14, t: 42)');
+    result = await evaluateGetter(service, instance.id, 'n');
+    expect(result.valueAsString, '3.14');
+    result = await evaluateGetter(service, instance.id, 't');
+    expect(result.valueAsString, '42');
+    result = await evaluateGetter(service, instance.id, 'constrName');
+    expect(result.valueAsString, 'S.named');
+    result = await service.evaluate(isolateId, instance.id, 'T');
+    expect(result.json['name'], 'int');
+  },
+  (VmService service, _) async {
+    dynamic instance = await createInstance(service, 'B(1, 2, 3, 4)');
+    dynamic result = await evaluateGetter(service, instance.id, 'f1');
+    expect(result.valueAsString, '1');
+    result = await evaluateGetter(service, instance.id, 'v1');
+    expect(result.valueAsString, '2');
+    result = await evaluateGetter(service, instance.id, 'i1');
+    expect(result.valueAsString, '3');
+    result = await evaluateGetter(service, instance.id, 't1');
+    expect(result.valueAsString, '4');
+  },
+  resumeIsolate,
+  hasStoppedAtBreakpoint,
+  (VmService service, _) async {
+    dynamic result = await service.evaluateInFrame(isolateId, 0, 'n');
+    expect(result.valueAsString, '3.14');
+    result = await service.evaluateInFrame(isolateId, 0, 't');
+    expect(result.valueAsString, '42');
+    result = await service.evaluateInFrame(isolateId, 0, 'constrName');
+    expect(result.valueAsString, 'S.named');
+  },
+  resumeIsolate,
+  hasStoppedAtBreakpoint,
+  (VmService service, _) async {
+    dynamic result = await service.evaluateInFrame(isolateId, 0, 'f1');
+    expect(result.valueAsString, 'a');
+    result = await service.evaluateInFrame(isolateId, 0, 'v1');
+    expect(result.valueAsString, '3.14');
+    result = await service.evaluateInFrame(isolateId, 0, 'i1');
+    expect(result.valueAsString, '2.718');
+    result = await service.evaluateInFrame(isolateId, 0, 't1');
+    expect(result.valueAsString, '42');
+  }
+];
+
+main([args = const <String>[]]) => runIsolateTests(
+      args,
+      tests,
+      'super_constructor_invocation_test.dart',
+      testeeConcurrent: testMain,
+      experiments: ['super-parameters'],
+    );