gradient_test.dart 8.71 KB
Newer Older
1 2 3 4 5 6 7 8 9
// Copyright 2016 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';
import 'package:flutter/painting.dart';

void main() {
  test('LinearGradient scale test', () {
10
    const LinearGradient testGradient = const LinearGradient(
11 12
      begin: Alignment.bottomRight,
      end: const Alignment(0.7, 1.0),
13 14 15 16 17 18 19 20 21
      colors: const <Color>[
        const Color(0x00FFFFFF),
        const Color(0x11777777),
        const Color(0x44444444),
      ],
    );
    final LinearGradient actual = LinearGradient.lerp(null, testGradient, 0.25);

    expect(actual, const LinearGradient(
22 23
      begin: Alignment.bottomRight,
      end: const Alignment(0.7, 1.0),
24 25 26 27 28 29 30 31 32
      colors: const <Color>[
        const Color(0x00FFFFFF),
        const Color(0x04777777),
        const Color(0x11444444),
      ],
    ));
  });

  test('LinearGradient lerp test', () {
33
    const LinearGradient testGradient1 = const LinearGradient(
34 35
      begin: Alignment.topLeft,
      end: Alignment.bottomLeft,
36 37 38 39 40
      colors: const <Color>[
        const Color(0x33333333),
        const Color(0x66666666),
      ],
    );
41
    const LinearGradient testGradient2 = const LinearGradient(
42 43
      begin: Alignment.topRight,
      end: Alignment.topLeft,
44 45 46 47 48 49
      colors: const <Color>[
        const Color(0x44444444),
        const Color(0x88888888),
      ],
    );

50
    final LinearGradient actual = LinearGradient.lerp(testGradient1, testGradient2, 0.5);
51
    expect(actual, const LinearGradient(
52 53
      begin: const Alignment(0.0, -1.0),
      end: const Alignment(-1.0, 0.0),
54 55 56 57 58 59 60 61 62 63
      colors: const <Color>[
        const Color(0x3B3B3B3B),
        const Color(0x77777777),
      ],
    ));
  });

  test('LinearGradient toString', () {
    expect(
      const LinearGradient(
64 65
        begin: Alignment.topLeft,
        end: Alignment.bottomLeft,
66 67 68 69 70 71
        colors: const <Color>[
          const Color(0x33333333),
          const Color(0x66666666),
        ],
      ).toString(),
      equals(
72
        'LinearGradient(topLeft, bottomLeft, [Color(0x33333333), Color(0x66666666)], null, TileMode.clamp)',
73 74 75 76
      ),
    );
  });

77
  test('LinearGradient with AlignmentDirectional', () {
78 79 80
    expect(
      () {
        return const LinearGradient(
81
          begin: AlignmentDirectional.topStart,
82 83 84 85 86 87 88 89
          colors: const <Color>[ const Color(0xFFFFFFFF), const Color(0xFFFFFFFF) ]
        ).createShader(new Rect.fromLTWH(0.0, 0.0, 100.0, 100.0));
      },
      throwsAssertionError,
    );
    expect(
      () {
        return const LinearGradient(
90
          begin: AlignmentDirectional.topStart,
91 92 93 94 95 96 97 98
          colors: const <Color>[ const Color(0xFFFFFFFF), const Color(0xFFFFFFFF) ]
        ).createShader(new Rect.fromLTWH(0.0, 0.0, 100.0, 100.0), textDirection: TextDirection.rtl);
      },
      returnsNormally,
    );
    expect(
      () {
        return const LinearGradient(
99
          begin: AlignmentDirectional.topStart,
100 101 102 103 104 105 106 107
          colors: const <Color>[ const Color(0xFFFFFFFF), const Color(0xFFFFFFFF) ]
        ).createShader(new Rect.fromLTWH(0.0, 0.0, 100.0, 100.0), textDirection: TextDirection.ltr);
      },
      returnsNormally,
    );
    expect(
      () {
        return const LinearGradient(
108
          begin: Alignment.topLeft,
109 110 111 112 113 114 115
          colors: const <Color>[ const Color(0xFFFFFFFF), const Color(0xFFFFFFFF) ]
        ).createShader(new Rect.fromLTWH(0.0, 0.0, 100.0, 100.0));
      },
      returnsNormally,
    );
  });

116
  test('RadialGradient with AlignmentDirectional', () {
117 118 119
    expect(
      () {
        return const RadialGradient(
120
          center: AlignmentDirectional.topStart,
121 122 123 124 125 126 127 128
          colors: const <Color>[ const Color(0xFFFFFFFF), const Color(0xFFFFFFFF) ]
        ).createShader(new Rect.fromLTWH(0.0, 0.0, 100.0, 100.0));
      },
      throwsAssertionError,
    );
    expect(
      () {
        return const RadialGradient(
129
          center: AlignmentDirectional.topStart,
130 131 132 133 134 135 136 137
          colors: const <Color>[ const Color(0xFFFFFFFF), const Color(0xFFFFFFFF) ]
        ).createShader(new Rect.fromLTWH(0.0, 0.0, 100.0, 100.0), textDirection: TextDirection.rtl);
      },
      returnsNormally,
    );
    expect(
      () {
        return const RadialGradient(
138
          center: AlignmentDirectional.topStart,
139 140 141 142 143 144 145 146
          colors: const <Color>[ const Color(0xFFFFFFFF), const Color(0xFFFFFFFF) ]
        ).createShader(new Rect.fromLTWH(0.0, 0.0, 100.0, 100.0), textDirection: TextDirection.ltr);
      },
      returnsNormally,
    );
    expect(
      () {
        return const RadialGradient(
147
          center: Alignment.topLeft,
148 149 150 151 152 153
          colors: const <Color>[ const Color(0xFFFFFFFF), const Color(0xFFFFFFFF) ]
        ).createShader(new Rect.fromLTWH(0.0, 0.0, 100.0, 100.0));
      },
      returnsNormally,
    );
  });
154 155

  test('RadialGradient lerp test', () {
156
    const RadialGradient testGradient1 = const RadialGradient(
157 158 159 160 161 162 163
      center: Alignment.topLeft,
      radius: 20.0,
      colors: const <Color>[
        const Color(0x33333333),
        const Color(0x66666666),
      ],
    );
164
    const RadialGradient testGradient2 = const RadialGradient(
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
      center: Alignment.topRight,
      radius: 10.0,
      colors: const <Color>[
        const Color(0x44444444),
        const Color(0x88888888),
      ],
    );

    final RadialGradient actual = RadialGradient.lerp(testGradient1, testGradient2, 0.5);
    expect(actual, const RadialGradient(
      center: const Alignment(0.0, -1.0),
      radius: 15.0,
      colors: const <Color>[
        const Color(0x3B3B3B3B),
        const Color(0x77777777),
      ],
    ));
  });

  test('Gradient lerp test (with RadialGradient)', () {
185
    const RadialGradient testGradient1 = const RadialGradient(
186 187 188 189 190 191 192
      center: Alignment.topLeft,
      radius: 20.0,
      colors: const <Color>[
        const Color(0x33333333),
        const Color(0x66666666),
      ],
    );
193
    const RadialGradient testGradient2 = const RadialGradient(
194 195 196 197 198 199 200
      center: const Alignment(0.0, -1.0),
      radius: 15.0,
      colors: const <Color>[
        const Color(0x3B3B3B3B),
        const Color(0x77777777),
      ],
    );
201
    const RadialGradient testGradient3 = const RadialGradient(
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
      center: Alignment.topRight,
      radius: 10.0,
      colors: const <Color>[
        const Color(0x44444444),
        const Color(0x88888888),
      ],
    );

    expect(Gradient.lerp(testGradient1, testGradient3, 0.0), testGradient1);
    expect(Gradient.lerp(testGradient1, testGradient3, 0.5), testGradient2);
    expect(Gradient.lerp(testGradient1, testGradient3, 1.0), testGradient3);
    expect(Gradient.lerp(testGradient3, testGradient1, 0.0), testGradient3);
    expect(Gradient.lerp(testGradient3, testGradient1, 0.5), testGradient2);
    expect(Gradient.lerp(testGradient3, testGradient1, 1.0), testGradient1);
  });

  test('Gradient lerp test (LinearGradient to RadialGradient)', () {
219
    const LinearGradient testGradient1 = const LinearGradient(
220 221 222 223 224 225 226
      begin: Alignment.topLeft,
      end: Alignment.bottomRight,
      colors: const <Color>[
        const Color(0x33333333),
        const Color(0x66666666),
      ],
    );
227
    const RadialGradient testGradient2 = const RadialGradient(
228 229 230 231 232 233 234 235 236 237 238 239
      center: Alignment.center,
      radius: 20.0,
      colors: const <Color>[
        const Color(0x44444444),
        const Color(0x88888888),
      ],
    );

    expect(Gradient.lerp(testGradient1, testGradient2, 0.0), testGradient1);
    expect(Gradient.lerp(testGradient1, testGradient2, 1.0), testGradient2);
    expect(Gradient.lerp(testGradient1, testGradient2, 0.5), testGradient2.scale(0.0));
  });
240 241

  test('Gradients can handle missing stops and report mismatched stops', () {
242
    const LinearGradient test1a = const LinearGradient(
243 244 245 246 247 248
      colors: const <Color>[
        const Color(0x11111111),
        const Color(0x22222222),
        const Color(0x33333333),
      ],
    );
249
    const RadialGradient test1b = const RadialGradient(
250 251 252 253 254 255
      colors: const <Color>[
        const Color(0x11111111),
        const Color(0x22222222),
        const Color(0x33333333),
      ],
    );
256
    const LinearGradient test2a = const LinearGradient(
257 258 259 260 261 262 263
      colors: const <Color>[
        const Color(0x11111111),
        const Color(0x22222222),
        const Color(0x33333333),
      ],
      stops: const <double>[0.0, 1.0],
    );
264
    const RadialGradient test2b = const RadialGradient(
265 266 267 268 269 270 271 272 273 274 275 276 277
      colors: const <Color>[
        const Color(0x11111111),
        const Color(0x22222222),
        const Color(0x33333333),
      ],
      stops: const <double>[0.0, 1.0],
    );
    final Rect rect = new Rect.fromLTWH(1.0, 2.0, 3.0, 4.0);
    expect(test1a.createShader(rect), isNotNull);
    expect(test1b.createShader(rect), isNotNull);
    expect(() { test2a.createShader(rect); }, throwsArgumentError);
    expect(() { test2b.createShader(rect); }, throwsArgumentError);
  });
278
}