// Copyright 2012 The Closure Library Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

goog.provide('goog.style.bidiTest');
goog.setTestOnly('goog.style.bidiTest');

goog.require('goog.dom');
goog.require('goog.style');
goog.require('goog.style.bidi');
goog.require('goog.testing.jsunit');
goog.require('goog.userAgent');

// Updates the calculated metrics.
function updateInfo() {
  var element = document.getElementById('scrolledElementRtl');
  document.getElementById('elementScrollLeftRtl').innerHTML =
      element.offsetParent.scrollLeft;
  document.getElementById('bidiOffsetStartRtl').innerHTML =
      goog.style.bidi.getOffsetStart(element);
  document.getElementById('bidiScrollLeftRtl').innerHTML =
      goog.style.bidi.getScrollLeft(element.offsetParent);

  element = document.getElementById('scrolledElementLtr');
  document.getElementById('elementScrollLeftLtr').innerHTML =
      element.offsetParent.scrollLeft;
  document.getElementById('bidiOffsetStartLtr').innerHTML =
      goog.style.bidi.getOffsetStart(element);
  document.getElementById('bidiScrollLeftLtr').innerHTML =
      goog.style.bidi.getScrollLeft(element.offsetParent);
}

function setUpPage() {
  updateInfo();
}

function tearDown() {
  document.documentElement.dir = 'ltr';
  document.body.dir = 'ltr';
}

function testGetOffsetStart() {
  var elm = document.getElementById('scrolledElementRtl');
  assertEquals(elm.style['right'], goog.style.bidi.getOffsetStart(elm) + 'px');
  elm = document.getElementById('scrolledElementLtr');
  assertEquals(elm.style['left'], goog.style.bidi.getOffsetStart(elm) + 'px');
}

function testSetScrollOffsetRtl() {
  var scrollElm = document.getElementById('scrollDivRtl');
  var scrolledElm = document.getElementById('scrolledElementRtl');
  var originalDistance =
      goog.style.getRelativePosition(scrolledElm, document.body).x;
  var scrollAndAssert = function(pixels) {
    goog.style.bidi.setScrollOffset(scrollElm, pixels);
    assertEquals(
        originalDistance + pixels,
        goog.style.getRelativePosition(scrolledElm, document.body).x);
  };
  scrollAndAssert(0);
  scrollAndAssert(50);
  scrollAndAssert(100);
  scrollAndAssert(150);
  scrollAndAssert(155);
  scrollAndAssert(0);
}

function testSetScrollOffsetLtr() {
  var scrollElm = document.getElementById('scrollDivLtr');
  var scrolledElm = document.getElementById('scrolledElementLtr');
  var originalDistance =
      goog.style.getRelativePosition(scrolledElm, document.body).x;
  var scrollAndAssert = function(pixels) {
    goog.style.bidi.setScrollOffset(scrollElm, pixels);
    assertEquals(
        originalDistance - pixels,
        goog.style.getRelativePosition(scrolledElm, document.body).x);
  };
  scrollAndAssert(0);
  scrollAndAssert(50);
  scrollAndAssert(100);
  scrollAndAssert(150);
  scrollAndAssert(155);
  scrollAndAssert(0);
}

function testFixedBodyChildLtr() {
  var bodyChild = document.getElementById('bodyChild');
  assertEquals(
      goog.userAgent.GECKO ? document.body : null, bodyChild.offsetParent);
  assertEquals(60, goog.style.bidi.getOffsetStart(bodyChild));
}

function testFixedBodyChildRtl() {
  document.documentElement.dir = 'rtl';
  document.body.dir = 'rtl';

  var bodyChild = document.getElementById('bodyChild');
  assertEquals(
      goog.userAgent.GECKO ? document.body : null, bodyChild.offsetParent);

  var expectedOffsetStart =
      goog.dom.getViewportSize().width - 60 - bodyChild.offsetWidth;

  // Gecko seems to also add in the marginbox for the body.
  // It's not really clear to me if this is true in the general case,
  // or just under certain conditions.
  if (goog.userAgent.GECKO) {
    var marginBox = goog.style.getMarginBox(document.body);
    expectedOffsetStart -= (marginBox.left + marginBox.right);
  }

  assertEquals(expectedOffsetStart, goog.style.bidi.getOffsetStart(bodyChild));
}

function testGetScrollLeftRTL() {
  var scrollLeftDiv = document.getElementById('scrollLeftRtl');
  scrollLeftDiv.style.overflow = 'visible';
  assertEquals(0, goog.style.bidi.getScrollLeft(scrollLeftDiv));
  scrollLeftDiv.style.overflow = 'hidden';
  assertEquals(0, goog.style.bidi.getScrollLeft(scrollLeftDiv));
  // NOTE: 'auto' must go above the 'scroll' assertion. Chrome 47 has a bug
  // with non-deterministic scroll positioning. Maybe it recalculates the
  // layout on accessing those properties?
  // TODO(joeltine): Remove this comment when
  // https://code.google.com/p/chromium/issues/detail?id=568706 is resolved.
  scrollLeftDiv.style.overflow = 'auto';
  assertEquals(0, goog.style.bidi.getScrollLeft(scrollLeftDiv));
  scrollLeftDiv.style.overflow = 'scroll';
  assertEquals(0, goog.style.bidi.getScrollLeft(scrollLeftDiv));
}
