custom_paint_test.dart 3 KB
Newer Older
1 2 3 4 5
// Copyright 2015 The Chromium 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';
6
import 'package:flutter/rendering.dart';
7 8 9 10 11
import 'package:flutter/widgets.dart';

class TestCustomPainter extends CustomPainter {
  TestCustomPainter({ this.log, this.name });

12 13
  final List<String> log;
  final String name;
14

15
  @override
16 17 18 19
  void paint(Canvas canvas, Size size) {
    log.add(name);
  }

20
  @override
21 22 23 24
  bool shouldRepaint(TestCustomPainter oldPainter) => true;
}

void main() {
25
  testWidgets('Control test for custom painting', (WidgetTester tester) async {
26
    final List<String> log = <String>[];
27 28
    await tester.pumpWidget(CustomPaint(
      painter: TestCustomPainter(
29
        log: log,
30
        name: 'background',
31
      ),
32
      foregroundPainter: TestCustomPainter(
33
        log: log,
34
        name: 'foreground',
35
      ),
36 37
      child: CustomPaint(
        painter: TestCustomPainter(
38
          log: log,
39 40 41
          name: 'child',
        ),
      ),
42
    ));
43

44
    expect(log, equals(<String>['background', 'child', 'foreground']));
45
  });
Ian Hickson's avatar
Ian Hickson committed
46 47

  testWidgets('CustomPaint sizing', (WidgetTester tester) async {
48
    final GlobalKey target = GlobalKey();
Ian Hickson's avatar
Ian Hickson committed
49

50
    await tester.pumpWidget(Center(
51
      child: CustomPaint(key: target),
Ian Hickson's avatar
Ian Hickson committed
52 53 54
    ));
    expect(target.currentContext.size, Size.zero);

55
    await tester.pumpWidget(Center(
56
      child: CustomPaint(key: target, child: Container()),
Ian Hickson's avatar
Ian Hickson committed
57 58 59
    ));
    expect(target.currentContext.size, const Size(800.0, 600.0));

60
    await tester.pumpWidget(Center(
61
      child: CustomPaint(key: target, size: const Size(20.0, 20.0)),
Ian Hickson's avatar
Ian Hickson committed
62 63 64
    ));
    expect(target.currentContext.size, const Size(20.0, 20.0));

65
    await tester.pumpWidget(Center(
66
      child: CustomPaint(key: target, size: const Size(2000.0, 100.0)),
Ian Hickson's avatar
Ian Hickson committed
67 68 69
    ));
    expect(target.currentContext.size, const Size(800.0, 100.0));

70
    await tester.pumpWidget(Center(
71
      child: CustomPaint(key: target, size: Size.zero, child: Container()),
Ian Hickson's avatar
Ian Hickson committed
72 73 74
    ));
    expect(target.currentContext.size, const Size(800.0, 600.0));

75
    await tester.pumpWidget(Center(
76
      child: CustomPaint(key: target, child: Container(height: 0.0, width: 0.0)),
Ian Hickson's avatar
Ian Hickson committed
77 78 79 80
    ));
    expect(target.currentContext.size, Size.zero);

  });
81 82

  testWidgets('Raster cache hints', (WidgetTester tester) async {
83
    final GlobalKey target = GlobalKey();
84 85

    final List<String> log = <String>[];
86
    await tester.pumpWidget(CustomPaint(
87 88
      key: target,
      isComplex: true,
89
      painter: TestCustomPainter(log: log),
90 91 92 93 94
    ));
    RenderCustomPaint renderCustom = target.currentContext.findRenderObject();
    expect(renderCustom.isComplex, true);
    expect(renderCustom.willChange, false);

95
    await tester.pumpWidget(CustomPaint(
96 97
      key: target,
      willChange: true,
98
      foregroundPainter: TestCustomPainter(log: log),
99 100 101 102 103
    ));
    renderCustom = target.currentContext.findRenderObject();
    expect(renderCustom.isComplex, false);
    expect(renderCustom.willChange, true);
  });
104
}