sku-pg
Version:
Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!
175 lines (152 loc) • 6.32 kB
HTML
<!--
-->
<html>
<!--
Copyright 2009 The Closure Library Authors. All Rights Reserved.
Use of this source code is governed by the Apache License, Version 2.0.
See the COPYING file for details.
-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Closure Unit Tests - goog.positioning.AnchoredViewportPosition</title>
<script src="../base.js"></script>
<script>
goog.require('goog.dom');
goog.require('goog.math.Box');
goog.require('goog.positioning.AnchoredViewportPosition');
goog.require('goog.positioning.Corner');
goog.require('goog.positioning.OverflowStatus');
goog.require('goog.style');
goog.require('goog.testing.jsunit');
</script>
</head>
<body>
<!-- Use IFRAME to avoid non-deterministic window size problems in Selenium. -->
<iframe id="frame1" style="width:200px; height:200px;"
src="anchoredviewportposition_test_iframe.html">
</iframe>
<script>
var frame, doc, dom, viewportSize, anchor, popup;
var corner = goog.positioning.Corner;
function setUp() {
frame = document.getElementById('frame1');
doc = goog.dom.getFrameContentDocument(frame);
dom = goog.dom.getDomHelper(doc);
viewportSize = dom.getViewportSize();
anchor = dom.getElement('anchor');
popup = dom.getElement('popup');
goog.style.setSize(popup, 20, 20);
}
// The frame has enough space at the bottom of the anchor.
function testRepositionBottom() {
var avp = new goog.positioning.AnchoredViewportPosition(
anchor, corner.BOTTOM_LEFT, false);
goog.style.setSize(anchor, 100, 100);
goog.style.setPosition(anchor, 0, 0);
assertTrue(viewportSize.height >= 100 + 20);
avp.reposition(popup, corner.TOP_LEFT);
var anchorRect = goog.style.getBounds(anchor);
assertEquals(anchorRect.top + anchorRect.height,
goog.style.getPageOffset(popup).y);
}
// No enough space at the bottom, but at the top.
function testRepositionTop() {
var avp = new goog.positioning.AnchoredViewportPosition(
anchor, corner.BOTTOM_LEFT, false);
var newTop = viewportSize.height - 100;
goog.style.setSize(anchor, 100, 100);
goog.style.setPosition(anchor, 50, newTop);
assertTrue(newTop >= 20);
avp.reposition(popup, corner.TOP_LEFT);
anchorRect = goog.style.getBounds(anchor);
var popupRect = goog.style.getBounds(popup);
assertEquals(anchorRect.top, popupRect.top + popupRect.height);
}
// Not enough space either at the bottom or right but there is enough space at
// top left.
function testRepositionBottomRight() {
var avp = new goog.positioning.AnchoredViewportPosition(
anchor, corner.BOTTOM_RIGHT, false);
goog.style.setSize(anchor, 100, 100);
goog.style.setPosition(anchor, viewportSize.width - 110,
viewportSize.height - 110);
avp.reposition(popup, corner.TOP_LEFT);
anchorRect = goog.style.getBounds(anchor);
var popupRect = goog.style.getBounds(popup);
assertEquals(anchorRect.top, popupRect.top + popupRect.height);
assertEquals(anchorRect.left, popupRect.left + popupRect.width);
}
// Enough space at neither the bottom nor the top. Adjustment flag is false.
function testRepositionNoSpaceWithoutAdjustment() {
var avp = new goog.positioning.AnchoredViewportPosition(
anchor, corner.BOTTOM_LEFT, false);
goog.style.setPosition(anchor, 50, 10);
goog.style.setSize(anchor, 100, viewportSize.height - 20);
avp.reposition(popup, corner.TOP_LEFT);
anchorRect = goog.style.getBounds(anchor);
popupRect = goog.style.getBounds(popup);
assertEquals(anchorRect.top + anchorRect.height, popupRect.top);
assertTrue(popupRect.top + popupRect.height > viewportSize.height);
}
// Enough space at neither the bottom nor the top. Adjustment flag is true.
function testRepositionNoSpaceWithAdjustment() {
var avp = new goog.positioning.AnchoredViewportPosition(
anchor, corner.BOTTOM_LEFT, true);
goog.style.setPosition(anchor, 50, 10);
goog.style.setSize(anchor, 100, viewportSize.height - 20);
avp.reposition(popup, corner.TOP_LEFT);
anchorRect = goog.style.getBounds(anchor);
popupRect = goog.style.getBounds(popup);
assertTrue(anchorRect.top + anchorRect.height > popupRect.top);
assertEquals(viewportSize.height, popupRect.top + popupRect.height);
}
function testAdjustCorner() {
var avp = new goog.positioning.AnchoredViewportPosition(
anchor, corner.BOTTOM_LEFT);
assertEquals(corner.BOTTOM_LEFT, avp.adjustCorner(0, corner.BOTTOM_LEFT));
assertEquals(corner.BOTTOM_RIGHT, avp.adjustCorner(
goog.positioning.OverflowStatus.FAILED_HORIZONTAL, corner.BOTTOM_LEFT));
assertEquals(corner.TOP_LEFT, avp.adjustCorner(
goog.positioning.OverflowStatus.FAILED_VERTICAL, corner.BOTTOM_LEFT));
assertEquals(corner.TOP_RIGHT, avp.adjustCorner(
goog.positioning.OverflowStatus.FAILED_VERTICAL |
goog.positioning.OverflowStatus.FAILED_HORIZONTAL,
corner.BOTTOM_LEFT));
}
// No space to fit, so uses fallback.
function testOverflowConstraint() {
var tinyBox = new goog.math.Box(0, 0, 0, 0);
var avp = new goog.positioning.AnchoredViewportPosition(
anchor, corner.BOTTOM_LEFT, false, tinyBox);
assertEquals(tinyBox, avp.getOverflowConstraint());
goog.style.setSize(anchor, 50, 50);
goog.style.setPosition(anchor, 80, 80);
avp.reposition(popup, corner.TOP_LEFT);
anchorRect = goog.style.getBounds(anchor);
popupRect = goog.style.getBounds(popup);
assertEquals(anchorRect.left, popupRect.left);
assertEquals(anchorRect.top + anchorRect.height, popupRect.top);
}
// Initially no space to fit above, then changes to have room.
function testChangeOverflowConstraint() {
var tinyBox = new goog.math.Box(0, 0, 0, 0);
var avp = new goog.positioning.AnchoredViewportPosition(
anchor, corner.BOTTOM_LEFT, false, tinyBox);
assertEquals(tinyBox, avp.getOverflowConstraint());
goog.style.setSize(anchor, 50, 50);
goog.style.setPosition(anchor, 80, 80);
avp.reposition(popup, corner.TOP_LEFT);
popupRect = goog.style.getBounds(popup);
assertNotEquals(60, popupRect.top);
var movedBox = new goog.math.Box(60, 100, 100, 60);
avp.setOverflowConstraint(movedBox);
assertEquals(movedBox, avp.getOverflowConstraint());
avp.reposition(popup, corner.TOP_LEFT);
popupRect = goog.style.getBounds(popup);
assertEquals(80, popupRect.left);
assertEquals(60, popupRect.top);
}
</script>
</body>
</html>