/*
 * Copyright 2010 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.validation.client;

import junit.framework.TestCase;

/**
 * Tests for {@link PathImpl}.
 */
public class PathImplTest extends TestCase {

  public void testEquals_root() {
    PathImpl root = new PathImpl();
    PathImpl rootCopy = new PathImpl();
    assertEqualsAndHash(root, rootCopy);
  }

  public void testEquals_foo() {
    PathImpl foo = new PathImpl().append("foo");
    PathImpl fooCopy = new PathImpl().append("foo");
    assertEqualsAndHash(foo, fooCopy);
  }

  public void testEqual_fooBarKey() {
    PathImpl fooBarKey = new PathImpl().append("foo").appendKey("bar", "key");
    PathImpl fooBarKeyCopy = new PathImpl().append("foo").appendKey("bar",
        "key");
    assertEqualsAndHash(fooBarKey, fooBarKeyCopy);
  }

  public void testEquals_fooBar1() {
    PathImpl fooBar1 = new PathImpl().append("foo").appendIndex("bar", 1);
    PathImpl fooBar1Copy = new PathImpl().append("foo").appendIndex("bar", 1);
    assertEqualsAndHash(fooBar1, fooBar1Copy);
  }

  public void testEquals_not() {
    PathImpl root = new PathImpl();
    PathImpl foo = new PathImpl().append("foo");
    assertNotEqual(root, foo);

    PathImpl fooBarKey = new PathImpl().append("foo").appendKey("bar", "key");
    PathImpl fooBarNote = new PathImpl().append("foo").appendKey("bar", "note");
    assertNotEqual(root, fooBarKey);
    assertNotEqual(foo, fooBarKey);
    assertNotEqual(fooBarNote, fooBarKey);

    PathImpl fooBar1 = new PathImpl().append("foo").appendIndex("bar", 1);
    PathImpl fooBar2 = new PathImpl().append("foo").appendIndex("bar", 2);
    assertNotEqual(root, fooBar1);
    assertNotEqual(foo, fooBar1);
    assertNotEqual(fooBarKey, fooBar1);
    assertNotEqual(fooBar2, fooBar1);
  }

  protected void assertNotEqual(Object lhs, Object rhs) {
    assertFalse(lhs + "should not equal " + rhs, lhs.equals(rhs));
  }

  protected void assertEqualsAndHash(Object lhs, Object rhs) {
    assertEquals(lhs, rhs);
    assertEquals("hashCode", lhs.hashCode(), rhs.hashCode());
  }
}
