lint rules: Migrate prefer_void_to_null tests

Change-Id: Id02e094fd71d2c6e6326431f865cf19babcbdd40
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/398505
Auto-Submit: Samuel Rawlins <srawlins@google.com>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Commit-Queue: Phil Quitslund <pquitslund@google.com>
diff --git a/pkg/linter/test/rules/prefer_void_to_null_test.dart b/pkg/linter/test/rules/prefer_void_to_null_test.dart
index 1a63e7f..05636c9 100644
--- a/pkg/linter/test/rules/prefer_void_to_null_test.dart
+++ b/pkg/linter/test/rules/prefer_void_to_null_test.dart
@@ -8,6 +8,8 @@
 
 main() {
   defineReflectiveSuite(() {
+    // TODO(mfairhurst): test void with a prefix, except that causes bugs.
+    // TODO(mfairhurst): test defining a class named Null (requires a 2nd file).
     defineReflectiveTests(PreferVoidToNullTest);
   });
 }
@@ -149,6 +151,99 @@
 ''');
   }
 
+  test_instanceField_futureOfNull() async {
+    await assertDiagnostics(r'''
+class C {
+  Future<Null>? x;
+}
+''', [
+      lint(19, 4),
+    ]);
+  }
+
+  test_instanceField_null() async {
+    await assertDiagnostics(r'''
+class C {
+  Null x;
+}
+''', [
+      lint(12, 4),
+    ]);
+  }
+
+  test_instanceField_null_prefixed() async {
+    await assertDiagnostics(r'''
+import 'dart:core' as core;
+class C {
+  core.Null x;
+}
+''', [
+      lint(45, 4),
+    ]);
+  }
+
+  test_instanceGetter_overrideChangingType() async {
+    // https://github.com/dart-lang/linter/issues/1523
+    await assertNoDiagnostics(r'''
+abstract class C {
+  Object? get foo;
+}
+
+class D extends C {
+  @override
+  Null get foo => null;
+}
+''');
+  }
+
+  test_instanceMethod_returnType_overrideChangingType() async {
+    await assertDiagnostics(r'''
+import 'dart:async';
+abstract class C {
+  FutureOr<void>? m();
+}
+
+class D implements C {
+  @override
+  Null m() {}
+}
+''', [
+      lint(103, 4),
+    ]);
+  }
+
+  test_instanceMethod_returnType_overrideChangingType_generic() async {
+    // https://github.com/dart-lang/linter/issues/2792
+    await assertNoDiagnostics(r'''
+abstract class C<T> {
+  Future<T>? m();
+}
+
+class D<T> implements C<T> {
+  @override
+  Null m() {}
+}
+''');
+  }
+
+  test_listLiteralTypeArg_null_empty() async {
+    await assertNoDiagnostics(r'''
+void f() {
+  <Null>[];
+}
+''');
+  }
+
+  test_listLiteralTypeArg_null_nonEmpty() async {
+    await assertDiagnostics(r'''
+void f() {
+  <Null>[null];
+}
+''', [
+      lint(14, 4),
+    ]);
+  }
+
   test_localVariable() async {
     await assertNoDiagnostics(r'''
 void f() {
@@ -157,9 +252,172 @@
 ''');
   }
 
+  test_localVariable_futureOfNull() async {
+    await assertDiagnostics(r'''
+void f() {
+  Future<Null> x;
+}
+''', [
+      lint(20, 4),
+    ]);
+  }
+
+  test_mapLiteralTypeArg_nullKey_empty() async {
+    await assertNoDiagnostics(r'''
+void f() {
+  <Null, String>{};
+}
+''');
+  }
+
+  test_mapLiteralTypeArg_nullKey_nonEmpty() async {
+    await assertDiagnostics(r'''
+void f() {
+  <Null, String>{null: "foo"};
+}
+''', [
+      lint(14, 4),
+    ]);
+  }
+
+  test_mapLiteralTypeArg_nullValue_empty() async {
+    await assertNoDiagnostics(r'''
+void f() {
+  <String, Null>{};
+}
+''');
+  }
+
+  test_mapLiteralTypeArg_nullValue_nonEmpty() async {
+    await assertDiagnostics(r'''
+void f() {
+  <String, Null>{"foo": null};
+}
+''', [
+      lint(22, 4),
+    ]);
+  }
+
+  test_methodInvocation_typeArgument() async {
+    await assertDiagnostics(r'''
+void f(Future<void> p) {
+  p.then<Null>((_) {});
+}
+''', [
+      lint(34, 4),
+    ]);
+  }
+
+  test_methodParameter_null() async {
+    await assertDiagnostics(r'''
+class C {
+  void m(Null x) {}
+}
+''', [
+      lint(19, 4),
+    ]);
+  }
+
+  test_methodReturnType_null() async {
+    await assertDiagnostics(r'''
+class C {
+  Null m() {}
+}
+''', [
+      lint(12, 4),
+    ]);
+  }
+
+  test_methodReturnType_null_prefixed() async {
+    await assertDiagnostics(r'''
+import 'dart:core' as core;
+class C {
+  core.Null m() {}
+}
+''', [
+      lint(45, 4),
+    ]);
+  }
+
+  test_topLevelFunction_parameterType_null() async {
+    await assertDiagnostics(r'''
+void f(Null x) {}
+''', [
+      lint(7, 4),
+    ]);
+  }
+
+  test_topLevelFunction_parameterType_null_prefixed() async {
+    await assertDiagnostics(r'''
+import 'dart:core' as core;
+void f(core.Null x) {}
+''', [
+      lint(40, 4),
+    ]);
+  }
+
+  test_topLevelFunction_returnType_null() async {
+    await assertDiagnostics(r'''
+Null f() {}
+''', [
+      lint(0, 4),
+    ]);
+  }
+
+  test_topLevelFunction_returnType_null_prefixed() async {
+    await assertDiagnostics(r'''
+import 'dart:core' as core;
+core.Null f() {}
+''', [
+      lint(33, 4),
+    ]);
+  }
+
   test_topLevelVariable() async {
     await assertNoDiagnostics(r'''
 Null a;
 ''');
   }
+
+  test_topLevelVariable_functionReturnType_functionParameterType_futureOfNull() async {
+    await assertDiagnostics(r'''
+void Function(Future<Null>)? f;
+''', [
+      lint(21, 4),
+    ]);
+  }
+
+  test_topLevelVariable_functionReturnType_functionParameterType_null() async {
+    await assertNoDiagnostics(r'''
+void Function(Null)? f;
+''');
+  }
+
+  test_topLevelVariable_functionReturnType_functionReturnType_futureOfNull() async {
+    await assertDiagnostics(r'''
+Future<Null> Function()? f;
+''', [
+      lint(7, 4),
+    ]);
+  }
+
+  test_topLevelVariable_functionReturnType_functionReturnType_null() async {
+    await assertNoDiagnostics(r'''
+Null Function()? f;
+''');
+  }
+
+  test_topLevelVariable_futureOfNull() async {
+    await assertDiagnostics(r'''
+Future<Null>? x;
+''', [
+      lint(7, 4),
+    ]);
+  }
+
+  test_topLevelVariable_null() async {
+    await assertNoDiagnostics(r'''
+Null x;
+''');
+  }
 }
diff --git a/pkg/linter/test_data/rules/prefer_void_to_null.dart b/pkg/linter/test_data/rules/prefer_void_to_null.dart
deleted file mode 100644
index 6c2d59a..0000000
--- a/pkg/linter/test_data/rules/prefer_void_to_null.dart
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright (c) 2018, 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.
-
-// TODO(mfairhurst) test void with a prefix, except that causes bugs.
-// TODO(mfairhurst) test defining a class named Null (requires a 2nd file)
-
-// ignore_for_file: unused_local_variable
-
-import 'dart:async';
-import 'dart:core';
-import 'dart:core' as core;
-
-abstract class X {
-  dynamic get foo;
-}
-
-/// https://github.com/dart-lang/linter/issues/1523
-class Y extends X {
-  @override
-  Null get foo => null; // OK
-}
-
-/// https://github.com/dart-lang/linter/issues/2792
-class A<T> {
-  Future<T>? something() {}
-}
-
-class B<T> implements A<T> {
-  @override
-  Null something() {}  // OK
-}
-
-class C {
-  FutureOr<void>? something() {}
-}
-
-class D implements C {
-  @override
-  Null something() {}  // LINT
-}
-
-class E {
-  Never? something() {} // LINT
-}
-
-class F implements E {
-  @override
-  Null something() {}  // OK
-}
-
-void void_; // OK
-Future<void>? future_void; // OK
-Future<Null>? future_null; // LINT
-Future<core.Null>? future_core_null; // LINT
-
-void void_f() {} // OK
-Null null_f() {} // LINT
-core.Null core_null_f() {} // LINT
-f_void(void x) {} // OK
-f_null(Null x) {} // LINT
-f_core_null(core.Null x) {} // LINT
-
-void Function(Null)? voidFunctionNull; // OK
-Null Function()? nullFunctionVoid; // OK
-Future<Null> Function()? FutureNullFunction; // LINT
-void Function(Future<Null>)? voidFunctionFutureNull; // LINT
-
-usage() {
-  void void_; // OK
-  Future<void>? future_void; // OK
-  Future<Null> future_null; // LINT
-  Future<core.Null> future_core_null; // LINT
-
-  future_void?.then<Null>((_) {}); // LINT
-  future_void?.then<void>((_) {}); // OK
-}
-
-void inference() {
-  final _null = null; // OK
-  final nullReturnInferred = () {}; // OK
-  final nullInferred = nullReturnInferred(); // OK
-}
-
-void emptyLiterals() {
-  <Null>[]; // OK
-  <Null>[null]; // LINT
-  <void>[]; // OK
-  <void>[null]; // OK
-  <int, Null>{}; // OK
-  <String, Null>{}; // OK
-  <Object, Null>{}; // OK
-  <Null, int>{}; // OK
-  <Null, String>{}; // OK
-  <Null, Object>{}; // OK
-  <Null, Null>{}; // OK
-  <int, Null>{1: null}; // LINT
-  <String, Null>{"foo": null}; // LINT
-  <Object?, Null>{null: null}; // LINT
-  <Null, int>{null: 1}; // LINT
-  <Null, String>{null: "foo"}; // LINT
-  <Null, Object?>{null: null}; // LINT
-  <Null, // LINT
-      Null>{null: null}; // LINT
-  <int, void>{}; // OK
-  <String, void>{}; // OK
-  <Object, void>{}; // OK
-  <void, int>{}; // OK
-  <void, String>{}; // OK
-  <void, Object>{}; // OK
-  <void, void>{}; // OK
-  <int, void>{1: null}; // OK
-  <String, void>{"foo": null}; // OK
-  <Object?, void>{null: null}; // OK
-  <void, int>{null: 1}; // OK
-  <void, String>{null: "foo"}; // OK
-  <void, Object?>{null: null}; // OK
-  <void, void>{null: null}; // OK
-
-  // TODO(mfairhurst): is it worth handling more complex literals?
-}
-
-variableNamedNull() {
-  var Null; // OK
-  return Null; // OK
-}
-
-parameterNamedNull(Object Null) {
-  Null; // OK
-}
-
-class AsMembers {
-  void void_; // OK
-  Null null_; // LINT
-  core.Null core_null; // LINT
-  Future<void>? future_void; // OK
-  Future<Null>? future_null; // LINT
-  Future<core.Null>? future_core_null; // LINT
-
-  void void_f() {} // OK
-  Null null_f() {} // LINT
-  core.Null core_null_f() {} // LINT
-  f_void(void x) {} // OK
-  f_null(Null x) {} // LINT
-  f_core_null(core.Null x) {} // LINT
-
-  void usage() {
-    void void_; // OK
-    Future<void>? future_void; // OK
-    Future<Null> future_null; // LINT
-    Future<core.Null> future_core_null; // LINT
-
-    future_void?.then<Null>((_) {}); // LINT
-    future_void?.then<void>((_) {}); // OK
-  }
-
-  parameterNamedNull(Object Null) {
-    Null; // OK
-  }
-
-  variableNamedNull() {
-    var Null; // OK
-    return Null; // OK
-  }
-}
-
-class MemberNamedNull {
-  final Null = null; // OK
-}