// Copyright 2013 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.

// @dart = 2.6
import 'dart:ui';

import 'package:test/test.dart';

void main() {
  test('Gradient.radial with no focal point', () {
    expect(
      Gradient.radial(
          Offset.zero,
          null,
          <Color>[const Color(0xFFFFFFFF), const Color(0xFFFFFFFF)],
          <double>[0.0, 1.0],
          TileMode.mirror),
      isNotNull,
    );
  });

  // this is just a radial gradient, focal point is discarded.
  test('radial center and focal == Offset.zero and focalRadius == 0.0 is ok',
      () {
    expect(
        () => Gradient.radial(
              Offset.zero,
              0.0,
              <Color>[const Color(0xFFFFFFFF), const Color(0xFFFFFFFF)],
              <double>[0.0, 1.0],
              TileMode.mirror,
              null,
              Offset.zero,
              0.0,
            ),
        isNotNull);
  });

  test('radial center != focal and focalRadius == 0.0 is ok', () {
    expect(
        () => Gradient.radial(
              Offset.zero,
              0.0,
              <Color>[const Color(0xFFFFFFFF), const Color(0xFFFFFFFF)],
              <double>[0.0, 1.0],
              TileMode.mirror,
              null,
              const Offset(2.0, 2.0),
              0.0,
            ),
        isNotNull);
  });

  // this would result in div/0 on skia side.
  test('radial center and focal == Offset.zero and focalRadius != 0.0 assert',
    () {
      assert(() {
        expect(
          () => Gradient.radial(
                Offset.zero,
                0.0,
                <Color>[const Color(0xFFFFFFFF), const Color(0xFFFFFFFF)],
                <double>[0.0, 1.0],
                TileMode.mirror,
                null,
                Offset.zero,
                1.0,
              ),
          throwsA(const TypeMatcher<AssertionError>()),
        );
        return true;
      }());
  });
}
