// 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)');
  });
}
