// 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: (dynamic error, StackTrace stack) {
          assert(stack is stack_trace.Chain);
          FlutterError.reportError(FlutterErrorDetails(
            exception: error,
            stack: stack,
          ));
        }
      );

      completer.completeError(const CustomException());
    }, null);

    final FlutterErrorDetails details = await errorCompleter.future;
    expect(details, isNotNull);
    expect(details.exception, isA<CustomException>());
    reportTestException = oldReporter;
  });
}

class CustomException implements Exception {
  const CustomException();
}