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

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

void main() {
  test('TableBorder constructor', () {
    const TableBorder border1 = TableBorder(
      left: BorderSide(width: 1.0),
      right: BorderSide(color: Color(0xFF00FF00)),
      verticalInside: BorderSide(),
    );
    expect(border1.top, BorderSide.none);
    expect(border1.right, const BorderSide(color: Color(0xFF00FF00)));
    expect(border1.bottom, BorderSide.none);
    expect(border1.left, const BorderSide(width: 1.0));
    expect(border1.horizontalInside, BorderSide.none);
    expect(border1.verticalInside, const BorderSide(width: 1.0, color: Color(0xFF000000)));
    expect(border1.dimensions, const EdgeInsets.symmetric(horizontal: 1.0));
    expect(border1.isUniform, isFalse);
    expect(border1.scale(2.0), const TableBorder(
      left: BorderSide(width: 2.0),
      right: BorderSide(width: 2.0, color: Color(0xFF00FF00)),
      verticalInside: BorderSide(width: 2.0),
    ));
  });

  test('TableBorder.all constructor', () {
    final TableBorder border2 = TableBorder.all(
      width: 2.0,
      color: const Color(0xFF00FFFF),
    );
    expect(border2.top, const BorderSide(width: 2.0, color: Color(0xFF00FFFF)));
    expect(border2.right, const BorderSide(width: 2.0, color: Color(0xFF00FFFF)));
    expect(border2.bottom, const BorderSide(width: 2.0, color: Color(0xFF00FFFF)));
    expect(border2.left, const BorderSide(width: 2.0, color: Color(0xFF00FFFF)));
    expect(border2.horizontalInside, const BorderSide(width: 2.0, color: Color(0xFF00FFFF)));
    expect(border2.verticalInside, const BorderSide(width: 2.0, color: Color(0xFF00FFFF)));
    expect(border2.dimensions, const EdgeInsets.symmetric(horizontal: 2.0, vertical: 2.0));
    expect(border2.isUniform, isTrue);
    expect(border2.scale(0.5), TableBorder.all(color: const Color(0xFF00FFFF)));
  });

  test('TableBorder.symmetric constructor', () {
    final TableBorder border3 = TableBorder.symmetric(
      inside: const BorderSide(width: 3.0),
      outside: const BorderSide(color: Color(0xFFFF0000)),
    );
    expect(border3.top, const BorderSide(color: Color(0xFFFF0000)));
    expect(border3.right, const BorderSide(color: Color(0xFFFF0000)));
    expect(border3.bottom, const BorderSide(color: Color(0xFFFF0000)));
    expect(border3.left, const BorderSide(color: Color(0xFFFF0000)));
    expect(border3.horizontalInside, const BorderSide(width: 3.0));
    expect(border3.verticalInside, const BorderSide(width: 3.0));
    expect(border3.dimensions, const EdgeInsets.symmetric(horizontal: 1.0, vertical: 1.0));
    expect(border3.isUniform, isFalse);
    expect(border3.scale(0.0), TableBorder.symmetric(
      inside: const BorderSide(width: 0.0, style: BorderStyle.none),
      outside: const BorderSide(width: 0.0, color: Color(0xFFFF0000), style: BorderStyle.none),
    ));
  });

  test('TableBorder.lerp', () {
    const BorderSide side1 = BorderSide(width: 1.0, color: Color(0x00000001));
    const BorderSide side2 = BorderSide(width: 2.0, color: Color(0x00000002));
    const BorderSide side3 = BorderSide(width: 3.0, color: Color(0x00000003));
    const BorderSide side4 = BorderSide(width: 4.0, color: Color(0x00000004));
    const BorderSide side5 = BorderSide(width: 5.0, color: Color(0x00000005));
    const BorderSide side6 = BorderSide(width: 6.0, color: Color(0x00000006));
    const TableBorder tableA = TableBorder(
      top: side1,
      right: side2,
      bottom: side3,
      left: side4,
      horizontalInside: side5,
      verticalInside: side6,
    );
    expect(tableA.isUniform, isFalse);
    expect(tableA.dimensions, const EdgeInsets.fromLTRB(4.0, 1.0, 2.0, 3.0));
    final TableBorder tableB = TableBorder(
      top: side1.scale(2.0),
      right: side2.scale(2.0),
      bottom: side3.scale(2.0),
      left: side4.scale(2.0),
      horizontalInside: side5.scale(2.0),
      verticalInside: side6.scale(2.0),
    );
    expect(tableB.isUniform, isFalse);
    expect(tableB.dimensions, const EdgeInsets.fromLTRB(4.0, 1.0, 2.0, 3.0) * 2.0);
    final TableBorder tableC = TableBorder(
      top: side1.scale(3.0),
      right: side2.scale(3.0),
      bottom: side3.scale(3.0),
      left: side4.scale(3.0),
      horizontalInside: side5.scale(3.0),
      verticalInside: side6.scale(3.0),
    );
    expect(tableC.isUniform, isFalse);
    expect(tableC.dimensions, const EdgeInsets.fromLTRB(4.0, 1.0, 2.0, 3.0) * 3.0);
    expect(TableBorder.lerp(tableA, tableC, 0.5), tableB);
    expect(TableBorder.lerp(tableA, tableB, 2.0), tableC);
    expect(TableBorder.lerp(tableB, tableC, -1.0), tableA);
    expect(TableBorder.lerp(tableA, tableC, 0.9195)!.isUniform, isFalse);
    expect(TableBorder.lerp(tableA, tableC, 0.9195)!.dimensions,
           EdgeInsets.lerp(tableA.dimensions, tableC.dimensions, 0.9195));
  });

  test('TableBorder.lerp with nulls', () {
    final TableBorder table2 = TableBorder.all(width: 2.0);
    final TableBorder table1 = TableBorder.all(width: 1.0);
    expect(TableBorder.lerp(table2, null, 0.5), table1);
    expect(TableBorder.lerp(null, table2, 0.5), table1);
    expect(TableBorder.lerp(null, null, 0.5), null);
  });

  test('TableBorder Object API', () {
    expect(const TableBorder(), isNot(1.0));
    expect(const TableBorder().hashCode, isNot(const TableBorder(top: BorderSide(width: 0.0)).hashCode));
  });

  test('TableBorder Object API', () {
    final String none = BorderSide.none.toString();
    expect(const TableBorder().toString(), 'TableBorder($none, $none, $none, $none, $none, $none)');
  });
}
