> Am 02.02.2018 um 02:45 schrieb Stuart Marks <stuart.ma...@oracle.com>:
> 
> 
> 
> On 2/1/18 10:35 AM, Patrick Reinhart wrote:
>> Here is my first shot of the actual implementation and tests:
>> http://cr.openjdk.java.net/~reinhapa/reviews/8196298/webrev.00
> 
> I looked at the specification of ready() vs the implementation. The spec says 
> that ready(), among other methods, behaves as if the Reader is at EOF. The 
> spec for Reader.ready() says "true if the next read() is guaranteed not to 
> block for input." Thus I'd assume that at EOF, read() will return -1 
> immediately, without blocking, so ready() should return true.
> 
> The NullReader implementation inherits ready() from Reader, which always 
> returns false.
> 
> So, the behavior doesn't seem consistent with my reading of the specs. 
> However, other implementations aren't, either. For example, the spec for 
> CharArrayReader.ready() says "Character-array readers are always ready to be 
> read." However,
> 
>    new CharArrayReader(new char[0]).ready()
> 
> returns false!
> 
> A couple other readers I tried (InputStreamReader, FileReader) also have 
> ready() return true until they reach EOF, at which time they return false. 
> But StringReader.ready() always returns true. Hmmmm.
> 
> Maybe the safest thing to do is to leave the various Readers' behavior of 
> ready() as they are, and leave nullReader's behavior to be consistent with 
> them. No changes are necessary to Reader in this webrev.
> 
> We should probably take a pass over the ready() methods in the Reader family 
> to see if they're correct. I'd suggest they need adjustment to mean that the 
> next read() won't block *and* data is available. And the 
> CharArrayReader.ready() spec should be fixed.
> 
> **
> 
> On the Writer side, the spec should mention that the three append() methods 
> and five write() methods do nothing if open and throw IOE if the Writer is 
> closed.
> 
> The Writer.flush() method spec doesn't say what happens if flush() is called 
> after the Writer is closed. However, Writer.close() says that subsequent 
> write() or flush() calls throw IOE. Writer implementations that track 
> open/closed state, such as FileWriter, will throw IOE from flush() after 
> closure. Since it's also tracking open/closed state, I'd expect 
> nullWriter.flush() to do the same. That is, do nothing if open, throw IOE if 
> closed.
> 
> Tests for flush() should be added.
> 

I stated in the nullWriter() method that flush() will have no action. I 
certainly can implement that behavior, so in consequence I will change the API 
description of the nullWriter() method accordingly.


> **
> 
> Speaking of tests, the tests for proper exception-throwing for the closed 
> cases can probably usefully employ the
> 
> @Test(expectedExceptions=IOException.class)
> 
> annotation. The reason I often avoid this construct is that if the same 
> exception class is thrown from an unexpected part of the test, it can mask 
> actual failures. However, since these are one-liners, that reason doesn't 
> apply. Thus:
> 
>    @Test(groups="closed", expectedExceptions=IOException.class)
>    public static void testAppendCharClosed() {
>        closedWriter.append('x');
>    }
> 
> You can probably also omit the try/catch block from the open tests, so that 
> instead of
> 
>    @Test(groups="open")
>    public static void testAppendChar() {
>        try {
>            assertSame(openWriter, openWriter.append('x'));
>        } catch (IOException e) {
>            fail("Unexpected IOException");
>        }
>    }
> 
> you can write
> 
>    @Test(groups="open")
>    public static void testAppendChar() {
>        assertSame(openWriter, openWriter.append('x'));
>    }
> 
> since the framework should catch and report errant exceptions, without the 
> need for code to catch exceptions and call fail().
> 
> s’marks
> 

I reworked the tests and Writer implementation accordingly

http://cr.openjdk.java.net/~reinhapa/reviews/8196298/webrev.01

-Patrick


Reply via email to