gradient_test.dart 19.1 KB
Newer Older
1 2 3
// 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.
4
import 'dart:math' as math;
5 6 7 8 9 10

import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/painting.dart';

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

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

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

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

63
  test('LinearGradient lerp test with stops', () {
64
    const LinearGradient testGradient1 = LinearGradient(
65 66
      begin: Alignment.topLeft,
      end: Alignment.bottomLeft,
67 68 69
      colors: <Color>[
        Color(0x33333333),
        Color(0x66666666),
70
      ],
71
      stops: <double>[
72 73 74 75
        0.0,
        0.5,
      ],
    );
76
    const LinearGradient testGradient2 = LinearGradient(
77 78
      begin: Alignment.topRight,
      end: Alignment.topLeft,
79 80 81
      colors: <Color>[
        Color(0x44444444),
        Color(0x88888888),
82
      ],
83
      stops: <double>[
84 85 86 87 88 89 90
        0.5,
        1.0,
      ],
    );

    final LinearGradient actual = LinearGradient.lerp(testGradient1, testGradient2, 0.5);
    expect(actual, const LinearGradient(
91 92 93 94
      begin: Alignment(0.0, -1.0),
      end: Alignment(-1.0, 0.0),
      colors: <Color>[
        Color(0x3B3B3B3B),
95
        Color(0x55555555),
96
        Color(0x77777777),
97
      ],
98
      stops: <double>[
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
        0.0,
        0.5,
        1.0,
      ],
    ));
  });

  test('LinearGradient lerp test with unequal number of colors', () {
    const LinearGradient testGradient1 = LinearGradient(
      colors: <Color>[
        Color(0x22222222),
        Color(0x66666666),
      ],
    );
    const LinearGradient testGradient2 = LinearGradient(
      colors: <Color>[
        Color(0x44444444),
        Color(0x66666666),
        Color(0x88888888),
      ],
    );

    final LinearGradient actual = LinearGradient.lerp(testGradient1, testGradient2, 0.5);
    expect(actual, const LinearGradient(
      colors: <Color>[
        Color(0x33333333),
        Color(0x55555555),
        Color(0x77777777),
      ],
      stops: <double>[
        0.0,
        0.5,
        1.0,
      ],
    ));
  });

  test('LinearGradient lerp test with stops and unequal number of colors', () {
    const LinearGradient testGradient1 = LinearGradient(
      colors: <Color>[
        Color(0x33333333),
        Color(0x66666666),
      ],
      stops: <double>[
        0.0,
        0.5,
      ],
    );
    const LinearGradient testGradient2 = LinearGradient(
      colors: <Color>[
        Color(0x44444444),
        Color(0x48484848),
        Color(0x88888888),
      ],
      stops: <double>[
        0.5,
        0.7,
        1.0,
      ],
    );

    final LinearGradient actual = LinearGradient.lerp(testGradient1, testGradient2, 0.5);
    expect(actual, const LinearGradient(
      colors: <Color>[
        Color(0x3B3B3B3B),
        Color(0x55555555),
        Color(0x57575757),
        Color(0x77777777),
      ],
      stops: <double>[
        0.0,
        0.5,
        0.7,
        1.0,
173 174 175 176
      ],
    ));
  });

177 178 179
  test('LinearGradient toString', () {
    expect(
      const LinearGradient(
180 181
        begin: Alignment.topLeft,
        end: Alignment.bottomLeft,
182 183 184
        colors: <Color>[
          Color(0x33333333),
          Color(0x66666666),
185 186 187
        ],
      ).toString(),
      equals(
188
        'LinearGradient(topLeft, bottomLeft, [Color(0x33333333), Color(0x66666666)], null, TileMode.clamp)',
189 190 191 192
      ),
    );
  });

193
  test('LinearGradient with AlignmentDirectional', () {
194 195 196
    expect(
      () {
        return const LinearGradient(
197
          begin: AlignmentDirectional.topStart,
198
          colors: <Color>[ Color(0xFFFFFFFF), Color(0xFFFFFFFF) ],
Dan Field's avatar
Dan Field committed
199
        ).createShader(const Rect.fromLTWH(0.0, 0.0, 100.0, 100.0));
200 201 202 203 204 205
      },
      throwsAssertionError,
    );
    expect(
      () {
        return const LinearGradient(
206
          begin: AlignmentDirectional.topStart,
207
          colors: <Color>[ Color(0xFFFFFFFF), Color(0xFFFFFFFF) ],
Dan Field's avatar
Dan Field committed
208
        ).createShader(const Rect.fromLTWH(0.0, 0.0, 100.0, 100.0), textDirection: TextDirection.rtl);
209 210 211 212 213 214
      },
      returnsNormally,
    );
    expect(
      () {
        return const LinearGradient(
215
          begin: AlignmentDirectional.topStart,
216
          colors: <Color>[ Color(0xFFFFFFFF), Color(0xFFFFFFFF) ],
Dan Field's avatar
Dan Field committed
217
        ).createShader(const Rect.fromLTWH(0.0, 0.0, 100.0, 100.0), textDirection: TextDirection.ltr);
218 219 220 221 222 223
      },
      returnsNormally,
    );
    expect(
      () {
        return const LinearGradient(
224
          begin: Alignment.topLeft,
225
          colors: <Color>[ Color(0xFFFFFFFF), Color(0xFFFFFFFF) ],
Dan Field's avatar
Dan Field committed
226
        ).createShader(const Rect.fromLTWH(0.0, 0.0, 100.0, 100.0));
227 228 229 230 231
      },
      returnsNormally,
    );
  });

232
  test('RadialGradient with AlignmentDirectional', () {
233 234 235
    expect(
      () {
        return const RadialGradient(
236
          center: AlignmentDirectional.topStart,
237
          colors: <Color>[ Color(0xFFFFFFFF), Color(0xFFFFFFFF) ],
Dan Field's avatar
Dan Field committed
238
        ).createShader(const Rect.fromLTWH(0.0, 0.0, 100.0, 100.0));
239 240 241
      },
      throwsAssertionError,
    );
242

243 244 245
    expect(
      () {
        return const RadialGradient(
246
          center: AlignmentDirectional.topStart,
247
          colors: <Color>[ Color(0xFFFFFFFF), Color(0xFFFFFFFF) ],
Dan Field's avatar
Dan Field committed
248
        ).createShader(const Rect.fromLTWH(0.0, 0.0, 100.0, 100.0), textDirection: TextDirection.rtl);
249 250 251 252 253 254
      },
      returnsNormally,
    );
    expect(
      () {
        return const RadialGradient(
255
          center: AlignmentDirectional.topStart,
256
          colors: <Color>[ Color(0xFFFFFFFF), Color(0xFFFFFFFF) ],
Dan Field's avatar
Dan Field committed
257
        ).createShader(const Rect.fromLTWH(0.0, 0.0, 100.0, 100.0), textDirection: TextDirection.ltr);
258 259 260 261 262 263
      },
      returnsNormally,
    );
    expect(
      () {
        return const RadialGradient(
264
          center: Alignment.topLeft,
265
          colors: <Color>[ Color(0xFFFFFFFF), Color(0xFFFFFFFF) ],
Dan Field's avatar
Dan Field committed
266
        ).createShader(const Rect.fromLTWH(0.0, 0.0, 100.0, 100.0));
267 268 269 270
      },
      returnsNormally,
    );
  });
271 272

  test('RadialGradient lerp test', () {
273
    const RadialGradient testGradient1 = RadialGradient(
274 275
      center: Alignment.topLeft,
      radius: 20.0,
276 277 278
      colors: <Color>[
        Color(0x33333333),
        Color(0x66666666),
279 280
      ],
    );
281
    const RadialGradient testGradient2 = RadialGradient(
282 283
      center: Alignment.topRight,
      radius: 10.0,
284 285 286
      colors: <Color>[
        Color(0x44444444),
        Color(0x88888888),
287 288 289 290 291
      ],
    );

    final RadialGradient actual = RadialGradient.lerp(testGradient1, testGradient2, 0.5);
    expect(actual, const RadialGradient(
292
      center: Alignment(0.0, -1.0),
293
      radius: 15.0,
294 295 296
      colors: <Color>[
        Color(0x3B3B3B3B),
        Color(0x77777777),
297
      ],
298 299 300 301
      stops: <double>[
        0.0,
        1.0,
      ],
302 303 304
    ));
  });

305
  test('RadialGradient lerp test with stops', () {
306
    const RadialGradient testGradient1 = RadialGradient(
307 308
      center: Alignment.topLeft,
      radius: 20.0,
309 310 311
      colors: <Color>[
        Color(0x33333333),
        Color(0x66666666),
312
      ],
313
      stops: <double>[
314 315 316 317
        0.0,
        0.5,
      ],
    );
318
    const RadialGradient testGradient2 = RadialGradient(
319 320
      center: Alignment.topRight,
      radius: 10.0,
321 322 323
      colors: <Color>[
        Color(0x44444444),
        Color(0x88888888),
324
      ],
325
      stops: <double>[
326 327 328 329 330 331
        0.5,
        1.0,
      ],
    );

    final RadialGradient actual = RadialGradient.lerp(testGradient1, testGradient2, 0.5);
332

333
    expect(actual.focal, isNull);
334

335
    expect(actual, const RadialGradient(
336
      center: Alignment(0.0, -1.0),
337
      radius: 15.0,
338 339
      colors: <Color>[
        Color(0x3B3B3B3B),
340 341 342 343 344 345
        Color(0x55555555),
        Color(0x77777777),
      ],
      stops: <double>[
        0.0,
        0.5,
346
        1.0,
347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410
      ],
    ));
  });

  test('RadialGradient lerp test with unequal number of colors', () {
    const RadialGradient testGradient1 = RadialGradient(
      colors: <Color>[
        Color(0x22222222),
        Color(0x66666666),
      ],
    );
    const RadialGradient testGradient2 = RadialGradient(
      colors: <Color>[
        Color(0x44444444),
        Color(0x66666666),
        Color(0x88888888),
      ],
    );

    final RadialGradient actual = RadialGradient.lerp(testGradient1, testGradient2, 0.5);
    expect(actual, const RadialGradient(
      colors: <Color>[
        Color(0x33333333),
        Color(0x55555555),
        Color(0x77777777),
      ],
      stops: <double>[
        0.0,
        0.5,
        1.0,
      ],
    ));
  });

  test('RadialGradient lerp test with stops and unequal number of colors', () {
    const RadialGradient testGradient1 = RadialGradient(
      colors: <Color>[
        Color(0x33333333),
        Color(0x66666666),
      ],
      stops: <double>[
        0.0,
        0.5,
      ],
    );
    const RadialGradient testGradient2 = RadialGradient(
      colors: <Color>[
        Color(0x44444444),
        Color(0x48484848),
        Color(0x88888888),
      ],
      stops: <double>[
        0.5,
        0.7,
        1.0,
      ],
    );

    final RadialGradient actual = RadialGradient.lerp(testGradient1, testGradient2, 0.5);
    expect(actual, const RadialGradient(
      colors: <Color>[
        Color(0x3B3B3B3B),
        Color(0x55555555),
        Color(0x57575757),
411
        Color(0x77777777),
412
      ],
413
      stops: <double>[
414 415 416 417
        0.0,
        0.5,
        0.7,
        1.0,
418 419 420 421
      ],
    ));
  });

422
  test('RadialGradient lerp test with focal', () {
423
    const RadialGradient testGradient1 = RadialGradient(
424 425 426 427
      center: Alignment.topLeft,
      focal: Alignment.centerLeft,
      radius: 20.0,
      focalRadius: 10.0,
428 429 430
      colors: <Color>[
        Color(0x33333333),
        Color(0x66666666),
431 432
      ],
    );
433
    const RadialGradient testGradient2 = RadialGradient(
434 435 436 437
      center: Alignment.topRight,
      focal: Alignment.centerRight,
      radius: 10.0,
      focalRadius: 5.0,
438 439 440
      colors: <Color>[
        Color(0x44444444),
        Color(0x88888888),
441 442
      ],
    );
443
    const RadialGradient testGradient3 = RadialGradient(
444 445
      center: Alignment.topRight,
      radius: 10.0,
446 447 448
      colors: <Color>[
        Color(0x44444444),
        Color(0x88888888),
449 450 451 452 453
      ],
    );

    final RadialGradient actual = RadialGradient.lerp(testGradient1, testGradient2, 0.5);
    expect(actual, const RadialGradient(
454 455
      center: Alignment(0.0, -1.0),
      focal: Alignment(0.0, 0.0),
456 457
      radius: 15.0,
      focalRadius: 7.5,
458 459 460
      colors: <Color>[
        Color(0x3B3B3B3B),
        Color(0x77777777),
461
      ],
462 463 464 465
      stops: <double>[
        0.0,
        1.0,
      ],
466 467 468 469
    ));

    final RadialGradient actual2 = RadialGradient.lerp(testGradient1, testGradient3, 0.5);
    expect(actual2, const RadialGradient(
470 471
      center: Alignment(0.0, -1.0),
      focal: Alignment(-0.5, 0.0),
472 473
      radius: 15.0,
      focalRadius: 5.0,
474 475 476
      colors: <Color>[
        Color(0x3B3B3B3B),
        Color(0x77777777),
477
      ],
478 479 480 481
      stops: <double>[
        0.0,
        1.0,
      ],
482 483
    ));
  });
484

485
  test('SweepGradient lerp test', () {
486
    const SweepGradient testGradient1 = SweepGradient(
487 488 489
      center: Alignment.topLeft,
      startAngle: 0.0,
      endAngle: math.pi / 2,
490 491 492
      colors: <Color>[
        Color(0x33333333),
        Color(0x66666666),
493 494
      ],
    );
495
    const SweepGradient testGradient2 = SweepGradient(
496 497 498
      center: Alignment.topRight,
      startAngle: math.pi / 2,
      endAngle: math.pi,
499 500 501
      colors: <Color>[
        Color(0x44444444),
        Color(0x88888888),
502 503 504 505 506
      ],
    );

    final SweepGradient actual = SweepGradient.lerp(testGradient1, testGradient2, 0.5);
    expect(actual, const SweepGradient(
507
      center: Alignment(0.0, -1.0),
508 509
      startAngle: math.pi / 4,
      endAngle: math.pi * 3/4,
510 511 512
      colors: <Color>[
        Color(0x3B3B3B3B),
        Color(0x77777777),
513
      ],
514 515 516 517
      stops: <double>[
        0.0,
        1.0,
      ],
518 519 520 521
    ));
  });

  test('SweepGradient lerp test with stops', () {
522
    const SweepGradient testGradient1 = SweepGradient(
523 524 525
      center: Alignment.topLeft,
      startAngle: 0.0,
      endAngle: math.pi / 2,
526 527 528
      colors: <Color>[
        Color(0x33333333),
        Color(0x66666666),
529
      ],
530
      stops: <double>[
531 532 533 534
        0.0,
        0.5,
      ],
    );
535
    const SweepGradient testGradient2 = SweepGradient(
536 537 538
      center: Alignment.topRight,
      startAngle: math.pi / 2,
      endAngle:  math.pi,
539 540 541
      colors: <Color>[
        Color(0x44444444),
        Color(0x88888888),
542
      ],
543
      stops: <double>[
544 545 546 547 548 549 550
        0.5,
        1.0,
      ],
    );

    final SweepGradient actual = SweepGradient.lerp(testGradient1, testGradient2, 0.5);
    expect(actual, const SweepGradient(
551
      center: Alignment(0.0, -1.0),
552 553
      startAngle: math.pi / 4,
      endAngle: math.pi * 3/4,
554 555
      colors: <Color>[
        Color(0x3B3B3B3B),
556
        Color(0x55555555),
557
        Color(0x77777777),
558
      ],
559
      stops: <double>[
560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633
        0.0,
        0.5,
        1.0,
      ],
    ));
  });

  test('SweepGradient lerp test with unequal number of colors', () {
    const SweepGradient testGradient1 = SweepGradient(
      colors: <Color>[
        Color(0x22222222),
        Color(0x66666666),
      ],
    );
    const SweepGradient testGradient2 = SweepGradient(
      colors: <Color>[
        Color(0x44444444),
        Color(0x66666666),
        Color(0x88888888),
      ],
    );

    final SweepGradient actual = SweepGradient.lerp(testGradient1, testGradient2, 0.5);
    expect(actual, const SweepGradient(
      colors: <Color>[
        Color(0x33333333),
        Color(0x55555555),
        Color(0x77777777),
      ],
      stops: <double>[
        0.0,
        0.5,
        1.0,
      ],
    ));
  });

  test('SweepGradient lerp test with stops and unequal number of colors', () {
    const SweepGradient testGradient1 = SweepGradient(
      colors: <Color>[
        Color(0x33333333),
        Color(0x66666666),
      ],
      stops: <double>[
        0.0,
        0.5,
      ],
    );
    const SweepGradient testGradient2 = SweepGradient(
      colors: <Color>[
        Color(0x44444444),
        Color(0x48484848),
        Color(0x88888888),
      ],
      stops: <double>[
        0.5,
        0.7,
        1.0,
      ],
    );

    final SweepGradient actual = SweepGradient.lerp(testGradient1, testGradient2, 0.5);
    expect(actual, const SweepGradient(
      colors: <Color>[
        Color(0x3B3B3B3B),
        Color(0x55555555),
        Color(0x57575757),
        Color(0x77777777),
      ],
      stops: <double>[
        0.0,
        0.5,
        0.7,
        1.0,
634 635 636 637 638
      ],
    ));
  });

  test('SweepGradient scale test)', () {
639
    const SweepGradient testGradient = SweepGradient(
640 641 642
      center: Alignment.topLeft,
      startAngle: 0.0,
      endAngle: math.pi / 2,
643 644 645
      colors: <Color>[
        Color(0xff333333),
        Color(0xff666666),
646 647
      ],
    );
648

649
    final SweepGradient actual = testGradient.scale(0.5);
650

651 652 653 654
    expect(actual, const SweepGradient(
      center: Alignment.topLeft,
      startAngle: 0.0,
      endAngle: math.pi / 2,
655 656 657
      colors: <Color>[
        Color(0x80333333),
        Color(0x80666666),
658 659 660 661
      ],
    ));
  });

662
  test('Gradient lerp test (with RadialGradient)', () {
663
    const RadialGradient testGradient1 = RadialGradient(
664 665
      center: Alignment.topLeft,
      radius: 20.0,
666 667 668
      colors: <Color>[
        Color(0x33333333),
        Color(0x66666666),
669
      ],
670 671 672 673
      stops: <double>[
        0.0,
        1.0,
      ],
674
    );
675 676
    const RadialGradient testGradient2 = RadialGradient(
      center: Alignment(0.0, -1.0),
677
      radius: 15.0,
678 679 680
      colors: <Color>[
        Color(0x3B3B3B3B),
        Color(0x77777777),
681
      ],
682 683 684 685
      stops: <double>[
        0.0,
        1.0,
      ],
686
    );
687
    const RadialGradient testGradient3 = RadialGradient(
688 689
      center: Alignment.topRight,
      radius: 10.0,
690 691 692
      colors: <Color>[
        Color(0x44444444),
        Color(0x88888888),
693
      ],
694 695 696 697
      stops: <double>[
        0.0,
        1.0,
      ],
698 699 700 701 702 703 704 705 706 707 708
    );

    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)', () {
709
    const LinearGradient testGradient1 = LinearGradient(
710 711
      begin: Alignment.topLeft,
      end: Alignment.bottomRight,
712 713 714
      colors: <Color>[
        Color(0x33333333),
        Color(0x66666666),
715 716
      ],
    );
717
    const RadialGradient testGradient2 = RadialGradient(
718 719
      center: Alignment.center,
      radius: 20.0,
720 721 722
      colors: <Color>[
        Color(0x44444444),
        Color(0x88888888),
723 724 725 726 727 728 729
      ],
    );

    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));
  });
730 731

  test('Gradients can handle missing stops and report mismatched stops', () {
732 733 734 735 736
    const LinearGradient test1a = LinearGradient(
      colors: <Color>[
        Color(0x11111111),
        Color(0x22222222),
        Color(0x33333333),
737 738
      ],
    );
739 740 741 742 743
    const RadialGradient test1b = RadialGradient(
      colors: <Color>[
        Color(0x11111111),
        Color(0x22222222),
        Color(0x33333333),
744 745
      ],
    );
746 747 748 749 750
    const LinearGradient test2a = LinearGradient(
      colors: <Color>[
        Color(0x11111111),
        Color(0x22222222),
        Color(0x33333333),
751
      ],
752
      stops: <double>[0.0, 1.0],
753
    );
754 755 756 757 758
    const RadialGradient test2b = RadialGradient(
      colors: <Color>[
        Color(0x11111111),
        Color(0x22222222),
        Color(0x33333333),
759
      ],
760
      stops: <double>[0.0, 1.0],
761
    );
Dan Field's avatar
Dan Field committed
762
    const Rect rect = Rect.fromLTWH(1.0, 2.0, 3.0, 4.0);
763 764 765 766 767
    expect(test1a.createShader(rect), isNotNull);
    expect(test1b.createShader(rect), isNotNull);
    expect(() { test2a.createShader(rect); }, throwsArgumentError);
    expect(() { test2b.createShader(rect); }, throwsArgumentError);
  });
768
}