// 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 Point offsetTo(Element parent)
/// Provides the offset of this element's borderEdge relative to the specified
/// parent.
/// This is the Dart equivalent of jQuery's position method. Unlike jQuery's
/// position, however, parent can be any parent element of this, rather than
/// only this's immediate offsetParent. If the specified element is not an
/// offset parent or transitive offset parent to this element, an ArgumentError
/// is thrown.
/// @description Checks expected offset values

import "dart:html";
import "../../../Utils/expect.dart";
import "../testcommon.dart";

main() {
  document.body?.setInnerHtml('''

<div style="position: absolute; left: 10px; top: 10px" id="div1">
  some
  <div style="position: absolute; left: 50px; top: 50px" id="div2">
    text
  </div>
</div>''', treeSanitizer: new NullTreeSanitizer());

  var div1 = document.body?.querySelector('#div1');
  var div2 = document.body?.querySelector('#div2');

  var b = document.body;
  if (b != null) {
    Expect.equals(10, div1?.offsetTo(b).x, "div1 relative to body x");
    Expect.equals(10, div1?.offsetTo(b).y, "div1 relative to body y");

    if (div1 != null) {
      Expect.equals(50, div2?.offsetTo(div1).x, "div2 relative to div1 x");
      Expect.equals(50, div2?.offsetTo(div1).y, "div2 relative to div1 y");
    } else {
      Expect.fail("div is null");
    }

    // indirect offsetParent
    Expect.equals(60, div2?.offsetTo(b).x, "div2 relative to body x");
    Expect.equals(60, div2?.offsetTo(b).y, "div2 relative to body y");
  } else {
    Expect.fail("Body is null");
  }
}
