// 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 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:stack_trace/stack_trace.dart' as stack_trace; Future<void> main() async { test('demangles stacks', () async { // Test that the tester bindings unmangle stacks that come in as // package:stack_trace types. // Uses runTest directly so that the test does not get hung up waiting for // the error reporter to be reset to the original one. final Completer<FlutterErrorDetails> errorCompleter = Completer<FlutterErrorDetails>(); final TestExceptionReporter oldReporter = reportTestException; reportTestException = (FlutterErrorDetails details, String testDescription) { errorCompleter.complete(details); reportTestException = oldReporter; }; final AutomatedTestWidgetsFlutterBinding binding = AutomatedTestWidgetsFlutterBinding(); await binding.runTest(() async { final Completer<String> completer = Completer<String>(); completer.future.then( (String value) {}, onError: (Object error, StackTrace stack) { assert(stack is stack_trace.Chain); FlutterError.reportError(FlutterErrorDetails( exception: error, stack: stack, )); } ); completer.completeError(const CustomException()); }, () { }); final FlutterErrorDetails details = await errorCompleter.future; expect(details, isNotNull); expect(details.exception, isA<CustomException>()); reportTestException = oldReporter; }); } class CustomException implements Exception { const CustomException(); }