// Copyright 2013 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.

/**
 * @fileoverview Unit tests for goog.labs.userAgent.engine.
 */

goog.provide('goog.labs.userAgent.engineTest');

goog.require('goog.labs.userAgent.engine');
goog.require('goog.labs.userAgent.testAgents');
goog.require('goog.labs.userAgent.util');
goog.require('goog.testing.jsunit');

goog.setTestOnly('goog.labs.userAgent.engineTest');

var testAgents = goog.labs.userAgent.testAgents;

function setUp() {
  goog.labs.userAgent.util.setUserAgent(null);
}

function assertVersion(version) {
  assertEquals(version, goog.labs.userAgent.engine.getVersion());
}

function assertLowAndHighVersions(lowVersion, highVersion) {
  assertTrue(goog.labs.userAgent.engine.isVersionOrHigher(lowVersion));
  assertFalse(goog.labs.userAgent.engine.isVersionOrHigher(highVersion));
}

function testPresto() {
  goog.labs.userAgent.util.setUserAgent(testAgents.OPERA_LINUX);
  assertTrue(goog.labs.userAgent.engine.isPresto());
  assertFalse(goog.labs.userAgent.engine.isGecko());
  assertVersion('2.9.168');
  assertLowAndHighVersions('2.9', '2.10');

  goog.labs.userAgent.util.setUserAgent(testAgents.OPERA_MAC);
  assertTrue(goog.labs.userAgent.engine.isPresto());
  assertFalse(goog.labs.userAgent.engine.isGecko());
  assertVersion('2.9.168');
  assertLowAndHighVersions('2.9', '2.10');

  goog.labs.userAgent.util.setUserAgent(testAgents.OPERA_MINI);
  assertTrue(goog.labs.userAgent.engine.isPresto());
  assertFalse(goog.labs.userAgent.engine.isGecko());
  assertVersion('2.8.119');
  assertLowAndHighVersions('2.8', '2.9');
}

function testTrident() {
  goog.labs.userAgent.util.setUserAgent(testAgents.IE_6);
  assertTrue(goog.labs.userAgent.engine.isTrident());
  assertFalse(goog.labs.userAgent.engine.isGecko());
  assertFalse(goog.labs.userAgent.engine.isEdge());
  assertVersion('');

  goog.labs.userAgent.util.setUserAgent(testAgents.IE_10);
  assertTrue(goog.labs.userAgent.engine.isTrident());
  assertFalse(goog.labs.userAgent.engine.isGecko());
  assertFalse(goog.labs.userAgent.engine.isEdge());
  assertVersion('6.0');
  assertLowAndHighVersions('6.0', '7.0');

  goog.labs.userAgent.util.setUserAgent(testAgents.IE_8);
  assertTrue(goog.labs.userAgent.engine.isTrident());
  assertFalse(goog.labs.userAgent.engine.isGecko());
  assertFalse(goog.labs.userAgent.engine.isEdge());
  assertVersion('4.0');
  assertLowAndHighVersions('4.0', '5.0');

  goog.labs.userAgent.util.setUserAgent(testAgents.IE_9_COMPATIBILITY);
  assertTrue(goog.labs.userAgent.engine.isTrident());
  assertFalse(goog.labs.userAgent.engine.isGecko());
  assertFalse(goog.labs.userAgent.engine.isEdge());
  assertVersion('5.0');
  assertLowAndHighVersions('5.0', '6.0');

  goog.labs.userAgent.util.setUserAgent(goog.labs.userAgent.testAgents.IE_11);
  assertTrue(goog.labs.userAgent.engine.isTrident());
  assertFalse(goog.labs.userAgent.engine.isGecko());
  assertFalse(goog.labs.userAgent.engine.isEdge());
  assertVersion('7.0');
  assertLowAndHighVersions('6.0', '8.0');

  goog.labs.userAgent.util.setUserAgent(
      goog.labs.userAgent.testAgents.IE_10_MOBILE);
  assertTrue(goog.labs.userAgent.engine.isTrident());
  assertFalse(goog.labs.userAgent.engine.isEdge());
  assertVersion('6.0');
}

function testEdge() {
  goog.labs.userAgent.util.setUserAgent(testAgents.EDGE_12_0);
  assertTrue(goog.labs.userAgent.engine.isEdge());
  assertFalse(goog.labs.userAgent.engine.isTrident());
  assertFalse(goog.labs.userAgent.engine.isGecko());
  assertVersion('12.0');
  assertLowAndHighVersions('11.0', '13.0');
}

function testWebKit() {
  goog.labs.userAgent.util.setUserAgent(testAgents.ANDROID_BROWSER_235);
  assertTrue(goog.labs.userAgent.engine.isWebKit());
  assertFalse(goog.labs.userAgent.engine.isGecko());
  assertFalse(goog.labs.userAgent.engine.isEdge());
  assertVersion('533.1');
  assertLowAndHighVersions('533.0', '534.0');

  goog.labs.userAgent.util.setUserAgent(testAgents.ANDROID_BROWSER_403_ALT);
  assertTrue(goog.labs.userAgent.engine.isWebKit());
  assertFalse(goog.labs.userAgent.engine.isGecko());
  assertFalse(goog.labs.userAgent.engine.isEdge());
  assertVersion('534.30');
  assertLowAndHighVersions('533.0', '535.0');

  goog.labs.userAgent.util.setUserAgent(testAgents.CHROME_25);
  assertTrue(goog.labs.userAgent.engine.isWebKit());
  assertFalse(goog.labs.userAgent.engine.isGecko());
  assertFalse(goog.labs.userAgent.engine.isEdge());
  assertVersion('535.8');
  assertLowAndHighVersions('535.0', '536.0');

  goog.labs.userAgent.util.setUserAgent(testAgents.SAFARI_6);
  assertTrue(goog.labs.userAgent.engine.isWebKit());
  assertFalse(goog.labs.userAgent.engine.isGecko());
  assertFalse(goog.labs.userAgent.engine.isEdge());
  assertVersion('536.25');
  assertLowAndHighVersions('536.0', '537.0');

  goog.labs.userAgent.util.setUserAgent(testAgents.SAFARI_IPHONE_6);
  assertTrue(goog.labs.userAgent.engine.isWebKit());
  assertFalse(goog.labs.userAgent.engine.isGecko());
  assertFalse(goog.labs.userAgent.engine.isEdge());
  assertVersion('536.26');
  assertLowAndHighVersions('536.0', '537.0');
}

function testOpera15() {
  goog.labs.userAgent.util.setUserAgent(testAgents.OPERA_15);
  assertTrue(goog.labs.userAgent.engine.isWebKit());
  assertFalse(goog.labs.userAgent.engine.isPresto());
  assertVersion('537.36');
}

function testGecko() {
  goog.labs.userAgent.util.setUserAgent(testAgents.FIREFOX_LINUX);
  assertTrue(goog.labs.userAgent.engine.isGecko());
  assertFalse(goog.labs.userAgent.engine.isEdge());
  assertVersion('15.0.1');
  assertLowAndHighVersions('14.0', '16.0');

  goog.labs.userAgent.util.setUserAgent(testAgents.FIREFOX_19);
  assertTrue(goog.labs.userAgent.engine.isGecko());
  assertFalse(goog.labs.userAgent.engine.isEdge());
  assertVersion('19.0');
  assertLowAndHighVersions('18.0', '20.0');

  goog.labs.userAgent.util.setUserAgent(testAgents.FIREFOX_WINDOWS);
  assertTrue(goog.labs.userAgent.engine.isGecko());
  assertFalse(goog.labs.userAgent.engine.isEdge());
  assertVersion('14.0.1');
  assertLowAndHighVersions('14.0', '15.0');
}
