/*
 * Copyright 2009 Google Inc.
 *
 * 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.
 */
package com.google.gwt.dev;

import junit.framework.TestCase;

/**
 * Tests GwtVersion.
 */
public class GwtVersionTest extends TestCase {

  /**
   * Check for compatibility between compareTo, equals, and hashCode.
   */
  public void testCompareEqualsHashCode() {
    checkCompareEqualsHashCode("0.0.0", "0.0.0");
    checkCompareEqualsHashCode("0.0.0", "0");
    checkCompareEqualsHashCode("1.2.3", "001.002.003");
    checkCompareEqualsHashCode("1.2.3", "001.002.004");
    checkCompareEqualsHashCode("1.2.4", "001.002.003");
    checkCompareEqualsHashCode("1.2.4-ms1", "1.2.4-ms1");
    checkCompareEqualsHashCode("1.2.4-ms2", "1.2.4-ms2");
    checkCompareEqualsHashCode("1.2.4-ms2", "1.2.4-rc1");
  }

  /**
   * Test that GwtVersion.compareTo produced expected results.
   */
  public void testCompareTo() {
    GwtVersion v1 = new GwtVersion("0.0.0");
    assertEquals(0, v1.compareTo(v1));
    GwtVersion v2 = new GwtVersion("0.0.0");
    assertEquals(0, v1.compareTo(v2));
    assertEquals(0, v2.compareTo(v1));
    v2 = new GwtVersion("0.0.0b");
    assertTrue(v1.compareTo(v2) > 0);
    assertTrue(v2.compareTo(v1) < 0);
    v1 = new GwtVersion("0.0.0c");
    v2 = new GwtVersion("0.0.0b");
    assertEquals(0, v1.compareTo(v2));
    assertEquals(0, v2.compareTo(v1));
    v1 = new GwtVersion("1.9.41");
    v2 = new GwtVersion("1.11.12");
    assertTrue(v1.compareTo(v2) < 0);
    assertTrue(v2.compareTo(v1) > 0);
    v1 = new GwtVersion("1.9.41");
    v2 = new GwtVersion("1.4.12");
    assertTrue(v1.compareTo(v2) > 0);
    assertTrue(v2.compareTo(v1) < 0);
    v1 = new GwtVersion("1.9.41");
    v2 = new GwtVersion("2.0.0-ms1");
    assertTrue(v1.compareTo(v2) < 0);
    assertTrue(v2.compareTo(v1) > 0);
    v1 = new GwtVersion("2.0.0-ms2");
    v2 = new GwtVersion("2.0.0-rc1");
    assertEquals(0, v1.compareTo(v2));
    assertEquals(0, v2.compareTo(v1));
    v1 = new GwtVersion("001.002.099");
    v2 = new GwtVersion("1.2.99");
    assertEquals(0, v1.compareTo(v2));
    assertEquals(0, v2.compareTo(v1));
  }

  /**
   * Test that GwtVersion.compareTo produced expected results.
   */
  public void testEquals() {
    GwtVersion v1 = new GwtVersion("0.0.0");
    assertEquals(v1, v1);
    GwtVersion v2 = new GwtVersion("0.0.0");
    assertEquals(v1, v2);
    assertEquals(v2, v1);
    v2 = new GwtVersion("");
    assertEquals(v1, v2);
    assertEquals(v2, v1);
    v2 = new GwtVersion("1.2.3");
    assertFalse(v1.equals(v2));
    assertFalse(v2.equals(v1));
  }

  /**
   * Test that various versions are properly detected as to whether or not they
   * are "no-nag" versions.
   */
  public void testIsNoNagVersion() {
    GwtVersion version = new GwtVersion("0.0.0");
    assertFalse(version.isNoNagVersion());
    version = new GwtVersion("0.0.999");
    assertTrue(version.isNoNagVersion());
    version = new GwtVersion("2.0.999");
    assertTrue(version.isNoNagVersion());
    version = new GwtVersion("2.0.999-rc1");
    assertTrue(version.isNoNagVersion());
    version = new GwtVersion("2.0.999-ms2");
    assertTrue(version.isNoNagVersion());
    version = new GwtVersion("0.999.0");
    assertFalse(version.isNoNagVersion());
    version = new GwtVersion("2.999.0-rc1");
    assertFalse(version.isNoNagVersion());
  }

  /**
   * Verify that bogus version numbers don't fail.
   */
  public void testParseBad() {
    checkAllZerosVersion("", null);
    checkAllZerosVersion("bogus", null); // we skip leading garbage
    checkAllZerosVersion("0.x.x", "x.x");
    GwtVersion version = new GwtVersion("1.x.x");
    int[] components = version.getComponents();
    assertEquals(3, components.length);
    assertEquals(1, components[0]);
    assertEquals(0, components[1]);
    assertEquals(0, components[2]);
    assertEquals("x.x", version.getSuffix());
    version = new GwtVersion("1.2.x");
    components = version.getComponents();
    assertEquals(3, components.length);
    assertEquals(1, components[0]);
    assertEquals(2, components[1]);
    assertEquals(0, components[2]);
    assertEquals("x", version.getSuffix());
    version = new GwtVersion("1.2.3x");
    components = version.getComponents();
    assertEquals(3, components.length);
    assertEquals(1, components[0]);
    assertEquals(2, components[1]);
    assertEquals(3, components[2]);
    assertEquals("x", version.getSuffix());
  }

  /**
   * Tests parsing various version numbers.
   */
  public void testParseBasic() {
    GwtVersion version = new GwtVersion("1.2.3");
    int[] components = version.getComponents();
    assertEquals(3, components.length);
    assertEquals(1, components[0]);
    assertEquals(2, components[1]);
    assertEquals(3, components[2]);
    assertNull(version.getSuffix());
    version = new GwtVersion("1.2.3-ms1");
    components = version.getComponents();
    assertEquals(3, components.length);
    assertEquals(1, components[0]);
    assertEquals(2, components[1]);
    assertEquals(3, components[2]);
    assertEquals("-ms1", version.getSuffix());
    version = new GwtVersion("1.2.3-rc2");
    components = version.getComponents();
    assertEquals(3, components.length);
    assertEquals(1, components[0]);
    assertEquals(2, components[1]);
    assertEquals(3, components[2]);
    assertEquals("-rc2", version.getSuffix());
    version = new GwtVersion("1.2.3-RC1");
    components = version.getComponents();
    assertEquals(3, components.length);
    assertEquals(1, components[0]);
    assertEquals(2, components[1]);
    assertEquals(3, components[2]);
    assertEquals("-RC1", version.getSuffix());
  }

  /**
   * Tests various ways you can get a version number of 0.0.0.
   */
  public void testParseZeros() {
    checkAllZerosVersion("0.0.0", null);
    checkAllZerosVersion("0.0", null);
    checkAllZerosVersion("0", null);
    checkAllZerosVersion("", null);
    checkAllZerosVersion(null, null);
    checkAllZerosVersion("foo0.0.0", null);
    checkAllZerosVersion("foo0.0.0 bar", " bar");
  }

  /**
   * Test that GwtVersion.toString() returns expected results.
   */
  public void testToString() {
    String versionString = "0.0.0";
    GwtVersion version = new GwtVersion(versionString);
    assertEquals(versionString, version.toString());
    versionString = "0.0.0a";
    version = new GwtVersion(versionString);
    assertEquals(versionString, version.toString());
    versionString = "foo 0.0.0a";
    version = new GwtVersion(versionString);
    assertEquals("0.0.0a", version.toString());
    versionString = "1.2.3";
    version = new GwtVersion(versionString);
    assertEquals(versionString, version.toString());
    versionString = "1.2.3-rc1";
    version = new GwtVersion(versionString);
    assertEquals(versionString, version.toString());
    versionString = "1.2.3-ms2";
    version = new GwtVersion(versionString);
    assertEquals(versionString, version.toString());
  }

  /**
   * Verify that the version string is treated equivalently to 0.0.0.
   *
   * @param versionString version number in string form
   * @param expectedSuffix expected suffix of the version
   */
  private void checkAllZerosVersion(String versionString,
      String expectedSuffix) {
    GwtVersion version = new GwtVersion(versionString);
    int[] components = version.getComponents();
    assertEquals(3, components.length);
    assertEquals(0, components[0]);
    assertEquals(0, components[1]);
    assertEquals(0, components[2]);
    assertEquals(expectedSuffix, version.getSuffix());
  }

  /**
   * Check that compareTo, equals, and hashCode are compatible for a pair of
   * versions.
   *
   * @param v1String string format version number to test
   * @param v2String string format version number to test
   */
  private void checkCompareEqualsHashCode(String v1String, String v2String) {
    GwtVersion v1 = new GwtVersion(v1String);
    GwtVersion v2 = new GwtVersion(v2String);
    int h1 = v1.hashCode();
    int h2 = v2.hashCode();
    int c12 = v1.compareTo(v2);
    int c21 = v2.compareTo(v1);
    boolean e12 = v1.equals(v2);
    boolean e21 = v2.equals(v1);
    assertEquals("equals not symmetric", e12, e21);
    assertEquals("compareTo not symmetric", c12, -c21);
    assertEquals("compareTo/equals don't match", e12, c12 == 0);
    assertEquals("hashCode/equals don't match", e12, h1 == h2);
  }
}
