// Copyright 2015 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/rendering.dart';
import 'package:test/test.dart';

import 'rendering_tester.dart';

RenderBox sizedBox(double width, double height) {
  return new RenderConstrainedBox(
    additionalConstraints: new BoxConstraints.tight(new Size(width, height))
  );
}

void main() {
  test('Table control test; tight', () {
    RenderTable table;
    layout(table = new RenderTable());

    expect(table.size.width, equals(800.0));
    expect(table.size.height, equals(600.0));
  });

  test('Table control test; loose', () {
    RenderTable table;
    layout(new RenderPositionedBox(child: table = new RenderTable()));

    expect(table.size, equals(const Size(0.0, 0.0)));
  });

  test('Table test: combinations', () {
    RenderTable table;
    layout(new RenderPositionedBox(child: table = new RenderTable(
      columns: 5,
      rows: 5,
      defaultColumnWidth: const IntrinsicColumnWidth(),
      defaultVerticalAlignment: TableCellVerticalAlignment.baseline,
      textBaseline: TextBaseline.alphabetic
    )));

    expect(table.size, equals(const Size(0.0, 0.0)));

    table.setChild(2, 4, sizedBox(100.0, 200.0));

    pumpFrame();

    expect(table.size, equals(const Size(100.0, 200.0)));

    table.setChild(0, 0, sizedBox(10.0, 30.0));
    table.setChild(1, 0, sizedBox(20.0, 20.0));
    table.setChild(2, 0, sizedBox(30.0, 10.0));

    pumpFrame();

    expect(table.size, equals(const Size(130.0, 230.0)));
  });

  test('Table test: removing cells', () {
    RenderTable table;
    RenderBox child;
    table = new RenderTable(
      columns: 5,
      rows: 5
    );
    table.setChild(4, 4, child = sizedBox(10.0, 10.0));

    layout(table);

    expect(child.attached, isTrue);
    table.rows = 4;
    expect(child.attached, isFalse);
  });

  test('Table test: replacing cells', () {
    RenderTable table;
    RenderBox child1 = new RenderPositionedBox();
    RenderBox child2 = new RenderPositionedBox();
    RenderBox child3 = new RenderPositionedBox();
    table = new RenderTable();
    table.setFlatChildren(3, <RenderBox>[child1, new RenderPositionedBox(), child2,
                                         new RenderPositionedBox(), child3, new RenderPositionedBox()]);
    expect(table.rows, equals(2));
    layout(table);
    table.setFlatChildren(3, <RenderBox>[new RenderPositionedBox(), child1, new RenderPositionedBox(),
                                         child2, new RenderPositionedBox(), child3]);
    pumpFrame();
    table.setFlatChildren(3, <RenderBox>[new RenderPositionedBox(), child1, new RenderPositionedBox(),
                                         child2, new RenderPositionedBox(), child3]);
    pumpFrame();
    expect(table.columns, equals(3));
    expect(table.rows, equals(2));
  });
}