/*
 * Copyright 2008 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.util;

import junit.framework.TestCase;

/**
 * Tests the {@link JsniRef} class.
 */
public class JsniRefTest extends TestCase {
  public static void testBasics() {
    {
      JsniRef ref = JsniRef.parse("@some.package.SomeClass::someField");
      assertEquals("some.package.SomeClass", ref.className());
      assertEquals("someField", ref.memberName());
      assertEquals("someField", ref.memberSignature());
      assertFalse(ref.isMethod());
      assertTrue(ref.isField());
    }

    {
      JsniRef ref = JsniRef.parse("@some.package.SomeClass::someMeth()");
      assertEquals("some.package.SomeClass", ref.className());
      assertEquals("someMeth", ref.memberName());
      assertEquals("someMeth()", ref.memberSignature());
      assertTrue(ref.isMethod());
      assertFalse(ref.isField());
      assertFalse(ref.matchesAnyOverload());
      assertEquals(0, ref.paramTypes().length);
    }

    {
      // test with every JNI type included
      JsniRef ref = JsniRef.parse("@some.package.SomeClass::someMeth("
          + "[[ZBCDFIJLjava/lang/String;S)");
      assertEquals("some.package.SomeClass", ref.className());
      assertEquals("someMeth", ref.memberName());
      assertEquals("someMeth([[ZBCDFIJLjava/lang/String;S)",
          ref.memberSignature());
      assertTrue(ref.isMethod());
      assertFalse(ref.matchesAnyOverload());
      assertEquals(9, ref.paramTypes().length);
      assertEquals("[[Z", ref.paramTypes()[0]);
      assertEquals("B", ref.paramTypes()[1]);
      assertEquals("C", ref.paramTypes()[2]);
      assertEquals("D", ref.paramTypes()[3]);
      assertEquals("F", ref.paramTypes()[4]);
      assertEquals("I", ref.paramTypes()[5]);
      assertEquals("J", ref.paramTypes()[6]);
      assertEquals("Ljava/lang/String;", ref.paramTypes()[7]);
      assertEquals("S", ref.paramTypes()[8]);
    }

    {
      // Test with a wildcard parameter list
      JsniRef ref = JsniRef.parse("@some.package.SomeClass::someMeth(*)");
      assertEquals("some.package.SomeClass", ref.className());
      assertEquals("someMeth", ref.memberName());
      assertTrue(ref.isMethod());
      assertTrue(ref.matchesAnyOverload());
    }

    {
      // test some badly formatted wildcard strings
      assertNull(JsniRef.parse("@some.package.SomeClass::someMeth(*"));
      assertNull(JsniRef.parse("@some.package.SomeClass::someMeth(I*)"));
    }

    {
      // test with no preceding at sign
      JsniRef ref = JsniRef.parse("some.package.SomeClass::someField");
      assertEquals("some.package.SomeClass", ref.className());
      assertEquals("someField", ref.memberName());
      assertEquals("someField", ref.memberSignature());
      assertFalse(ref.isMethod());
      assertTrue(ref.isField());
    }
  }

  public void testEquals() {
    String[] tests = new String[] {
        "@some.package.SomeClass::someField",
        "@some.package.SomeClass::someMeth()",
        "@some.package.SomeClass::someMeth([[ZBCDFIJLjava/lang/String;S)"};

    for (String test : tests) {
      JsniRef ref1 = JsniRef.parse(test);
      JsniRef ref2 = JsniRef.parse(test);
      assertEquals(ref1, ref2);
    }
  }

  public void testHashCode() {
    String[] tests = new String[] {
        "@some.package.SomeClass::someField",
        "@some.package.SomeClass::someMeth()",
        "@some.package.SomeClass::someMeth([[ZBCDFIJLjava/lang/String;S)"};

    for (String test : tests) {
      JsniRef ref1 = JsniRef.parse(test);
      JsniRef ref2 = JsniRef.parse(test);
      assertEquals(ref1.hashCode(), ref2.hashCode());
    }
  }

  public void testToString() {
    String[] tests = new String[] {
        "@some.package.SomeClass::someField",
        "@some.package.SomeClass::someMeth()",
        "@some.package.SomeClass::someMeth([[ZBCDFIJLjava/lang/String;S)"};

    for (String test : tests) {
      JsniRef ref = JsniRef.parse(test);
      assertEquals(test, ref.toString());
    }
  }
}
