/*
 * Copyright (c) 2014, 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.
 */
/**
 * @assertion
 * @description
 */
import "dart:html";
import "../../testharness.dart";

const String htmlEL1 = r'''
    <style>
        body {
            margin: 5px;
        }
        table {
            border-collapse: collapse;
        }
        td {
            background: skyblue;
            border: 1px solid black;
        }
        #measure {
            position: absolute;
            top: -500px;
            visibility: hidden;
        }
    </style>
''';

const String htmlEL2 = r'''
    <table id="main" cellspacing="0" border="0" cellpadding="0">
        <tr>
            <td>style.height</td>
            <td>rect.height</td>
            <td>rect.bottom - rect.top</td>
        </tr>
        <tr><td>a</td><td>b</td><td>c</td></tr>
        <tr><td>a</td><td>b</td><td>c</td></tr>
        <tr><td>a</td><td>b</td><td>c</td></tr>
        <tr><td>a</td><td>b</td><td>c</td></tr>
        <tr><td>a</td><td>b</td><td>c</td></tr>
        <tr><td>a</td><td>b</td><td>c</td></tr>
        <tr><td>a</td><td>b</td><td>c</td></tr>
        <tr><td>a</td><td>b</td><td>c</td></tr>
        <tr><td>a</td><td>b</td><td>c</td></tr>
    </table>
    <p>
        This tests whether table row heights are stable by measuring the
        height of a row, assigning that height to another row and then
        measuring it.
        For each row the numbers in the three cells should be the same.
    </p>
    <p>
        <a href="https://bugs.webkit.org/show_bug.cgi?id=88813">Bug 88813</a>
    </p>

    <table id="measure" cellspacing="0" border="0" cellpadding="0">
        <tr><td>Measurement</td><td>table</td><td>...</td></tr>
    </table>
''';

double r(n) {
    return (n * 1000).round() / 1000;
}

void main() {
    document.head.appendHtml(htmlEL1, treeSanitizer: new NullTreeSanitizer());
    document.body.appendHtml(htmlEL2, treeSanitizer: new NullTreeSanitizer());

    var mainTable = document.getElementById('main');
    var measureTable = document.getElementById('measure');
    var rowHeights = [];

    void computeHeights() {
        rowHeights.length = 0;
        var rowElement = measureTable.tBodies[0].rows[0];
        for (var i = 0; i < mainTable.tBodies[0].rows.length; i++) {
            // Set the size to a subpixel value, the exact value isn't
            // important but each row should have a different height.
            var height = r((20 + i) * 0.93 + i);
            rowElement.style.height = '${height}px';
            var rect = rowElement.getBoundingClientRect();
            rowHeights.add(rect.bottom - rect.top);
        }
    }

    void testHeights(zoom) {
        document.body.style.zoom = zoom.toString();
        computeHeights();
print("testHeights 1");
        var rows = mainTable.tBodies[0].rows;
        for (var i = 0; i < rows.length; i++) {
            var rowElement = rows[i];
print("testHeights 2 $i");
            rowElement.style.height = '${rowHeights[i]}px';
print("testHeights 3 $i");
            var rect = rowElement.getBoundingClientRect();
            if (i>0) {
print("testHeights 4 $i");
                rowElement.cells[0].firstChild.text = r(rowHeights[i]).toString();
                rowElement.cells[1].firstChild.text = r(rect.height).toString();
                rowElement.cells[2].firstChild.text = r(rect.bottom - rect.top).toString();
            }
        }

        for (var i = 0; i < rows.length; i++) {
            var rect = rows[i].getBoundingClientRect();
            shouldBe(r(rowHeights[i]), r(rect.height), 'rect.height at ${r(zoom * 100)}');
            shouldBe(r(rowHeights[i]), r(rect.bottom - rect.top), 'rect.bottom - rect.top at ${r(zoom * 100)}');
        }
    }

    testHeights(0.5);
    testHeights(0.75);
    testHeights(0.9);
    testHeights(1.1);
    testHeights(1.25);
    testHeights(1.33);
    testHeights(1.5);
    testHeights(1.75);
    testHeights(2);
    testHeights(1);

    checkTestFailures();
}
