Skip to content

Commit e48f286

Browse files
authored
Move use_key_in_widget_constructors tests to be reflective (#4283)
1 parent 82e7147 commit e48f286

7 files changed

+189
-56
lines changed

test/rule_test_support.dart

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,14 +469,43 @@ abstract class BuildContext {
469469
bool get mounted;
470470
}
471471
472+
class Container extends StatelessWidget {
473+
const Container({super.key});
474+
}
475+
476+
class Key {
477+
Key(String value);
478+
}
479+
472480
class Navigator {
473481
static NavigatorState of(
474482
BuildContext context, {bool rootNavigator = false}) => NavigatorState();
475483
}
476484
477485
class NavigatorState {}
478486
479-
class Widget {}
487+
abstract class StatefulWidget extends Widget {
488+
const StatefulWidget({super.key});
489+
}
490+
491+
abstract class Widget {
492+
final Key? key;
493+
494+
const Widget({thi.key});
495+
}
496+
497+
abstract class StatelessWidget extends Widget {
498+
const StatelessWidget({super.key});
499+
500+
@protected
501+
Widget build(BuildContext context);
502+
}
503+
504+
abstract class Widget {
505+
final Key? key;
506+
507+
const Widget({thi.key});
508+
}
480509
''');
481510
}
482511
}

test/rules/all.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ import 'use_build_context_synchronously_test.dart'
133133
import 'use_enums_test.dart' as use_enums;
134134
import 'use_is_even_rather_than_modulo_test.dart'
135135
as use_is_even_rather_than_modulo;
136+
import 'use_key_in_widget_constructors_test.dart'
137+
as use_key_in_widget_constructors;
136138
import 'use_late_for_private_fields_and_variables_test.dart'
137139
as use_late_for_private_fields_and_variables;
138140
import 'use_named_constants_test.dart' as use_named_constants;
@@ -236,6 +238,7 @@ void main() {
236238
use_build_context_synchronously.main();
237239
use_enums.main();
238240
use_is_even_rather_than_modulo.main();
241+
use_key_in_widget_constructors.main();
239242
use_late_for_private_fields_and_variables.main();
240243
use_named_constants.main();
241244
use_super_parameters.main();
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:test_reflective_loader/test_reflective_loader.dart';
6+
7+
import '../rule_test_support.dart';
8+
9+
main() {
10+
defineReflectiveSuite(() {
11+
defineReflectiveTests(UseKeyInWidgetConstructorsTest);
12+
});
13+
}
14+
15+
@reflectiveTest
16+
class UseKeyInWidgetConstructorsTest extends LintRuleTest {
17+
@override
18+
bool get addFlutterPackageDep => true;
19+
20+
@override
21+
String get lintRule => 'use_key_in_widget_constructors';
22+
23+
test_constNamedConstructor_missingKey() async {
24+
await assertDiagnostics(r'''
25+
import 'package:flutter/widgets.dart';
26+
27+
abstract class MyWidget extends StatelessWidget {
28+
const MyWidget.named();
29+
}
30+
''', [
31+
lint(107, 5),
32+
]);
33+
}
34+
35+
test_constUnnamedConstructor_missingKey() async {
36+
await assertDiagnostics(r'''
37+
import 'package:flutter/widgets.dart';
38+
39+
abstract class MyWidget extends StatelessWidget {
40+
const MyWidget();
41+
}
42+
''', [
43+
lint(98, 8),
44+
]);
45+
}
46+
47+
test_factoryConstructor() async {
48+
await assertNoDiagnostics(r'''
49+
import 'package:flutter/widgets.dart';
50+
51+
class MyWidget extends StatelessWidget {
52+
MyWidget({super.key});
53+
factory MyWidget.fact() => MyWidget();
54+
@override
55+
Widget build(BuildContext context) => Container();
56+
}
57+
''');
58+
}
59+
60+
test_missingConstructor() async {
61+
await assertDiagnostics(r'''
62+
import 'package:flutter/widgets.dart';
63+
64+
class NoConstructorWidget extends StatefulWidget {}
65+
''', [
66+
lint(46, 19),
67+
]);
68+
}
69+
70+
test_missingKey() async {
71+
await assertDiagnostics(r'''
72+
import 'package:flutter/widgets.dart';
73+
74+
abstract class MyWidget extends StatelessWidget {
75+
MyWidget();
76+
}
77+
''', [
78+
lint(92, 8),
79+
]);
80+
}
81+
82+
test_missingKey_keyPassedToSuper() async {
83+
await assertNoDiagnostics(r'''
84+
import 'package:flutter/widgets.dart';
85+
86+
abstract class MyWidget extends StatelessWidget {
87+
MyWidget.superCall() : super(key: Key(''));
88+
}
89+
''');
90+
}
91+
92+
test_privateClass() async {
93+
await assertNoDiagnostics(r'''
94+
import 'package:flutter/widgets.dart';
95+
96+
// ignore: unused_element
97+
class _PrivateWidget extends StatefulWidget {}
98+
''');
99+
}
100+
101+
test_privateConstructor() async {
102+
await assertNoDiagnostics(r'''
103+
import 'package:flutter/widgets.dart';
104+
105+
abstract class MyWidget extends StatelessWidget {
106+
MyWidget._private();
107+
}
108+
''');
109+
}
110+
111+
test_redirectingConstructor_withKey() async {
112+
await assertNoDiagnostics(r'''
113+
import 'package:flutter/widgets.dart';
114+
115+
abstract class MyWidget extends StatelessWidget {
116+
MyWidget.redirect() : this.withKey(key: Key(''));
117+
MyWidget.withKey({Key? key}) : super(key: key ?? Key(''));
118+
}
119+
''');
120+
}
121+
122+
test_simpleFormalParameter_notPassedToSuper() async {
123+
await assertDiagnostics(r'''
124+
import 'package:flutter/widgets.dart';
125+
126+
abstract class MyWidget extends StatelessWidget {
127+
MyWidget.withKey({Key? key});
128+
}
129+
''', [
130+
lint(101, 7),
131+
]);
132+
}
133+
134+
test_simpleFormalParameter_passedToSuper() async {
135+
await assertNoDiagnostics(r'''
136+
import 'package:flutter/widgets.dart';
137+
138+
abstract class MyWidget extends StatelessWidget {
139+
MyWidget.withKey({Key? key}) : super(key: key ?? Key(''));
140+
}
141+
''');
142+
}
143+
144+
test_superParameter() async {
145+
await assertNoDiagnostics(r'''
146+
import 'package:flutter/widgets.dart';
147+
148+
class OtherWidget extends StatelessWidget {
149+
const OtherWidget({required super.key});
150+
151+
@override
152+
Widget build(BuildContext context) => Container();
153+
}
154+
''');
155+
}
156+
}

test_data/rules/experiments/super_parameters/analysis_options.yaml

Lines changed: 0 additions & 3 deletions
This file was deleted.

test_data/rules/experiments/super_parameters/rules/.mock_packages

Lines changed: 0 additions & 1 deletion
This file was deleted.

test_data/rules/experiments/super_parameters/rules/use_key_in_widget_constructors.dart

Lines changed: 0 additions & 22 deletions
This file was deleted.

test_data/rules/use_key_in_widget_constructors.dart

Lines changed: 0 additions & 29 deletions
This file was deleted.

0 commit comments

Comments
 (0)