/*
 * 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 "dart:math" as Math;
import "../../../testharness.dart";
import "../resources/subpixel-utils.dart" as SubPixelLayout;

const String htmlEL1 = r'''
<style>
#container {
    width: 300px;
    font: 20px/1 Ahem;
    color: green;
}

#float {
    float: left;
    width: 100px;
    height: 100px;
    border-radius: 100px 0px;
    background-color: blue;
    background-clip: border-box;
    shape-outside: border-box;
}
</style>
''';

const String htmlEL2 = r'''
    <p>The green squares should follow the right side of the blue shape. They should not overlap the shape.</p>
    <div id="container">
        <div id="float"></div>
        <span id="a">X</span><br>
        <span id="b">X</span><br>
        <span id="c">X</span><br>
        <span id="d">X</span><br>
        <span id="e">X</span><br>
        <span id="f">X</span>
    </div>
    <div id="console"></div>
''';

Rectangle elementRect(elementId) {
    Rectangle s = document.getElementById("container").getBoundingClientRect();
    Rectangle r = document.getElementById(elementId).getBoundingClientRect();
    return new Rectangle(r.left - s.left, r.top - s.top, r.width, r.height);
}

int borderXIntercept(y) {
    int radiusSquared = 100 * 100;
    int f = SubPixelLayout.snapToLayoutUnit(Math.sqrt(radiusSquared - y * y));
    return f + 20;  // will be compared with the right edge of a 20x20 Ahem char cell
}

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

    shouldBe(elementRect('a').top, 0);
    shouldBe(elementRect('a').right, 120);

    shouldBe(elementRect('b').top, 20);
    shouldBeCloseTo(elementRect('b').right, borderXIntercept(20), 1);

    shouldBe(elementRect('c').top, 40);
    shouldBeCloseTo(elementRect('c').right, borderXIntercept(40), 1);

    shouldBe(elementRect('d').top, 60);
    shouldBeCloseTo(elementRect('d').right, borderXIntercept(60), 1);

    shouldBe(elementRect('e').top, 80);
    shouldBeCloseTo(elementRect('e').right, borderXIntercept(80), 1);

    shouldBe(elementRect('f').top, 100);
    shouldBe(elementRect('f').right, 20);

    checkTestFailures();
}
