// 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_test/flutter_test.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';

import '../rendering/mock_canvas.dart';

/// Unit tests error.dart's usage via ErrorWidget.
void main() {
  const String errorMessage = 'Some error message';

  testWidgets('test draw error paragraph', (WidgetTester tester) async {
    await tester.pumpWidget(ErrorWidget(Exception(errorMessage)));
    expect(find.byType(ErrorWidget), paints
        ..rect(rect: const Rect.fromLTWH(0.0, 0.0, 800.0, 600.0))
        ..paragraph(offset: const Offset(64.0, 96.0)));

    final Widget _error = Builder(builder: (BuildContext context) => throw 'pillow');

    await tester.pumpWidget(Center(child: SizedBox(width: 100.0, child: _error)));
    expect(tester.takeException(), 'pillow');
    expect(find.byType(ErrorWidget), paints
        ..rect(rect: const Rect.fromLTWH(0.0, 0.0, 100.0, 600.0))
        ..paragraph(offset: const Offset(0.0, 96.0)));

    await tester.pumpWidget(Center(child: SizedBox(height: 100.0, child: _error)));
    expect(tester.takeException(), null);

    await tester.pumpWidget(Center(child: SizedBox(key: UniqueKey(), height: 100.0, child: _error)));
    expect(tester.takeException(), 'pillow');
    expect(find.byType(ErrorWidget), paints
        ..rect(rect: const Rect.fromLTWH(0.0, 0.0, 800.0, 100.0))
        ..paragraph(offset: const Offset(64.0, 0.0)));

    RenderErrorBox.minimumWidth = 800.0;
    await tester.pumpWidget(Center(child: _error));
    expect(tester.takeException(), 'pillow');
    expect(find.byType(ErrorWidget), paints
        ..rect(rect: const Rect.fromLTWH(0.0, 0.0, 800.0, 600.0))
        ..paragraph(offset: const Offset(0.0, 96.0)));

    await tester.pumpWidget(Center(child: _error));
    expect(tester.takeException(), null);
    expect(find.byType(ErrorWidget), paints
        ..rect(color: const Color(0xF0900000))
        ..paragraph());

    RenderErrorBox.backgroundColor = const Color(0xFF112233);
    await tester.pumpWidget(Center(child: _error));
    expect(tester.takeException(), null);
    expect(find.byType(ErrorWidget), paints
        ..rect(color: const Color(0xFF112233))
        ..paragraph());
  });
}
