Unverified Commit 060adf09 authored by Christopher Fujino's avatar Christopher Fujino Committed by GitHub

[flutter_tools] Migrate commands.shard/hermetic/doctor_test to null-safety and...

[flutter_tools] Migrate commands.shard/hermetic/doctor_test to null-safety and make hermetic (#107670)
parent bccbcd7d
...@@ -320,12 +320,12 @@ class Doctor { ...@@ -320,12 +320,12 @@ class Doctor {
Future<bool> diagnose({ Future<bool> diagnose({
bool androidLicenses = false, bool androidLicenses = false,
bool verbose = true, bool verbose = true,
bool showColor = true,
AndroidLicenseValidator? androidLicenseValidator, AndroidLicenseValidator? androidLicenseValidator,
bool showPii = true, bool showPii = true,
List<ValidatorTask>? startedValidatorTasks, List<ValidatorTask>? startedValidatorTasks,
bool sendEvent = true, bool sendEvent = true,
}) async { }) async {
final bool showColor = globals.terminal.supportsColor;
if (androidLicenses && androidLicenseValidator != null) { if (androidLicenses && androidLicenseValidator != null) {
return androidLicenseValidator.runLicenseManager(); return androidLicenseValidator.runLicenseManager();
} }
...@@ -644,7 +644,7 @@ class DoctorText { ...@@ -644,7 +644,7 @@ class DoctorText {
Future<String> _runDiagnosis(bool showPii) async { Future<String> _runDiagnosis(bool showPii) async {
try { try {
await _doctor.diagnose(showColor: false, startedValidatorTasks: _validatorTasks, showPii: showPii, sendEvent: _sendDoctorEvent); await _doctor.diagnose(startedValidatorTasks: _validatorTasks, showPii: showPii, sendEvent: _sendDoctorEvent);
// Do not send the doctor event a second time. // Do not send the doctor event a second time.
_sendDoctorEvent = false; _sendDoctorEvent = false;
final String text = _logger.statusText; final String text = _logger.statusText;
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
// @dart = 2.8
// TODO(gspencergoog): Remove this tag once this test's state leaks/test // TODO(gspencergoog): Remove this tag once this test's state leaks/test
// dependencies have been fixed. // dependencies have been fixed.
// https://github.com/flutter/flutter/issues/85160 // https://github.com/flutter/flutter/issues/85160
...@@ -42,9 +40,9 @@ import '../../src/fakes.dart'; ...@@ -42,9 +40,9 @@ import '../../src/fakes.dart';
import '../../src/test_flutter_command_runner.dart'; import '../../src/test_flutter_command_runner.dart';
void main() { void main() {
FakeFlutterVersion flutterVersion; late FakeFlutterVersion flutterVersion;
BufferLogger logger; late BufferLogger logger;
FakeProcessManager fakeProcessManager; late FakeProcessManager fakeProcessManager;
setUp(() { setUp(() {
flutterVersion = FakeFlutterVersion(); flutterVersion = FakeFlutterVersion();
...@@ -187,12 +185,13 @@ void main() { ...@@ -187,12 +185,13 @@ void main() {
'• No issues found!\n' '• No issues found!\n'
)); ));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
DoctorValidatorsProvider: () => FakeDoctorValidatorsProvider(), DoctorValidatorsProvider: () => FakeDoctorValidatorsProvider(),
}); });
}); });
group('doctor usage params', () { group('doctor usage params', () {
TestUsage testUsage; late TestUsage testUsage;
setUp(() { setUp(() {
testUsage = TestUsage(); testUsage = TestUsage();
...@@ -328,6 +327,8 @@ void main() { ...@@ -328,6 +327,8 @@ void main() {
'\n' '\n'
'• No issues found!\n' '• No issues found!\n'
)); ));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
testUsingContext('validate non-verbose output format for run with crash', () async { testUsingContext('validate non-verbose output format for run with crash', () async {
...@@ -345,6 +346,8 @@ void main() { ...@@ -345,6 +346,8 @@ void main() {
'\n' '\n'
'! Doctor found issues in 1 category.\n' '! Doctor found issues in 1 category.\n'
)); ));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
testUsingContext('validate verbose output format contains trace for run with crash', () async { testUsingContext('validate verbose output format contains trace for run with crash', () async {
...@@ -361,6 +364,8 @@ void main() { ...@@ -361,6 +364,8 @@ void main() {
}); });
expect(logger.statusText, contains('Stuck validator that never completes exceeded maximum allowed duration of ')); expect(logger.statusText, contains('Stuck validator that never completes exceeded maximum allowed duration of '));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
testUsingContext('validate non-verbose output format for run with an async crash', () async { testUsingContext('validate non-verbose output format for run with an async crash', () async {
...@@ -387,6 +392,8 @@ void main() { ...@@ -387,6 +392,8 @@ void main() {
'\n' '\n'
'! Doctor found issues in 1 category.\n' '! Doctor found issues in 1 category.\n'
)); ));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
...@@ -399,6 +406,8 @@ void main() { ...@@ -399,6 +406,8 @@ void main() {
'\n' '\n'
'! Doctor found issues in 1 category.\n' '! Doctor found issues in 1 category.\n'
)); ));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
testUsingContext('validate non-verbose output format for a passing run', () async { testUsingContext('validate non-verbose output format for a passing run', () async {
...@@ -415,6 +424,8 @@ void main() { ...@@ -415,6 +424,8 @@ void main() {
'\n' '\n'
'! Doctor found issues in 2 categories.\n' '! Doctor found issues in 2 categories.\n'
)); ));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
testUsingContext('validate non-verbose output format', () async { testUsingContext('validate non-verbose output format', () async {
...@@ -436,6 +447,8 @@ void main() { ...@@ -436,6 +447,8 @@ void main() {
'\n' '\n'
'! Doctor found issues in 4 categories.\n' '! Doctor found issues in 4 categories.\n'
)); ));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
testUsingContext('validate verbose output format', () async { testUsingContext('validate verbose output format', () async {
...@@ -466,6 +479,8 @@ void main() { ...@@ -466,6 +479,8 @@ void main() {
'\n' '\n'
'! Doctor found issues in 4 categories.\n' '! Doctor found issues in 4 categories.\n'
)); ));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
testUsingContext('validate PII can be hidden', () async { testUsingContext('validate PII can be hidden', () async {
...@@ -485,12 +500,14 @@ void main() { ...@@ -485,12 +500,14 @@ void main() {
'\n' '\n'
'• No issues found!\n' '• No issues found!\n'
)); ));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
}); });
group('doctor diagnosis wrapper', () { group('doctor diagnosis wrapper', () {
TestUsage testUsage; late TestUsage testUsage;
BufferLogger logger; late BufferLogger logger;
setUp(() { setUp(() {
testUsage = TestUsage(); testUsage = TestUsage();
...@@ -527,6 +544,7 @@ void main() { ...@@ -527,6 +544,7 @@ void main() {
), ),
]); ]);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
Usage: () => testUsage, Usage: () => testUsage,
}); });
...@@ -572,6 +590,8 @@ void main() { ...@@ -572,6 +590,8 @@ void main() {
'! Doctor found issues in 4\n' '! Doctor found issues in 4\n'
' categories.\n' ' categories.\n'
)); ));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
testUsingContext('validate verbose output wrapping', () async { testUsingContext('validate verbose output wrapping', () async {
...@@ -616,6 +636,8 @@ void main() { ...@@ -616,6 +636,8 @@ void main() {
'! Doctor found issues in 4\n' '! Doctor found issues in 4\n'
' categories.\n' ' categories.\n'
)); ));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
group('doctor with grouped validators', () { group('doctor with grouped validators', () {
...@@ -632,6 +654,8 @@ void main() { ...@@ -632,6 +654,8 @@ void main() {
'\n' '\n'
'! Doctor found issues in 1 category.\n' '! Doctor found issues in 1 category.\n'
)); ));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
testUsingContext('validate merging assigns statusInfo and title', () async { testUsingContext('validate merging assigns statusInfo and title', () async {
...@@ -644,6 +668,8 @@ void main() { ...@@ -644,6 +668,8 @@ void main() {
'\n' '\n'
'• No issues found!\n' '• No issues found!\n'
)); ));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
}); });
...@@ -655,46 +681,64 @@ void main() { ...@@ -655,46 +681,64 @@ void main() {
testUsingContext('validate installed + installed = installed', () async { testUsingContext('validate installed + installed = installed', () async {
expect(await FakeSmallGroupDoctor(logger, installed, installed).diagnose(), isTrue); expect(await FakeSmallGroupDoctor(logger, installed, installed).diagnose(), isTrue);
expect(logger.statusText, startsWith('[✓]')); expect(logger.statusText, startsWith('[✓]'));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
testUsingContext('validate installed + partial = partial', () async { testUsingContext('validate installed + partial = partial', () async {
expect(await FakeSmallGroupDoctor(logger, installed, partial).diagnose(), isTrue); expect(await FakeSmallGroupDoctor(logger, installed, partial).diagnose(), isTrue);
expect(logger.statusText, startsWith('[!]')); expect(logger.statusText, startsWith('[!]'));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
testUsingContext('validate installed + missing = partial', () async { testUsingContext('validate installed + missing = partial', () async {
expect(await FakeSmallGroupDoctor(logger, installed, missing).diagnose(), isTrue); expect(await FakeSmallGroupDoctor(logger, installed, missing).diagnose(), isTrue);
expect(logger.statusText, startsWith('[!]')); expect(logger.statusText, startsWith('[!]'));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
testUsingContext('validate partial + installed = partial', () async { testUsingContext('validate partial + installed = partial', () async {
expect(await FakeSmallGroupDoctor(logger, partial, installed).diagnose(), isTrue); expect(await FakeSmallGroupDoctor(logger, partial, installed).diagnose(), isTrue);
expect(logger.statusText, startsWith('[!]')); expect(logger.statusText, startsWith('[!]'));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
testUsingContext('validate partial + partial = partial', () async { testUsingContext('validate partial + partial = partial', () async {
expect(await FakeSmallGroupDoctor(logger, partial, partial).diagnose(), isTrue); expect(await FakeSmallGroupDoctor(logger, partial, partial).diagnose(), isTrue);
expect(logger.statusText, startsWith('[!]')); expect(logger.statusText, startsWith('[!]'));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
testUsingContext('validate partial + missing = partial', () async { testUsingContext('validate partial + missing = partial', () async {
expect(await FakeSmallGroupDoctor(logger, partial, missing).diagnose(), isTrue); expect(await FakeSmallGroupDoctor(logger, partial, missing).diagnose(), isTrue);
expect(logger.statusText, startsWith('[!]')); expect(logger.statusText, startsWith('[!]'));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
testUsingContext('validate missing + installed = partial', () async { testUsingContext('validate missing + installed = partial', () async {
expect(await FakeSmallGroupDoctor(logger, missing, installed).diagnose(), isTrue); expect(await FakeSmallGroupDoctor(logger, missing, installed).diagnose(), isTrue);
expect(logger.statusText, startsWith('[!]')); expect(logger.statusText, startsWith('[!]'));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
testUsingContext('validate missing + partial = partial', () async { testUsingContext('validate missing + partial = partial', () async {
expect(await FakeSmallGroupDoctor(logger, missing, partial).diagnose(), isTrue); expect(await FakeSmallGroupDoctor(logger, missing, partial).diagnose(), isTrue);
expect(logger.statusText, startsWith('[!]')); expect(logger.statusText, startsWith('[!]'));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
testUsingContext('validate missing + missing = missing', () async { testUsingContext('validate missing + missing = missing', () async {
expect(await FakeSmallGroupDoctor(logger, missing, missing).diagnose(), isFalse); expect(await FakeSmallGroupDoctor(logger, missing, missing).diagnose(), isFalse);
expect(logger.statusText, startsWith('[✗]')); expect(logger.statusText, startsWith('[✗]'));
}, overrides: <Type, Generator>{
AnsiTerminal: () => FakeTerminal(),
}); });
}); });
...@@ -747,9 +791,9 @@ class NoOpDoctor implements Doctor { ...@@ -747,9 +791,9 @@ class NoOpDoctor implements Doctor {
bool androidLicenses = false, bool androidLicenses = false,
bool verbose = true, bool verbose = true,
bool showColor = true, bool showColor = true,
AndroidLicenseValidator androidLicenseValidator, AndroidLicenseValidator? androidLicenseValidator,
bool showPii = true, bool showPii = true,
List<ValidatorTask> startedValidatorTasks, List<ValidatorTask>? startedValidatorTasks,
bool sendEvent = true, bool sendEvent = true,
}) async => true; }) async => true;
...@@ -767,7 +811,7 @@ class NoOpDoctor implements Doctor { ...@@ -767,7 +811,7 @@ class NoOpDoctor implements Doctor {
} }
class PassingValidator extends DoctorValidator { class PassingValidator extends DoctorValidator {
PassingValidator(String name) : super(name); PassingValidator(super.name);
@override @override
Future<ValidationResult> validate() async { Future<ValidationResult> validate() async {
...@@ -875,10 +919,10 @@ class AsyncCrashingValidator extends DoctorValidator { ...@@ -875,10 +919,10 @@ class AsyncCrashingValidator extends DoctorValidator {
@override @override
Future<ValidationResult> validate() { Future<ValidationResult> validate() {
const Duration delay = Duration(seconds: 1); const Duration delay = Duration(seconds: 1);
final Future<ValidationResult> result = Future<ValidationResult>.delayed(delay) final Future<ValidationResult> result = Future<ValidationResult>.delayed(
.then((_) { delay,
throw StateError('fatal error'); () => throw StateError('fatal error'),
}); );
_time.elapse(const Duration(seconds: 1)); _time.elapse(const Duration(seconds: 1));
_time.flushMicrotasks(); _time.flushMicrotasks();
return result; return result;
...@@ -889,34 +933,27 @@ class AsyncCrashingValidator extends DoctorValidator { ...@@ -889,34 +933,27 @@ class AsyncCrashingValidator extends DoctorValidator {
class FakeDoctor extends Doctor { class FakeDoctor extends Doctor {
FakeDoctor(Logger logger) : super(logger: logger); FakeDoctor(Logger logger) : super(logger: logger);
List<DoctorValidator> _validators;
@override @override
List<DoctorValidator> get validators { late final List<DoctorValidator> validators = <DoctorValidator>[
return _validators ??= <DoctorValidator>[
PassingValidator('Passing Validator'), PassingValidator('Passing Validator'),
MissingValidator(), MissingValidator(),
NotAvailableValidator(), NotAvailableValidator(),
PartialValidatorWithHintsOnly(), PartialValidatorWithHintsOnly(),
PartialValidatorWithErrors(), PartialValidatorWithErrors(),
]; ];
}
} }
/// A doctor that should pass, but still has issues in some categories. /// A doctor that should pass, but still has issues in some categories.
class FakePassingDoctor extends Doctor { class FakePassingDoctor extends Doctor {
FakePassingDoctor(Logger logger) : super(logger: logger); FakePassingDoctor(Logger logger) : super(logger: logger);
List<DoctorValidator> _validators;
@override @override
List<DoctorValidator> get validators { late final List<DoctorValidator> validators = <DoctorValidator>[
return _validators ??= <DoctorValidator>[
PassingValidator('Passing Validator'), PassingValidator('Passing Validator'),
PartialValidatorWithHintsOnly(), PartialValidatorWithHintsOnly(),
PartialValidatorWithErrors(), PartialValidatorWithErrors(),
PassingValidator('Another Passing Validator'), PassingValidator('Another Passing Validator'),
]; ];
}
} }
/// A doctor that should pass, but still has 1 issue to test the singular of /// A doctor that should pass, but still has 1 issue to test the singular of
...@@ -924,80 +961,61 @@ class FakePassingDoctor extends Doctor { ...@@ -924,80 +961,61 @@ class FakePassingDoctor extends Doctor {
class FakeSinglePassingDoctor extends Doctor { class FakeSinglePassingDoctor extends Doctor {
FakeSinglePassingDoctor(Logger logger) : super(logger: logger); FakeSinglePassingDoctor(Logger logger) : super(logger: logger);
List<DoctorValidator> _validators;
@override @override
List<DoctorValidator> get validators { late final List<DoctorValidator> validators = <DoctorValidator>[
return _validators ??= <DoctorValidator>[
PartialValidatorWithHintsOnly(), PartialValidatorWithHintsOnly(),
]; ];
}
} }
/// A doctor that passes and has no issues anywhere. /// A doctor that passes and has no issues anywhere.
class FakeQuietDoctor extends Doctor { class FakeQuietDoctor extends Doctor {
FakeQuietDoctor(Logger logger) : super(logger: logger); FakeQuietDoctor(Logger logger) : super(logger: logger);
List<DoctorValidator> _validators;
@override @override
List<DoctorValidator> get validators { late final List<DoctorValidator> validators = <DoctorValidator>[
return _validators ??= <DoctorValidator>[
PassingValidator('Passing Validator'), PassingValidator('Passing Validator'),
PassingValidator('Another Passing Validator'), PassingValidator('Another Passing Validator'),
PassingValidator('Validators are fun'), PassingValidator('Validators are fun'),
PassingValidator('Four score and seven validators ago'), PassingValidator('Four score and seven validators ago'),
]; ];
}
} }
/// A doctor that passes and contains PII that can be hidden. /// A doctor that passes and contains PII that can be hidden.
class FakePiiDoctor extends Doctor { class FakePiiDoctor extends Doctor {
FakePiiDoctor(Logger logger) : super(logger: logger); FakePiiDoctor(Logger logger) : super(logger: logger);
List<DoctorValidator> _validators;
@override @override
List<DoctorValidator> get validators { late final List<DoctorValidator> validators = <DoctorValidator>[
return _validators ??= <DoctorValidator>[
PiiValidator(), PiiValidator(),
]; ];
}
} }
/// A doctor with a validator that throws an exception. /// A doctor with a validator that throws an exception.
class FakeCrashingDoctor extends Doctor { class FakeCrashingDoctor extends Doctor {
FakeCrashingDoctor(Logger logger) : super(logger: logger); FakeCrashingDoctor(Logger logger) : super(logger: logger);
List<DoctorValidator> _validators;
@override @override
List<DoctorValidator> get validators { late final List<DoctorValidator> validators = <DoctorValidator>[
if (_validators == null) { PassingValidator('Passing Validator'),
_validators = <DoctorValidator>[]; PassingValidator('Another Passing Validator'),
_validators.add(PassingValidator('Passing Validator')); CrashingValidator(),
_validators.add(PassingValidator('Another Passing Validator')); PassingValidator('Validators are fun'),
_validators.add(CrashingValidator()); PassingValidator('Four score and seven validators ago'),
_validators.add(PassingValidator('Validators are fun')); ];
_validators.add(PassingValidator('Four score and seven validators ago'));
}
return _validators;
}
} }
/// A doctor with a validator that will never finish. /// A doctor with a validator that will never finish.
class FakeAsyncStuckDoctor extends Doctor { class FakeAsyncStuckDoctor extends Doctor {
FakeAsyncStuckDoctor(Logger logger) : super(logger: logger); FakeAsyncStuckDoctor(Logger logger) : super(logger: logger);
List<DoctorValidator> _validators;
@override @override
List<DoctorValidator> get validators { late final List<DoctorValidator> validators = <DoctorValidator>[
if (_validators == null) { PassingValidator('Passing Validator'),
_validators = <DoctorValidator>[]; PassingValidator('Another Passing Validator'),
_validators.add(PassingValidator('Passing Validator')); StuckValidator(),
_validators.add(PassingValidator('Another Passing Validator')); PassingValidator('Validators are fun'),
_validators.add(StuckValidator()); PassingValidator('Four score and seven validators ago'),
_validators.add(PassingValidator('Validators are fun')); ];
_validators.add(PassingValidator('Four score and seven validators ago'));
}
return _validators;
}
} }
/// A doctor with a validator that throws an exception. /// A doctor with a validator that throws an exception.
...@@ -1006,19 +1024,14 @@ class FakeAsyncCrashingDoctor extends Doctor { ...@@ -1006,19 +1024,14 @@ class FakeAsyncCrashingDoctor extends Doctor {
final FakeAsync _time; final FakeAsync _time;
List<DoctorValidator> _validators;
@override @override
List<DoctorValidator> get validators { late final List<DoctorValidator> validators = <DoctorValidator>[
if (_validators == null) { PassingValidator('Passing Validator'),
_validators = <DoctorValidator>[]; PassingValidator('Another Passing Validator'),
_validators.add(PassingValidator('Passing Validator')); AsyncCrashingValidator(_time),
_validators.add(PassingValidator('Another Passing Validator')); PassingValidator('Validators are fun'),
_validators.add(AsyncCrashingValidator(_time)); PassingValidator('Four score and seven validators ago'),
_validators.add(PassingValidator('Validators are fun')); ];
_validators.add(PassingValidator('Four score and seven validators ago'));
}
return _validators;
}
} }
/// A DoctorValidatorsProvider that overrides the default validators without /// A DoctorValidatorsProvider that overrides the default validators without
...@@ -1038,7 +1051,7 @@ class FakeDoctorValidatorsProvider implements DoctorValidatorsProvider { ...@@ -1038,7 +1051,7 @@ class FakeDoctorValidatorsProvider implements DoctorValidatorsProvider {
} }
class PassingGroupedValidator extends DoctorValidator { class PassingGroupedValidator extends DoctorValidator {
PassingGroupedValidator(String name) : super(name); PassingGroupedValidator(super.name);
@override @override
Future<ValidationResult> validate() async { Future<ValidationResult> validate() async {
...@@ -1050,7 +1063,7 @@ class PassingGroupedValidator extends DoctorValidator { ...@@ -1050,7 +1063,7 @@ class PassingGroupedValidator extends DoctorValidator {
} }
class MissingGroupedValidator extends DoctorValidator { class MissingGroupedValidator extends DoctorValidator {
MissingGroupedValidator(String name) : super(name); MissingGroupedValidator(super.name);
@override @override
Future<ValidationResult> validate() async { Future<ValidationResult> validate() async {
...@@ -1062,7 +1075,7 @@ class MissingGroupedValidator extends DoctorValidator { ...@@ -1062,7 +1075,7 @@ class MissingGroupedValidator extends DoctorValidator {
} }
class PartialGroupedValidator extends DoctorValidator { class PartialGroupedValidator extends DoctorValidator {
PartialGroupedValidator(String name) : super(name); PartialGroupedValidator(super.name);
@override @override
Future<ValidationResult> validate() async { Future<ValidationResult> validate() async {
...@@ -1074,7 +1087,7 @@ class PartialGroupedValidator extends DoctorValidator { ...@@ -1074,7 +1087,7 @@ class PartialGroupedValidator extends DoctorValidator {
} }
class PassingGroupedValidatorWithStatus extends DoctorValidator { class PassingGroupedValidatorWithStatus extends DoctorValidator {
PassingGroupedValidatorWithStatus(String name) : super(name); PassingGroupedValidatorWithStatus(super.name);
@override @override
Future<ValidationResult> validate() async { Future<ValidationResult> validate() async {
...@@ -1089,10 +1102,8 @@ class PassingGroupedValidatorWithStatus extends DoctorValidator { ...@@ -1089,10 +1102,8 @@ class PassingGroupedValidatorWithStatus extends DoctorValidator {
class FakeGroupedDoctor extends Doctor { class FakeGroupedDoctor extends Doctor {
FakeGroupedDoctor(Logger logger) : super(logger: logger); FakeGroupedDoctor(Logger logger) : super(logger: logger);
List<DoctorValidator> _validators;
@override @override
List<DoctorValidator> get validators { late final List<DoctorValidator> validators = <DoctorValidator>[
return _validators ??= <DoctorValidator>[
GroupedValidator(<DoctorValidator>[ GroupedValidator(<DoctorValidator>[
PassingGroupedValidator('Category 1'), PassingGroupedValidator('Category 1'),
PassingGroupedValidator('Category 1'), PassingGroupedValidator('Category 1'),
...@@ -1102,39 +1113,33 @@ class FakeGroupedDoctor extends Doctor { ...@@ -1102,39 +1113,33 @@ class FakeGroupedDoctor extends Doctor {
MissingGroupedValidator('Category 2'), MissingGroupedValidator('Category 2'),
]), ]),
]; ];
}
} }
class FakeGroupedDoctorWithStatus extends Doctor { class FakeGroupedDoctorWithStatus extends Doctor {
FakeGroupedDoctorWithStatus(Logger logger) : super(logger: logger); FakeGroupedDoctorWithStatus(Logger logger) : super(logger: logger);
List<DoctorValidator> _validators;
@override @override
List<DoctorValidator> get validators { late final List<DoctorValidator> validators = <DoctorValidator>[
return _validators ??= <DoctorValidator>[
GroupedValidator(<DoctorValidator>[ GroupedValidator(<DoctorValidator>[
PassingGroupedValidator('First validator title'), PassingGroupedValidator('First validator title'),
PassingGroupedValidatorWithStatus('Second validator title'), PassingGroupedValidatorWithStatus('Second validator title'),
]), ]),
]; ];
}
} }
/// A doctor that takes any two validators. Used to check behavior when /// A doctor that takes any two validators. Used to check behavior when
/// merging ValidationTypes (installed, missing, partial). /// merging ValidationTypes (installed, missing, partial).
class FakeSmallGroupDoctor extends Doctor { class FakeSmallGroupDoctor extends Doctor {
FakeSmallGroupDoctor(Logger logger, DoctorValidator val1, DoctorValidator val2) : super(logger: logger) { FakeSmallGroupDoctor(Logger logger, DoctorValidator val1, DoctorValidator val2)
_validators = <DoctorValidator>[GroupedValidator(<DoctorValidator>[val1, val2])]; : validators = <DoctorValidator>[GroupedValidator(<DoctorValidator>[val1, val2])],
} super(logger: logger);
List<DoctorValidator> _validators;
@override @override
List<DoctorValidator> get validators => _validators; final List<DoctorValidator> validators;
} }
class VsCodeValidatorTestTargets extends VsCodeValidator { class VsCodeValidatorTestTargets extends VsCodeValidator {
VsCodeValidatorTestTargets._(String installDirectory, String extensionDirectory, {String edition}) VsCodeValidatorTestTargets._(String installDirectory, String extensionDirectory, {String? edition})
: super(VsCode.fromDirectory(installDirectory, extensionDirectory, edition: edition, fileSystem: globals.fs)); : super(VsCode.fromDirectory(installDirectory, extensionDirectory, edition: edition, fileSystem: globals.fs));
static VsCodeValidatorTestTargets get installedWithExtension => static VsCodeValidatorTestTargets get installedWithExtension =>
...@@ -1190,3 +1195,8 @@ class FakeDevice extends Fake implements Device { ...@@ -1190,3 +1195,8 @@ class FakeDevice extends Fake implements Device {
@override @override
Future<TargetPlatform> get targetPlatform => Future<TargetPlatform>.value(TargetPlatform.android); Future<TargetPlatform> get targetPlatform => Future<TargetPlatform>.value(TargetPlatform.android);
} }
class FakeTerminal extends Fake implements AnsiTerminal {
@override
final bool supportsColor = false;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment