Skip to content
This repository was archived by the owner on Nov 20, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 30 additions & 1 deletion test/rule_test_support.dart
Original file line number Diff line number Diff line change
Expand Up @@ -469,14 +469,43 @@ abstract class BuildContext {
bool get mounted;
}

class Container extends StatelessWidget {
const Container({super.key});
}

class Key {
Key(String value);
}

class Navigator {
static NavigatorState of(
BuildContext context, {bool rootNavigator = false}) => NavigatorState();
}

class NavigatorState {}

class Widget {}
abstract class StatefulWidget extends Widget {
const StatefulWidget({super.key});
}

abstract class Widget {
final Key? key;

const Widget({thi.key});
}

abstract class StatelessWidget extends Widget {
const StatelessWidget({super.key});

@protected
Widget build(BuildContext context);
}

abstract class Widget {
final Key? key;

const Widget({thi.key});
}
''');
}
}
Expand Down
3 changes: 3 additions & 0 deletions test/rules/all.dart
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ import 'use_build_context_synchronously_test.dart'
import 'use_enums_test.dart' as use_enums;
import 'use_is_even_rather_than_modulo_test.dart'
as use_is_even_rather_than_modulo;
import 'use_key_in_widget_constructors_test.dart'
as use_key_in_widget_constructors;
import 'use_late_for_private_fields_and_variables_test.dart'
as use_late_for_private_fields_and_variables;
import 'use_named_constants_test.dart' as use_named_constants;
Expand Down Expand Up @@ -236,6 +238,7 @@ void main() {
use_build_context_synchronously.main();
use_enums.main();
use_is_even_rather_than_modulo.main();
use_key_in_widget_constructors.main();
use_late_for_private_fields_and_variables.main();
use_named_constants.main();
use_super_parameters.main();
Expand Down
156 changes: 156 additions & 0 deletions test/rules/use_key_in_widget_constructors_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
// 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.

import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../rule_test_support.dart';

main() {
defineReflectiveSuite(() {
defineReflectiveTests(UseKeyInWidgetConstructorsTest);
});
}

@reflectiveTest
class UseKeyInWidgetConstructorsTest extends LintRuleTest {
@override
bool get addFlutterPackageDep => true;

@override
String get lintRule => 'use_key_in_widget_constructors';

test_constNamedConstructor_missingKey() async {
await assertDiagnostics(r'''
import 'package:flutter/widgets.dart';

abstract class MyWidget extends StatelessWidget {
const MyWidget.named();
}
''', [
lint(107, 5),
]);
}

test_constUnnamedConstructor_missingKey() async {
await assertDiagnostics(r'''
import 'package:flutter/widgets.dart';

abstract class MyWidget extends StatelessWidget {
const MyWidget();
}
''', [
lint(98, 8),
]);
}

test_factoryConstructor() async {
await assertNoDiagnostics(r'''
import 'package:flutter/widgets.dart';

class MyWidget extends StatelessWidget {
MyWidget({super.key});
factory MyWidget.fact() => MyWidget();
@override
Widget build(BuildContext context) => Container();
}
''');
}

test_missingConstructor() async {
await assertDiagnostics(r'''
import 'package:flutter/widgets.dart';

class NoConstructorWidget extends StatefulWidget {}
''', [
lint(46, 19),
]);
}

test_missingKey() async {
await assertDiagnostics(r'''
import 'package:flutter/widgets.dart';

abstract class MyWidget extends StatelessWidget {
MyWidget();
}
''', [
lint(92, 8),
]);
}

test_missingKey_keyPassedToSuper() async {
await assertNoDiagnostics(r'''
import 'package:flutter/widgets.dart';

abstract class MyWidget extends StatelessWidget {
MyWidget.superCall() : super(key: Key(''));
}
''');
}

test_privateClass() async {
await assertNoDiagnostics(r'''
import 'package:flutter/widgets.dart';

// ignore: unused_element
class _PrivateWidget extends StatefulWidget {}
''');
}

test_privateConstructor() async {
await assertNoDiagnostics(r'''
import 'package:flutter/widgets.dart';

abstract class MyWidget extends StatelessWidget {
MyWidget._private();
}
''');
}

test_redirectingConstructor_withKey() async {
await assertNoDiagnostics(r'''
import 'package:flutter/widgets.dart';

abstract class MyWidget extends StatelessWidget {
MyWidget.redirect() : this.withKey(key: Key(''));
MyWidget.withKey({Key? key}) : super(key: key ?? Key(''));
}
''');
}

test_simpleFormalParameter_notPassedToSuper() async {
await assertDiagnostics(r'''
import 'package:flutter/widgets.dart';

abstract class MyWidget extends StatelessWidget {
MyWidget.withKey({Key? key});
}
''', [
lint(101, 7),
]);
}

test_simpleFormalParameter_passedToSuper() async {
await assertNoDiagnostics(r'''
import 'package:flutter/widgets.dart';

abstract class MyWidget extends StatelessWidget {
MyWidget.withKey({Key? key}) : super(key: key ?? Key(''));
}
''');
}

test_superParameter() async {
await assertNoDiagnostics(r'''
import 'package:flutter/widgets.dart';

class OtherWidget extends StatelessWidget {
const OtherWidget({required super.key});

@override
Widget build(BuildContext context) => Container();
}
''');
}
}

This file was deleted.

This file was deleted.

This file was deleted.

29 changes: 0 additions & 29 deletions test_data/rules/use_key_in_widget_constructors.dart

This file was deleted.