blob: 753c4ab6311858aa8612f3f6625a149d81b7032d [file] [log] [blame]
/*
* 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 + ">");
}
}
}