/*
 * 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";
import "../../../Utils/expect.dart";

const String htmlEL1 = r'''
<style>
    .testContent {
        font-face: Arial; font-size: 16px;
    }
</style>
''';

const String htmlEL2 = r'''
<div id="testContent">
    <span id="span-position-static"   style="position:static">T</span>
    <span id="span-position-fixed"    style="position:fixed">T</span>
    <span id="span-position-absolute" style="position:absolute">T</span>
    <span id="span-position-relative" style="position:relative">T</span>
</div>
''';

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

    var testContent = document.getElementById("testContent");
    var spans = testContent.querySelectorAll('span');
    var expected_width = document.getElementById('span-position-static').getBoundingClientRect().width;
    // if expected_width is integral, all should match, otherwise should be close
    var tolerance = expected_width is int ? 0 : 1.0 / 60;

    Expect.approxEquals(expected_width, document.getElementById("span-position-fixed").getBoundingClientRect().width, tolerance, "span-position-fixed");
    Expect.approxEquals(expected_width, document.getElementById("span-position-absolute").getBoundingClientRect().width, tolerance, "span-position-absolute");
    Expect.approxEquals(expected_width, document.getElementById("span-position-relative").getBoundingClientRect().width, tolerance, "span-position-relative");
}
