blob: 49f8d62ae1f41c7e772fbc94bc26e67f43643fc1 [file] [log] [blame]
// Copyright 2014 The Flutter Authors. 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:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'widget_inspector_test_utils.dart';
void main() {
StructureErrorTestWidgetInspectorService.runTests();
}
class StructureErrorTestWidgetInspectorService extends TestWidgetInspectorService {
static void runTests() {
final StructureErrorTestWidgetInspectorService service = StructureErrorTestWidgetInspectorService();
WidgetInspectorService.instance = service;
test('ext.flutter.inspector.structuredErrors - custom FlutterError.onError', () async {
// Regression test for https://github.com/flutter/flutter/issues/41540
// Ensures that
// * structured errors are enabled by default
// * FlutterError.onError without FlutterError.presentError doesn't present structured errors
// * FlutterError.onError with FlutterError.presentError does present structured errors
// * disabling structured errors sets the default FlutterError.presentError
final FlutterExceptionHandler? oldHandler = FlutterError.onError;
try {
expect(service.getEventsDispatched('Flutter.Error'), isEmpty);
// Set callback that doesn't call presentError.
bool onErrorCalled = false;
FlutterError.onError = (FlutterErrorDetails details) {
onErrorCalled = true;
};
// Get the service registered.
WidgetsFlutterBinding.ensureInitialized();
final FlutterErrorDetails expectedError = FlutterErrorDetails(
library: 'rendering library',
context: ErrorDescription('during layout'),
exception: StackTrace.current,
);
FlutterError.reportError(expectedError);
// Verify structured errors are not shown.
expect(onErrorCalled, true);
expect(service.getEventsDispatched('Flutter.Error'), isEmpty);
// Set callback that calls presentError.
onErrorCalled = false;
FlutterError.onError = (FlutterErrorDetails details) {
FlutterError.presentError(details);
onErrorCalled = true;
};
FlutterError.reportError(expectedError);
// Verify structured errors are shown.
expect(onErrorCalled, true);
// Structured errors are not supported on web.
if (!kIsWeb) {
expect(service.getEventsDispatched('Flutter.Error'), hasLength(1));
} else {
expect(service.getEventsDispatched('Flutter.Error'), isEmpty);
}
// Verify disabling structured errors sets the default FlutterError.presentError
expect(
await service.testBoolExtension('structuredErrors', <String, String>{'enabled': 'true'}),
equals('true'),
);
expect(FlutterError.presentError, isNot(equals(oldHandler)));
expect(
await service.testBoolExtension('structuredErrors', <String, String>{'enabled': 'false'}),
equals('false'),
);
expect(FlutterError.presentError, equals(oldHandler));
} finally {
FlutterError.onError = oldHandler;
}
});
}
}