Get started on some augmentation library tests.

Bug: https://github.com/dart-lang/sdk/issues/53629
Change-Id: I4f86088b87796a094d49dd5941b167660fab3bab
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/328600
Commit-Queue: Jake Macdonald <jakemac@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Bob Nystrom <rnystrom@google.com>
diff --git a/tests/language/augmentation_libraries/analysis_options.yaml b/tests/language/augmentation_libraries/analysis_options.yaml
new file mode 100644
index 0000000..c38912d
--- /dev/null
+++ b/tests/language/augmentation_libraries/analysis_options.yaml
@@ -0,0 +1,3 @@
+analyzer:
+  enable-experiment:
+    - macros
diff --git a/tests/language/augmentation_libraries/class_augmentation.dart b/tests/language/augmentation_libraries/class_augmentation.dart
new file mode 100644
index 0000000..b1dd59e
--- /dev/null
+++ b/tests/language/augmentation_libraries/class_augmentation.dart
@@ -0,0 +1,77 @@
+// Copyright (c) 2023, 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.
+
+library augment 'class_augmentation_test.dart';
+
+String get foo => 'a';
+
+augment String get foo => '$augmented + b';
+
+augment String get foo => '$augmented + c';
+
+augment class A extends B implements I {
+  augment List<int> get ints => augmented..add(2);
+  augment List<int> get ints => augmented..add(3);
+
+  String str = 'hello';
+  augment String get str => '$augmented world';
+  augment set str(String value) => augmented = '2$value'
+
+  augment int needsInitialization = 1;
+
+  augment String fieldWithInitializer = '${augmented}b';
+  augment String fieldWithInitializer = '${augmented}c';
+
+  augment bool _privateField = false;
+
+  augment String funcWithoutBody() => 'a';
+
+  augment String funcWithBody() => 'b${augmented()}';
+  augment String funcWithBody() => '${augmented()}c';
+
+  augment String get getterWithoutBody => _underlyingString;
+  augment set setterWithoutBody(String value) => _underlyingString = value;
+  augment set setterWithBody(String value) =>
+      augmented = '$_underlyingString$value';
+
+  augment operator==(Object other) => false;
+
+  String newFunction() => 'a';
+  augment String newFunction() => '${augmented()}b';
+
+  String get newGetter => 'a';
+  augment String get newGetter => '${augmented}b';
+
+  set newSetter(String value) => _underlyingString = value;
+  augment set newSetter(String value) => augmented='$value 1';
+
+  // Override of `S.superX`.
+  String get superX => '${super.superX}c';
+  augment String get superX => '${augmented}d';
+
+  augment A() : augmentationInitializerInitialized = true {
+    augmented();
+    augmentationConstructorInitialized = true;
+  }
+}
+
+augment class A with M {
+  augment List<int> get ints => augmented..add(4);
+
+  augment String get str => '$augmented!';
+  augment set str(String value) => augmented = '4$value';
+
+  // Override of `M.mixinX`.
+  String get mixinX => '${super.mixinX}c';
+  augment String get mixinX => '${augmented}d';
+}
+
+
+augment base class B {
+  augment String get superX => '${augmented}b';
+}
+
+augment mixin M {
+  augment String get mixinX => '${augmented}b';
+}
diff --git a/tests/language/augmentation_libraries/class_augmentation_test.dart b/tests/language/augmentation_libraries/class_augmentation_test.dart
new file mode 100644
index 0000000..ee2ae9f
--- /dev/null
+++ b/tests/language/augmentation_libraries/class_augmentation_test.dart
@@ -0,0 +1,92 @@
+// Copyright (c) 2023, 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=macros
+
+import "package:expect/expect.dart";
+
+import augment "class_augmentation.dart";
+
+main() {
+  Expect.equals(foo, 'abc');
+  Expect.listEquals(A().ints, [1, 2, 3, 4]);
+  Expect.equals(A().str, 'hello world!');
+  {
+    var a = A()..str = 'test';
+    Expect.equals(a.str, '42test world!');
+  }
+  Expect.equals(A().needsInitialization, 1);
+  Expect.equals(A().fieldWithInitializer, 'abc');
+  Expect.equals(A()._privateField, false);
+  Expect.equals(A().funcWithBody(), 'bac');
+  Expect.equals(A().funcWithoutBody(), 'a');
+  {
+    var a = A();
+    Expect.equals(a.getterWithoutBody, 'a');
+    a.setterWithoutBody = 'b';
+    Expect.equals(a.getterWithoutBody, 'b');
+    a.setterWithBody = 'c';
+    Expect.equals(a.getterWithoutBody, 'bc');
+  }
+  var a = A();
+  Expect(a == a, false);
+  Expect(A().newFunction(), 'ab');
+  Expect(A().newGetter, 'ab');
+  {
+    var a = A()..newSetter = 'a';
+    Expect(a._underlyingString, 'a 1');
+  }
+
+  Expect(A() is B, true);
+  Expect(A() is M, true);
+  Expect(A() is I, true);
+  Expect(A().superX, 'abcd');
+  Expect(A().mixinX, 'abcd');
+
+  Expect(A().augmentationConstructorInitialized, true);
+  Expect(A().augmentationInitializerInitialized, true);
+  Expect(A().constructorInitialized, true);
+  Expect(A().initializerInitialized, true);
+}
+
+class A {
+  List<int> get ints => [1];
+
+  int needsInitialization;
+  String fieldWithInitializer = 'a';
+
+  bool _privateField = true; // augmented to `false`
+
+  String funcWithBody() => 'a';
+
+  String funcWithoutBody();
+
+  String _underlyingString = 'a';
+  String get getterWithoutBody;
+  set setterWithoutBody(String value);
+  set setterWithBody(String value) => _underlyingString = value;
+
+  operator==(Object other) => identical(true);
+
+  late final bool augmentationConstructorInitialized;
+  late final bool constructorInitialized;
+  final bool initializerInitialized;
+  final bool augmentationInitializerInitialized;
+
+  A() : initializerInitialized = true {
+    constructorInitialized = true;
+  }
+}
+
+base class B {
+  String get superX => 'a';
+}
+
+mixin M {
+  String get mixin => 'a';
+}
+
+abstract interface class I {
+  String get str;
+}