This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
commit b3b97511aa5fbef233bdaadf7803d68f536f116f Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Thu Dec 14 18:44:33 2023 +0100 Move to `...storage.internal` two classes that are not intended to be exported, even by qualified export. The "internal" packages are intended to be truly internal to the module that contains it. For now, this policy is applied only to `org.apache.sis.storage` module. Other modules will follow in the future. --- .../sis/io/stream/ChannelImageOutputStream.java | 2 - .../main/org/apache/sis/io/stream/IOUtilities.java | 1 + .../apache/sis/io/stream/OutputStreamAdapter.java | 2 +- .../org/apache/sis/storage/DataStoreProvider.java | 10 +-- .../main/org/apache/sis/storage/ProbeReader.java | 2 +- .../org/apache/sis/storage/StorageConnector.java | 4 +- .../main/org/apache/sis/storage/csv/Store.java | 2 +- .../internal}/InputStreamAdapter.java | 15 ++-- .../internal}/RewindableLineReader.java | 2 +- .../apache/sis/storage/StorageConnectorTest.java | 81 +++++++++++----------- .../internal}/RewindableLineReaderTest.java | 39 +++++------ 11 files changed, 77 insertions(+), 83 deletions(-) diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/ChannelImageOutputStream.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/ChannelImageOutputStream.java index d6f9de7347..4cb3822cbb 100644 --- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/ChannelImageOutputStream.java +++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/ChannelImageOutputStream.java @@ -30,8 +30,6 @@ import javax.imageio.stream.ImageOutputStream; * An {@code ImageOutputStream} backed by {@code ChannelDataInput} and {@code ChannelDataOutput}. * Contrarily to most other I/O frameworks in the standard JDK, {@code ImageOutputStream} is read/write. * - * @todo Not yet used in {@link org.apache.sis.storage.StorageConnector}. - * * @author Rémi Maréchal (Geomatys) * @author Martin Desruisseaux (Geomatys) */ diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/IOUtilities.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/IOUtilities.java index 9c3d270eb4..c6eefebd10 100644 --- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/IOUtilities.java +++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/IOUtilities.java @@ -50,6 +50,7 @@ import org.apache.sis.util.Static; import org.apache.sis.util.resources.Errors; import org.apache.sis.util.internal.Constants; import org.apache.sis.storage.internal.Resources; +import org.apache.sis.storage.internal.InputStreamAdapter; /** diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/OutputStreamAdapter.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/OutputStreamAdapter.java index 25b6831e67..faa6591feb 100644 --- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/OutputStreamAdapter.java +++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/OutputStreamAdapter.java @@ -25,7 +25,7 @@ import java.io.IOException; * * @author Martin Desruisseaux (Geomatys) * - * @see InputStreamAdapter + * @see org.apache.sis.storage.internal.InputStreamAdapter */ final class OutputStreamAdapter extends OutputStream implements Markable { /** diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/DataStoreProvider.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/DataStoreProvider.java index bffb983a1d..0603c87f65 100644 --- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/DataStoreProvider.java +++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/DataStoreProvider.java @@ -25,14 +25,14 @@ import org.opengis.parameter.ParameterValueGroup; import org.opengis.parameter.ParameterDescriptorGroup; import org.opengis.metadata.distribution.Format; import org.apache.sis.metadata.simple.SimpleFormat; -import org.apache.sis.storage.base.URIDataStore; -import org.apache.sis.io.stream.Markable; -import org.apache.sis.io.stream.RewindableLineReader; import org.apache.sis.metadata.iso.citation.DefaultCitation; import org.apache.sis.metadata.iso.distribution.DefaultFormat; +import org.apache.sis.io.stream.Markable; +import org.apache.sis.storage.base.URIDataStore; +import org.apache.sis.storage.internal.RewindableLineReader; import org.apache.sis.measure.Range; -import org.apache.sis.util.ArgumentChecks; import org.apache.sis.util.Version; +import org.apache.sis.util.ArgumentChecks; import org.apache.sis.util.logging.Logging; import org.apache.sis.util.resources.Errors; @@ -443,7 +443,7 @@ public abstract class DataStoreProvider { * from using marks, but without wrapper if we can safely expose a `BufferedReader` * (because users may want to use the `BufferedReader.readLine()` method). */ - final RewindableLineReader r = (RewindableLineReader) input; + final var r = (RewindableLineReader) input; r.protectedMark(); result = prober.test(input); r.protectedReset(); diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/ProbeReader.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/ProbeReader.java index 9a52d02bb4..2a74984b79 100644 --- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/ProbeReader.java +++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/ProbeReader.java @@ -29,7 +29,7 @@ import org.apache.sis.storage.internal.Resources; * The {@link #close()} method closes this reader but not the wrapped reader, which is only reset. * * <p>Note: this wrapper is not used if the reader is an instance of - * {@link org.apache.sis.io.stream.RewindableLineReader}.</p> + * {@link org.apache.sis.storage.internal.RewindableLineReader}.</p> * * @author Martin Desruisseaux (Geomatys) * diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/StorageConnector.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/StorageConnector.java index 1c568e4694..cb71f7fcf5 100644 --- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/StorageConnector.java +++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/StorageConnector.java @@ -71,9 +71,9 @@ import org.apache.sis.io.stream.ChannelDataInput; import org.apache.sis.io.stream.ChannelDataOutput; import org.apache.sis.io.stream.ChannelImageInputStream; import org.apache.sis.io.stream.ChannelImageOutputStream; -import org.apache.sis.io.stream.InputStreamAdapter; -import org.apache.sis.io.stream.RewindableLineReader; import org.apache.sis.io.stream.InternalOptionKey; +import org.apache.sis.storage.internal.InputStreamAdapter; +import org.apache.sis.storage.internal.RewindableLineReader; import org.apache.sis.system.Configuration; import org.apache.sis.setup.OptionKey; diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/csv/Store.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/csv/Store.java index 02707d4dd7..0f0aeedb6f 100644 --- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/csv/Store.java +++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/csv/Store.java @@ -64,7 +64,7 @@ import org.apache.sis.storage.base.MetadataBuilder; import org.apache.sis.storage.base.URIDataStore; import org.apache.sis.io.InvalidSeekException; import org.apache.sis.io.stream.IOUtilities; -import org.apache.sis.io.stream.RewindableLineReader; +import org.apache.sis.storage.internal.RewindableLineReader; import org.apache.sis.storage.internal.Resources; import org.apache.sis.geometry.GeneralEnvelope; import org.apache.sis.geometry.ImmutableEnvelope; diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/InputStreamAdapter.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/internal/InputStreamAdapter.java similarity index 95% rename from endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/InputStreamAdapter.java rename to endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/internal/InputStreamAdapter.java index 81f05db4b8..01b3a0a681 100644 --- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/InputStreamAdapter.java +++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/internal/InputStreamAdapter.java @@ -14,14 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.sis.io.stream; +package org.apache.sis.storage.internal; import java.io.InputStream; import java.io.IOException; import java.io.UncheckedIOException; import javax.imageio.stream.ImageInputStream; import org.apache.sis.io.InvalidSeekException; -import org.apache.sis.storage.internal.Resources; +import org.apache.sis.io.stream.Markable; /** @@ -30,14 +30,15 @@ import org.apache.sis.storage.internal.Resources; * <h2>Thread-safety</h2> * This class is thread-safe only if the underlying {@link ImageInputStream} is itself thread-safe. * For performance reasons, this class does not synchronize the frequently invoked {@code read(…)} - * methods since they do nothing else than delegating to {@code ImageInputStream}. This means that - * if the wrapped input is {@link ChannelImageInputStream}, then this class is <strong>not</strong> - * thread-safe. This is not necessarily a contradiction with Java API since input streams define no - * explicit synchronization lock (contrarily to {@link java.io.Reader}. + * methods since they do nothing else than delegating to {@code ImageInputStream}. + * This means that if the wrapped input is {@link org.apache.sis.io.stream.ChannelImageInputStream}, + * then this class is <strong>not</strong> thread-safe. This is not necessarily a contradiction with + * Java API because input streams define no explicit synchronization lock + * (contrarily to {@link java.io.Reader}). * * @author Martin Desruisseaux (IRD, Geomatys) * - * @see OutputStreamAdapter + * @see org.apache.sis.io.stream.OutputStreamAdapter */ public final class InputStreamAdapter extends InputStream implements Markable { /** diff --git a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/RewindableLineReader.java b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/internal/RewindableLineReader.java similarity index 99% rename from endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/RewindableLineReader.java rename to endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/internal/RewindableLineReader.java index 0db4195ac1..22394a409f 100644 --- a/endorsed/src/org.apache.sis.storage/main/org/apache/sis/io/stream/RewindableLineReader.java +++ b/endorsed/src/org.apache.sis.storage/main/org/apache/sis/storage/internal/RewindableLineReader.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.sis.io.stream; +package org.apache.sis.storage.internal; import java.io.IOException; import java.io.InputStream; diff --git a/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/StorageConnectorTest.java b/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/StorageConnectorTest.java index c40b27a330..6813520876 100644 --- a/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/StorageConnectorTest.java +++ b/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/StorageConnectorTest.java @@ -33,12 +33,12 @@ import org.apache.sis.setup.OptionKey; import org.apache.sis.util.UnconvertibleObjectException; import org.apache.sis.io.stream.ChannelDataInput; import org.apache.sis.io.stream.ChannelImageInputStream; -import org.apache.sis.io.stream.InputStreamAdapter; +import org.apache.sis.storage.internal.InputStreamAdapter; // Test dependencies import org.junit.Test; -import static org.junit.Assume.assumeTrue; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assumptions.assumeTrue; +import static org.junit.jupiter.api.Assertions.*; import static org.opengis.test.Assert.assertInstanceOf; import org.apache.sis.test.DependsOnMethod; import org.apache.sis.test.DependsOn; @@ -199,18 +199,18 @@ public final class StorageConnectorTest extends TestCase { assertEquals(asStream, connector.getStorageAs(URI.class) == null); assertEquals(asStream, connector.getStorageAs(Path.class) == null); final DataInput input = connector.getStorageAs(DataInput.class); - assertSame("Value shall be cached.", input, connector.getStorageAs(DataInput.class)); + assertSame(input, connector.getStorageAs(DataInput.class), "Value shall be cached."); assertInstanceOf("Needs the SIS implementation.", ChannelDataInput.class, input); - assertSame("Instance shall be shared.", input, connector.getStorageAs(ChannelDataInput.class)); + assertSame(input, connector.getStorageAs(ChannelDataInput.class), "Instance shall be shared."); /* * Reads a single integer for checking that the stream is at the right position, then close the stream. * Since the file is a compiled Java class, the integer that we read shall be the Java magic number. */ final ReadableByteChannel channel = ((ChannelDataInput) input).channel; - assertTrue("channel.isOpen()", channel.isOpen()); - assertEquals("First 4 bytes", MAGIC_NUMBER, input.readInt()); + assertTrue(channel.isOpen(), "channel.isOpen()"); + assertEquals(MAGIC_NUMBER, input.readInt(), "First 4 bytes"); connector.closeAllExcept(null); - assertFalse("channel.isOpen()", channel.isOpen()); + assertFalse(channel.isOpen(), "channel.isOpen()"); } /** @@ -241,7 +241,7 @@ public final class StorageConnectorTest extends TestCase { public void testGetOriginalInputStream() throws DataStoreException, IOException { final StorageConnector connector = create(true); final InputStream in = connector.getStorageAs(InputStream.class); - assertSame("The InputStream shall be the one specified to the constructor.", connector.getStorage(), in); + assertSame(connector.getStorage(), in, "The InputStream shall be the one specified to the constructor."); /* * Ask a different type and request a few bytes. We do not test the ImageInputStream type here as this is * not the purpose of this method. But we need a different type before to request again the InputStream. @@ -256,11 +256,11 @@ public final class StorageConnectorTest extends TestCase { * (which is the case when the resource is an ordinary file, not an entry inside a JAR file), * otherwise the call to connector.getStorageAs(…) throws a DataStoreException. */ - assumeTrue("Cannot use a JAR file entry for this test.", in.markSupported()); + assumeTrue(in.markSupported(), "Cannot use a JAR file entry for this test."); assertSame(in, connector.getStorageAs(InputStream.class)); final byte[] actual = new byte[sample.length]; - assertEquals("Should read all requested bytes.", actual.length, in.read(actual)); - assertArrayEquals("InputStream shall be reset to the beginning of the stream.", sample, actual); + assertEquals(actual.length, in.read(actual), "Should read all requested bytes."); + assertArrayEquals(sample, actual, "InputStream shall be reset to the beginning of the stream."); connector.closeAllExcept(null); } @@ -277,7 +277,7 @@ public final class StorageConnectorTest extends TestCase { final StorageConnector connector = create(false); final InputStream in = connector.getStorageAs(InputStream.class); assertNotSame(connector.getStorage(), in); - assertSame("Expected cached value.", in, connector.getStorageAs(InputStream.class)); + assertSame(in, connector.getStorageAs(InputStream.class), "Expected cached value."); assertInstanceOf("Expected Channel backend.", InputStreamAdapter.class, in); final ImageInputStream input = ((InputStreamAdapter) in).input; assertInstanceOf("Expected Channel backend.", ChannelImageInputStream.class, input); @@ -303,7 +303,7 @@ public final class StorageConnectorTest extends TestCase { final Reader in = connector.getStorageAs(Reader.class); in.mark(1000); assertExpectedChars(in); - assertSame("Expected cached value.", in, connector.getStorageAs(Reader.class)); + assertSame(in, connector.getStorageAs(Reader.class), "Expected cached value."); in.reset(); /* * Open as an ImageInputStream and verify that reading starts from the beginning. @@ -312,15 +312,15 @@ public final class StorageConnectorTest extends TestCase { final ImageInputStream im = connector.getStorageAs(ImageInputStream.class); assertInstanceOf("Needs the SIS implementation.", ChannelImageInputStream.class, im); im.mark(); - assertEquals("First 4 bytes", MAGIC_NUMBER, im.readInt()); + assertEquals(MAGIC_NUMBER, im.readInt(), "First 4 bytes"); im.reset(); /* * Get a reader again. It should be a new one, in order to read from the beginning again. */ final Reader in2 = connector.getStorageAs(Reader.class); - assertNotSame("Expected a new Reader instance.", in, in2); + assertNotSame(in, in2, "Expected a new Reader instance."); assertExpectedChars(in2); - assertSame("Expected cached value.", in2, connector.getStorageAs(Reader.class)); + assertSame(in2, connector.getStorageAs(Reader.class), "Expected cached value."); connector.closeAllExcept(null); } @@ -344,10 +344,10 @@ public final class StorageConnectorTest extends TestCase { */ final ImageInputStream stream = connector.getStorageAs(ImageInputStream.class); assertInstanceOf("Needs the SIS implementation", ChannelImageInputStream.class, stream); - assertNotSame("Expected a new instance.", input, stream); - assertSame("Shall share the channel.", input.channel, ((ChannelDataInput) stream).channel); - assertSame("Shall share the buffer.", input.buffer, ((ChannelDataInput) stream).buffer); - assertSame("Cached valud shall have been replaced.", stream, connector.getStorageAs(ChannelDataInput.class)); + assertNotSame(input, stream, "Expected a new instance."); + assertSame(input.channel, ((ChannelDataInput) stream).channel, "Shall share the channel."); + assertSame(input.buffer, ((ChannelDataInput) stream).buffer, "Shall share the buffer."); + assertSame(stream, connector.getStorageAs(ChannelDataInput.class), "Cached valud shall have been replaced."); connector.closeAllExcept(null); } @@ -363,7 +363,7 @@ public final class StorageConnectorTest extends TestCase { public void testGetAsByteBuffer() throws DataStoreException, IOException { final StorageConnector connector = create(false); final ByteBuffer buffer = connector.getStorageAs(ByteBuffer.class); - assertNotNull("getStorageAs(ByteBuffer.class)", buffer); + assertNotNull(buffer, "getStorageAs(ByteBuffer.class)"); assertEquals(StorageConnector.DEFAULT_BUFFER_SIZE, buffer.capacity()); assertEquals(MAGIC_NUMBER, buffer.getInt()); connector.closeAllExcept(null); @@ -383,12 +383,12 @@ public final class StorageConnectorTest extends TestCase { public void testGetAsTemporaryByteBuffer() throws DataStoreException, IOException { StorageConnector connector = create(true); final DataInput in = ImageIO.createImageInputStream(connector.getStorage()); - assertNotNull("ImageIO.createImageInputStream(InputStream)", in); // Sanity check. + assertNotNull(in, "ImageIO.createImageInputStream(InputStream)"); // Sanity check. connector = new StorageConnector(in); assertSame(in, connector.getStorageAs(DataInput.class)); final ByteBuffer buffer = connector.getStorageAs(ByteBuffer.class); - assertNotNull("getStorageAs(ByteBuffer.class)", buffer); + assertNotNull(buffer, "getStorageAs(ByteBuffer.class)"); assertEquals(StorageConnector.MINIMAL_BUFFER_SIZE, buffer.capacity()); assertEquals(MAGIC_NUMBER, buffer.getInt()); connector.closeAllExcept(null); @@ -415,16 +415,14 @@ public final class StorageConnectorTest extends TestCase { @Test public void testGetInvalidObject() throws DataStoreException { final StorageConnector connector = create(true); - assertNotNull("getStorageAs(InputStream.class)", connector.getStorageAs(InputStream.class)); - assertNull ("getStorageAs(URI.class)", connector.getStorageAs(URI.class)); - assertNull ("getStorageAs(String.class)", connector.getStorageAs(String.class)); - try { - connector.getStorageAs(Float.class); // Any unconvertible type. - fail("Should not have accepted Float.class"); - } catch (UnconvertibleObjectException e) { - final String message = e.getMessage(); - assertTrue(message, message.contains("Float")); - } + assertNotNull(connector.getStorageAs(InputStream.class)); + assertNull (connector.getStorageAs(URI.class)); + assertNull (connector.getStorageAs(String.class)); + + String message; + message = assertThrows(UnconvertibleObjectException.class, () -> connector.getStorageAs(Float.class), + "Should not have accepted Float.class").getMessage(); + assertTrue(message.contains("Float"), message); connector.closeAllExcept(null); } @@ -440,9 +438,9 @@ public final class StorageConnectorTest extends TestCase { final StorageConnector connector = create(true); final ChannelDataInput input = connector.getStorageAs(ChannelDataInput.class); final ReadableByteChannel channel = input.channel; - assertTrue("channel.isOpen()", channel.isOpen()); + assertTrue(channel.isOpen(), "channel.isOpen()"); connector.closeAllExcept(input); - assertTrue("channel.isOpen()", channel.isOpen()); + assertTrue(channel.isOpen(), "channel.isOpen()"); channel.close(); } @@ -457,12 +455,11 @@ public final class StorageConnectorTest extends TestCase { public void testCommit() throws DataStoreException, IOException { final StorageConnector connector = create(false); final InputStream stream = connector.commit(InputStream.class, "Test"); - try { - connector.getStorageAs(ByteBuffer.class); - fail("Connector should be closed."); - } catch (IllegalStateException e) { - assertNotNull(e.getMessage()); - } + + String message; + message = assertThrows(IllegalStateException.class, () -> connector.getStorageAs(ByteBuffer.class), + "Connector should be closed.").getMessage(); + assertNotNull(message); assertExpectedBytes(stream); stream.close(); // No "try-with-resource" for easier debugging if needed. } diff --git a/endorsed/src/org.apache.sis.storage/test/org/apache/sis/io/stream/RewindableLineReaderTest.java b/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/internal/RewindableLineReaderTest.java similarity index 80% rename from endorsed/src/org.apache.sis.storage/test/org/apache/sis/io/stream/RewindableLineReaderTest.java rename to endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/internal/RewindableLineReaderTest.java index 745792a7ee..1126786913 100644 --- a/endorsed/src/org.apache.sis.storage/test/org/apache/sis/io/stream/RewindableLineReaderTest.java +++ b/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/internal/RewindableLineReaderTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.sis.io.stream; +package org.apache.sis.storage.internal; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -22,7 +22,7 @@ import javax.imageio.stream.ImageInputStreamImpl; // Test dependencies import org.junit.Test; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; import org.apache.sis.test.TestCase; @@ -54,18 +54,18 @@ public final class RewindableLineReaderTest extends TestCase { public void testRewind() throws IOException { RewindableLineReader reader = reader(); reader.mark(TRANSFERT_SIZE); // Use a smaller limit for testing sooner mark invalidation. - assertEquals("charAt(0)", 'A', reader.read()); - assertEquals("charAt(1)", 'B', reader.read()); - assertEquals("charAt(2)", 'C', reader.read()); + assertEquals('A', reader.read()); + assertEquals('B', reader.read()); + assertEquals('C', reader.read()); /* * Since we have read less than 100 characters, RewindableLineReader.rewind() * should be able to successfully delegate the work to BufferedReader.reset(). */ - assertSame("BufferedReader.reset() should have succeeded.", reader, reader.rewind()); - assertEquals("charAt(0)", 'A', reader.read()); - assertEquals("charAt(1)", 'B', reader.read()); - assertEquals("charAt(2)", 'C', reader.read()); - assertEquals("charAt(3)", 'D', reader.read()); + assertSame(reader, reader.rewind()); + assertEquals('A', reader.read()); + assertEquals('B', reader.read()); + assertEquals('C', reader.read()); + assertEquals('D', reader.read()); /* * Skip a number of characters greater than the current buffer content. It should cause BufferedReader to * invalidate the mark. As a result of failure to execute BufferedReader.reset(), the 'reader' variable @@ -73,19 +73,16 @@ public final class RewindableLineReaderTest extends TestCase { * BufferedReader.reset() succeeded or not depends on BufferedReader implementation. */ reader.skip(2 * TRANSFERT_SIZE); - assertEquals("charAt(…)", 'W', reader.read()); + assertEquals('W', reader.read()); final RewindableLineReader old = reader; reader = reader.rewind(); // Should be a new instance, but this is not mandatory. - if (reader != old) try { - old.read(); - fail("Old reader should be closed."); - } catch (IOException e) { - // This is the expected exception. + if (reader != old) { + assertThrows(IOException.class, () -> old.read()); } - assertEquals("charAt(0)", 'A', reader.read()); - assertEquals("charAt(1)", 'B', reader.read()); - assertEquals("charAt(2)", 'C', reader.read()); - assertEquals("charAt(3)", 'D', reader.read()); + assertEquals('A', reader.read()); + assertEquals('B', reader.read()); + assertEquals('C', reader.read()); + assertEquals('D', reader.read()); reader.close(); } @@ -124,7 +121,7 @@ public final class RewindableLineReaderTest extends TestCase { /** The only seek allowed for this test should be at the beginning of stream. */ @Override public void seek(final long pos) throws IOException { - assertEquals("Should seek at origin.", 0, pos); + assertEquals(0, pos, "Should seek at origin."); next = 'A'; } }), StandardCharsets.US_ASCII);