shader_mask_test.dart 3.53 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
Hixie's avatar
Hixie committed
2 3 4
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5 6
// @dart = 2.8

7
import 'dart:ui' show Shader;
Hans Muller's avatar
Hans Muller committed
8

Adam Barth's avatar
Adam Barth committed
9
import 'package:flutter_test/flutter_test.dart';
10
import 'package:flutter/widgets.dart';
Hans Muller's avatar
Hans Muller committed
11

12
Shader createShader(Rect bounds) {
13
  return const LinearGradient(
14 15
    begin: Alignment.topCenter,
    end: Alignment.bottomCenter,
16
    colors: <Color>[Color(0x00FFFFFF), Color(0xFFFFFFFF)],
17
    stops: <double>[0.1, 0.35],
18
  ).createShader(bounds);
Hans Muller's avatar
Hans Muller committed
19 20 21 22
}


void main() {
23
  testWidgets('Can be constructed', (WidgetTester tester) async {
24 25
    const Widget child = SizedBox(width: 100.0, height: 100.0);
    await tester.pumpWidget(const ShaderMask(child: child, shaderCallback: createShader));
26
  }, skip: isBrowser); // https://github.com/flutter/flutter/issues/44152
27 28 29 30 31 32 33 34

  testWidgets('Bounds rect includes offset', (WidgetTester tester) async {
    Rect shaderBounds;
    Shader recordShaderBounds(Rect bounds) {
      shaderBounds = bounds;
      return createShader(bounds);
    }

35
    final Widget widget = Align(
36
      alignment: Alignment.center,
37
      child: SizedBox(
38 39
        width: 400.0,
        height: 400.0,
40
        child: ShaderMask(
41
          shaderCallback: recordShaderBounds,
42
          child: const SizedBox(width: 100.0, height: 100.0),
43 44 45 46 47 48
        ),
      ),
    );
    await tester.pumpWidget(widget);

    // The shader bounds rectangle should reflect the position of the centered SizedBox.
49
    expect(shaderBounds, equals(const Rect.fromLTWH(0.0, 0.0, 400.0, 400.0)));
50
  }, skip: isBrowser); // https://github.com/flutter/flutter/issues/44152
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112


  testWidgets('Bounds rect includes offset visual inspection', (WidgetTester tester) async {
    final Widget widgetBottomRight = Container(
      width: 400,
      height: 400,
      color: const Color(0xFFFFFFFF),
      child: RepaintBoundary(
        child: Align(
          alignment: Alignment.bottomRight,
          child: ShaderMask(
            shaderCallback: (Rect bounds) => const RadialGradient(
              center: Alignment.center,
              radius: 0.05,
              colors:  <Color>[Color(0xFFFF0000),  Color(0xFF00FF00)],
              tileMode: TileMode.mirror,
            ).createShader(bounds),
            child: Container(
              width: 100,
              height: 100,
              color: const Color(0xFFFFFFFF),
            ),
          ),
        ),
      ),
    );
    await tester.pumpWidget(widgetBottomRight);

    await expectLater(
      find.byType(RepaintBoundary),
      matchesGoldenFile('shader_mask.bounds.matches_bottom_right.png'),
    );

    final Widget widgetTopLeft = Container(
      width: 400,
      height: 400,
      color: const Color(0xFFFFFFFF),
      child: RepaintBoundary(
        child: Align(
          alignment: Alignment.topLeft,
          child: ShaderMask(
            shaderCallback: (Rect bounds) => const RadialGradient(
              center: Alignment.center,
              radius: 0.05,
              colors:  <Color>[Color(0xFFFF0000),  Color(0xFF00FF00)],
              tileMode: TileMode.mirror,
            ).createShader(bounds),
            child: Container(
              width: 100,
              height: 100,
              color: const Color(0xFFFFFFFF),
            ),
          ),
        ),
      ),
    );
    await tester.pumpWidget(widgetTopLeft);

    await expectLater(
      find.byType(RepaintBoundary),
      matchesGoldenFile('shader_mask.bounds.matches_top_left.png'),
    );
113
  }, skip: isBrowser); // https://github.com/flutter/flutter/issues/44152
Hans Muller's avatar
Hans Muller committed
114
}