Add additional Unit and Integration Tests asserting the functionality and behavior of the JRE.

This commit is contained in:
John Blum
2019-12-10 13:58:59 -08:00
parent 2e36e48eb0
commit 0b36ea2d3c
2 changed files with 195 additions and 0 deletions

View File

@@ -0,0 +1,37 @@
/*
* Copyright 2019 the original author or 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
*
* https://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 example.java.lang;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;
/**
* Integration Tests testing different comparisons of {@link Integer#TYPE} values.
*
* @author John Blum
* @see java.lang.Integer
* @see org.junit.Test
* @since 2.3.0
*/
public class IntValueComparisonUnitTests {
@Test
public void zeroIsEqualToNegativeZero() {
// Of course, this better be always 'true'!
assertThat(0).isEqualTo(-0);
}
}

View File

@@ -0,0 +1,158 @@
/*
* Copyright 2019 the original author or 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
*
* https://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 example.java.lang;
import static org.assertj.core.api.Assertions.assertThat;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import org.junit.Test;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
/**
* Integration Tests asserting the functionality/behavior of Java Serialization.
*
* @author John Blum
* @see java.io.Serializable
* @see org.junit.Test
* @since 2.3.0
*/
public class ObjectSerializationIntegrationTests {
@SuppressWarnings("unchecked")
private <T> T deserialize(byte[] bytes) throws ClassNotFoundException, IOException {
try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes))) {
return (T) in.readObject();
}
}
private byte[] serialize(Object obj) throws IOException {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
try (ObjectOutputStream out = new ObjectOutputStream(byteStream)) {
out.writeObject(obj);
out.flush();
}
return byteStream.toByteArray();
}
@Test
public void serializedObjectWithUnsetIntFieldUsesTheSameSpaceAsObjectWithIntFieldSet() throws IOException {
IntEmployee janeDoeNoAge = new IntEmployee("Jane Doe");
assertThat(janeDoeNoAge).isNotNull();
assertThat(janeDoeNoAge.getName()).isEqualTo("Jane Doe");
assertThat(janeDoeNoAge.getAge()).isEqualTo(0);
IntegerEmployee janeDoeWithAge = new IntegerEmployee(21, "Jane Doe");
assertThat(janeDoeWithAge).isNotNull();
assertThat(janeDoeWithAge.getName()).isEqualTo("Jane Doe");
assertThat(janeDoeWithAge.getAge()).isEqualTo(21);
byte[] janeDoeNoAgeBytes = serialize(janeDoeNoAge);
byte[] janeDoeWithAgeBytes = serialize(janeDoeWithAge);
//System.out.printf("Jane Doe no Age [%s] Byte Length [%d] vs. Jane Doe with Age [%s] Byte Length [%d]%n",
// janeDoeNoAge, janeDoeNoAgeBytes.length, janeDoeWithAge, janeDoeWithAgeBytes.length);
// The following assertion fails (!), I suppose unsurprisingly!
//assertThat(janeDoeNoAgeBytes.length).isEqualTo(janeDoeWithAgeBytes.length);
assertThat(janeDoeNoAgeBytes.length).isLessThanOrEqualTo(janeDoeWithAgeBytes.length);
}
@Test
public void serializedObjectWithNullIntegerFieldUsesLessSpaceThanObjectWithIntegerFieldSet()
throws ClassNotFoundException, IOException {
IntegerEmployee jonDoe = new IntegerEmployee("Jon Doe");
//jonDoe.setAge(0);
assertThat(jonDoe).isNotNull();
assertThat(jonDoe.getName()).isEqualTo("Jon Doe");
assertThat(jonDoe.getAge()).isNull();
//assertThat(jonDoe.getAge()).isEqualTo(0);
byte[] jonDoeNoAgeBytes = serialize(jonDoe);
IntegerEmployee jonDoeNoAgeDeserialized = deserialize(jonDoeNoAgeBytes);
assertThat(jonDoeNoAgeDeserialized).isEqualTo(jonDoe);
assertThat(jonDoeNoAgeDeserialized).isNotSameAs(jonDoe);
jonDoe.setAge(45);
assertThat(jonDoe.getName()).isEqualTo("Jon Doe");
assertThat(jonDoe.getAge()).isEqualTo(45);
byte[] jonDoeWithAgeBytes = serialize(jonDoe);
IntegerEmployee jonDoeWithAgeDeserialized = deserialize(jonDoeWithAgeBytes);
assertThat(jonDoeWithAgeDeserialized).isEqualTo(jonDoe);
assertThat(jonDoeWithAgeDeserialized).isNotSameAs(jonDoe);
//System.out.printf("Jon Doe no Age [%s] Byte Length (%d) vs. Jon Doe with Age [%s] Byte Length [%d]%n",
// jonDoeNoAgeDeserialized, jonDoeNoAgeBytes.length, jonDoeWithAgeDeserialized, jonDoeWithAgeBytes.length);
assertThat(jonDoeNoAgeBytes.length).isLessThan(jonDoeWithAgeBytes.length);
}
@Data
@ToString
@AllArgsConstructor
@RequiredArgsConstructor
@EqualsAndHashCode(of = { "name", "age" })
public static class IntEmployee implements Serializable {
private int age;
@NonNull
private String name;
}
@Data
@ToString
@AllArgsConstructor
@RequiredArgsConstructor
@EqualsAndHashCode(of = { "name", "age" })
public static class IntegerEmployee implements Serializable {
private Integer age;
@NonNull
private String name;
}
}