/*
 * Copyright (c) 2006-2015 DMDirc Developers
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package com.dmdirc.util.io;

import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;

@SuppressWarnings("resource")
@RunWith(MockitoJUnitRunner.class)
public class StreamUtilsTest {

    @Mock private Closeable closeable;

    @Test
    public void testCloseWithNullStream() {
        // Shouldn't throw an exception
        StreamUtils.close(null);
    }

    @Test
    public void testReadStream() throws Exception {
        final InputStream inputStream = spy(getClass().getResource("test5.txt").openStream());
        StreamUtils.readStream(inputStream);
        verify(inputStream, atLeastOnce()).read(any(byte[].class), anyInt(), anyInt());
    }

    @Test
    public void testCloseWithIoException() throws IOException {
        doThrow(new IOException("Oops")).when(closeable).close();
        StreamUtils.close(closeable);
        verify(closeable).close();
    }

    @Test
    public void testCloseNormally() throws IOException {
        StreamUtils.close(closeable);
        verify(closeable).close();
    }

}
@@ -1250,20 +1250,85 @@
 g.junit.
-Test
+Rule;%0Aimport org.junit.Test;%0Aimport org.junit.rules.ExpectedException
 ;%0Aimport
@@ -1449,118 +1449,33 @@
 org.
-mockito.Matchers.any;%0Aimport static org.mockito.Matchers.anyInt;%0Aimport static org.mockito.Mockito.atLeastOnce
+junit.Assert.assertEquals
 ;%0Aim
@@ -1519,47 +1519,8 @@
 ow;%0A
-import static org.mockito.Mockito.spy;%0A
 impo
@@ -1655,16 +1655,86 @@
 Test %7B%0A%0A
+    @Rule public ExpectedException thrown = ExpectedException.none();%0A
     @Moc
@@ -2005,12 +2005,8 @@
 m = 
-spy(
 getC
@@ -2049,17 +2049,16 @@
 Stream()
-)
 ;%0A      
@@ -2104,23 +2104,16 @@
         
-verify(
 inputStr
@@ -2119,67 +2119,185 @@
 ream
-, atLeastOnce()).read(any(byte%5B%5D.class), anyInt(), anyInt()
+.close();%0A        thrown.expect(IOException.class);%0A        thrown.expectMessage(%22Stream closed%22);%0A        final int result = inputStream.read();%0A        assertEquals(-1, result
 );%0A 

Improve test a bit.