/**
 * 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 org.waveprotocol.wave.model.waveref;


import junit.framework.TestCase;

import org.waveprotocol.wave.model.id.WaveId;
import org.waveprotocol.wave.model.id.WaveletId;

/**
 * Unit tests for {@link WaveRef}
 *
 * @author meade@google.com <Edwina Mead>
 */
public class WaveRefTest extends TestCase {

  public void testBasicEquals() {
    WaveRef first = WaveRef.of(WaveId.of("example.com", "w+1234abcd"));
    WaveRef second = WaveRef.of(WaveId.of("example.com", "w+1234abcd"));
    WaveRef different = WaveRef.of(WaveId.of("test.com", "w+1234abcd"));

    assertFalse(first.equals(null));
    assertTrue(first.equals(first));
    assertTrue(first.equals(second));
    assertFalse(first.equals(different));
  }

  public void testEqualsWithSameWaveIdDifferentOtherFields() {
    WaveRef first = WaveRef.of(WaveId.of("example.com", "w+1234abcd"));
    WaveRef second = WaveRef.of(WaveId.of("example.com", "w+1234abcd"),
        WaveletId.of("example.com", "conv+root"));
    WaveRef third = WaveRef.of(WaveId.of("example.com", "w+1234abcd"),
        WaveletId.of("example.com", "conv+root"),
        "b+12345");

    assertTrue(second.equals(second));
    assertTrue(third.equals(third));

    assertFalse(first.equals(second));
    assertFalse(first.equals(third));
    assertFalse(second.equals(third));
  }

  public void testEqualsWithDifferentWaveIdSameOtherFields() {
    WaveRef first = WaveRef.of(WaveId.of("test.com", "w+1234"),
        WaveletId.of("example.com", "conv+root"),
        "b+12345");
    WaveRef second = WaveRef.of(WaveId.of("example.com", "w+1234"),
        WaveletId.of("example.com", "conv+root"),
        "b+12345");

    assertFalse(first.equals(second));
  }

  public void testHashCode() {
    WaveRef first = WaveRef.of(WaveId.of("example.com", "w+1234"));
    WaveRef second = WaveRef.of(WaveId.of("example.com", "w+1234"),
        WaveletId.of("example.com", "conv+root"));
    WaveRef third = WaveRef.of(WaveId.of("example.com", "w+1234"),
        WaveletId.of("example.com", "conv+root"), "b+12345");

    WaveRef sameAsFirst = WaveRef.of(WaveId.of("example.com", "w+1234"));
    WaveRef sameAsThird = WaveRef.of(WaveId.of("example.com", "w+1234"),
        WaveletId.of("example.com", "conv+root"), "b+12345");

    assertEquals(first.hashCode(), sameAsFirst.hashCode());
    assertEquals(third.hashCode(), sameAsThird.hashCode());

    assertFalse(first.hashCode() == second.hashCode());
    assertFalse(first.hashCode() == third.hashCode());
    assertFalse(second.hashCode() == third.hashCode());
  }
}
