// Copyright 2008 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.ui.HsvaPaletteTest');
goog.setTestOnly('goog.ui.HsvaPaletteTest');

goog.require('goog.color.alpha');
goog.require('goog.dom.TagName');
goog.require('goog.dom.classlist');
goog.require('goog.events.Event');
goog.require('goog.math.Coordinate');
goog.require('goog.style');
goog.require('goog.testing.PropertyReplacer');
goog.require('goog.testing.jsunit');
goog.require('goog.ui.HsvaPalette');
goog.require('goog.userAgent');

var samplePalette;
var eventWasFired = false;
var stubs = new goog.testing.PropertyReplacer();

function setUp() {
  samplePalette = new goog.ui.HsvaPalette();
}

function tearDown() {
  samplePalette.dispose();
  stubs.reset();
}

function testZeroAlpha() {
  var palette = new goog.ui.HsvaPalette(null, undefined, 0);
  assertEquals(0, palette.getAlpha());
}

function testOptionalInitialColor() {
  var alpha = 0.5;
  var color = '#0000ff';
  var palette = new goog.ui.HsvaPalette(null, color, alpha);
  assertEquals(color, palette.getColor());
  assertEquals(alpha, palette.getAlpha());
}

function testCustomClassName() {
  var customClassName = 'custom-plouf';
  var customClassPalette =
      new goog.ui.HsvaPalette(null, null, null, customClassName);
  customClassPalette.createDom();
  assertTrue(
      goog.dom.classlist.contains(
          customClassPalette.getElement(), customClassName));
}

function testSetColor() {
  var color = '#abcdef01';
  samplePalette.setColorRgbaHex(color);
  assertEquals(
      color, goog.color.alpha.parse(samplePalette.getColorRgbaHex()).hex);
  color = 'abcdef01';
  samplePalette.setColorRgbaHex(color);
  assertEquals(
      '#' + color, goog.color.alpha.parse(samplePalette.getColorRgbaHex()).hex);
}

function testRender() {
  samplePalette.render(document.getElementById('sandbox'));

  assertTrue(samplePalette.isInDocument());

  var elem = samplePalette.getElement();
  assertNotNull(elem);
  assertEquals(String(goog.dom.TagName.DIV), elem.tagName);

  if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('7')) {
    assertSameElements(
        'On IE6, the noalpha class must be present',
        ['goog-hsva-palette', 'goog-hsva-palette-noalpha'],
        goog.dom.classlist.get(elem));
  } else {
    assertEquals(
        'The noalpha class must not be present', 'goog-hsva-palette',
        elem.className);
  }
}

function testInputColor() {
  samplePalette.render(document.getElementById('sandbox'));
  var color = '#00112233';
  samplePalette.inputElement.value = color;
  samplePalette.handleInput(null);
  assertEquals(
      color, goog.color.alpha.parse(samplePalette.getColorRgbaHex()).hex);
}

function testHandleMouseMoveAlpha() {
  samplePalette.render(document.getElementById('sandbox'));
  stubs.set(goog.dom, 'getPageScroll', function() {
    return new goog.math.Coordinate(0, 0);
  });

  // Lowering the opacity of a dark, opaque red should yield a
  // more transparent red.
  samplePalette.setColorRgbaHex('#630c0000');
  goog.style.setPageOffset(samplePalette.aImageEl_, 0, 0);
  goog.style.setSize(samplePalette.aImageEl_, 10, 100);
  var boundaries = goog.style.getBounds(samplePalette.aImageEl_);

  var event = new goog.events.Event();
  event.clientY = boundaries.top;
  samplePalette.handleMouseMoveA_(boundaries, event);

  assertEquals('#630c00ff', samplePalette.getColorRgbaHex());
}

function testSwatchOpacity() {
  samplePalette.render(document.getElementById('sandbox'));

  samplePalette.setAlpha(1);
  assertEquals(1, goog.style.getOpacity(samplePalette.swatchElement));

  samplePalette.setAlpha(0x99 / 0xff);
  assertEquals(0.6, goog.style.getOpacity(samplePalette.swatchElement));

  samplePalette.setAlpha(0);
  assertEquals(0, goog.style.getOpacity(samplePalette.swatchElement));
}

function testNoTransparencyBehavior() {
  samplePalette.render(document.getElementById('sandbox'));

  samplePalette.inputElement.value = '#abcdef22';
  samplePalette.handleInput(null);
  samplePalette.inputElement.value = '#abcdef';
  samplePalette.handleInput(null);
  assertEquals(1, goog.style.getOpacity(samplePalette.swatchElement));
}
