127 lines
3.9 KiB
Java
127 lines
3.9 KiB
Java
/*
|
|
* Copyright (C) 2009 The Guava Authors
|
|
*
|
|
* 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.common.testing;
|
|
|
|
import java.io.Serializable;
|
|
import junit.framework.AssertionFailedError;
|
|
import junit.framework.TestCase;
|
|
|
|
/**
|
|
* Tests for {@link SerializableTester}.
|
|
*
|
|
* @author Nick Kralevich
|
|
*/
|
|
public class SerializableTesterTest extends TestCase {
|
|
public void testStringAssertions() {
|
|
String original = "hello world";
|
|
String copy = SerializableTester.reserializeAndAssert(original);
|
|
assertEquals(original, copy);
|
|
assertNotSame(original, copy);
|
|
}
|
|
|
|
public void testClassWhichDoesNotImplementEquals() {
|
|
ClassWhichDoesNotImplementEquals orig = new ClassWhichDoesNotImplementEquals();
|
|
boolean errorNotThrown = false;
|
|
try {
|
|
SerializableTester.reserializeAndAssert(orig);
|
|
errorNotThrown = true;
|
|
} catch (AssertionFailedError error) {
|
|
// expected
|
|
assertContains("must be Object#equals to", error.getMessage());
|
|
}
|
|
assertFalse(errorNotThrown);
|
|
}
|
|
|
|
public void testClassWhichIsAlwaysEqualButHasDifferentHashcodes() {
|
|
ClassWhichIsAlwaysEqualButHasDifferentHashcodes orig =
|
|
new ClassWhichIsAlwaysEqualButHasDifferentHashcodes();
|
|
boolean errorNotThrown = false;
|
|
try {
|
|
SerializableTester.reserializeAndAssert(orig);
|
|
errorNotThrown = true;
|
|
} catch (AssertionFailedError error) {
|
|
// expected
|
|
assertContains("must be equal to the Object#hashCode", error.getMessage());
|
|
}
|
|
assertFalse(errorNotThrown);
|
|
}
|
|
|
|
public void testObjectWhichIsEqualButChangesClass() {
|
|
ObjectWhichIsEqualButChangesClass orig = new ObjectWhichIsEqualButChangesClass();
|
|
boolean errorNotThrown = false;
|
|
try {
|
|
SerializableTester.reserializeAndAssert(orig);
|
|
errorNotThrown = true;
|
|
} catch (AssertionFailedError error) {
|
|
// expected
|
|
assertContains("expected:<class ", error.getMessage());
|
|
}
|
|
assertFalse(errorNotThrown);
|
|
}
|
|
|
|
private static class ClassWhichDoesNotImplementEquals implements Serializable {
|
|
private static final long serialVersionUID = 1L;
|
|
}
|
|
|
|
private static class ClassWhichIsAlwaysEqualButHasDifferentHashcodes implements Serializable {
|
|
private static final long serialVersionUID = 2L;
|
|
|
|
@SuppressWarnings("EqualsHashCode")
|
|
@Override
|
|
public boolean equals(Object other) {
|
|
return (other instanceof ClassWhichIsAlwaysEqualButHasDifferentHashcodes);
|
|
}
|
|
}
|
|
|
|
private static class ObjectWhichIsEqualButChangesClass implements Serializable {
|
|
private static final long serialVersionUID = 1L;
|
|
|
|
@Override
|
|
public boolean equals(Object other) {
|
|
return (other instanceof ObjectWhichIsEqualButChangesClass || other instanceof OtherForm);
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
return 1;
|
|
}
|
|
|
|
private Object writeReplace() {
|
|
return new OtherForm();
|
|
}
|
|
|
|
private static class OtherForm implements Serializable {
|
|
@Override
|
|
public boolean equals(Object other) {
|
|
return (other instanceof ObjectWhichIsEqualButChangesClass || other instanceof OtherForm);
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void assertContains(String expectedSubstring, String actual) {
|
|
// TODO(kevinb): use a Truth assertion here
|
|
if (!actual.contains(expectedSubstring)) {
|
|
fail("expected <" + actual + "> to contain <" + expectedSubstring + ">");
|
|
}
|
|
}
|
|
}
|