// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. 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.9

import 'dart:html';

import 'package:expect/minitest.dart';

main() {
  test('createTBody', () {
    var table = new TableElement();
    var head = table.createTHead();
    expect(table.tHead, head);

    var headerRow = head.addRow();
    var headerCell = headerRow.addCell();
    headerCell.text = 'Header Cell';

    var caption = table.createCaption();
    expect(table.caption, caption);

    var body = table.createTBody();
    expect(table.tBodies.length, 1);
    expect(table.tBodies[0], body);

    var bodyRow = body.addRow();
    expect(body.rows.length, 1);
    expect(body.rows[0], bodyRow);

    var bodyCell = bodyRow.addCell();
    bodyCell.text = 'Body Cell';
    expect(bodyRow.cells.length, 1);
    expect(bodyRow.cells[0], bodyCell);

    var foot = table.createTFoot();
    expect(table.tFoot, foot);

    var footerRow = foot.addRow();
    expect(foot.rows.length, 1);
    expect(foot.rows[0], footerRow);

    var footerCell = footerRow.addCell();
    footerCell.text = 'Footer Cell';
    expect(footerRow.cells.length, 1);
    expect(footerRow.cells[0], footerCell);

    var body2 = table.createTBody();
    var bodyRow2 = body2.addRow();
    var bodyCell2 = bodyRow2.addCell();
    bodyCell2.text = 'Body Cell2';

    expect(body2.rows.length, 1);

    expect(table.tBodies.length, 2);
    expect(table.tBodies[1], body2);
  });
}
