1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage tests.support;
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Writer;
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * An implementation of {@code OutputStream} that should serve as the
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * underlying stream for classes to be tested.
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * In particular this implementation allows to have IOExecptions thrown on demand.
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * For simplicity of use and understanding all fields are public.
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Support_ASimpleWriter extends Writer {
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int DEFAULT_BUFFER_SIZE = 32;
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public char[] buf;
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int pos;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int size;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Set to true when exception is wanted:
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean throwExceptionOnNextUse = false;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Support_ASimpleWriter() {
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(DEFAULT_BUFFER_SIZE);
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Support_ASimpleWriter(boolean throwException) {
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(DEFAULT_BUFFER_SIZE);
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throwExceptionOnNextUse = throwException;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
33f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Support_ASimpleWriter(int bufferSize) {
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buf = new char[bufferSize];
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        pos = 0;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        size = bufferSize;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void close() throws IOException {
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (throwExceptionOnNextUse) {
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IOException("Exception thrown for testing purpose.");
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
46f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void flush() throws IOException {
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (throwExceptionOnNextUse) {
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IOException("Exception thrown for testing purpose.");
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void write(char[] src, int offset, int count) throws IOException {
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (throwExceptionOnNextUse) {
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IOException("Exception thrown for testing purpose.");
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (offset < 0 || count < 0 || (offset + count) > buf.length) {
60f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            throw new IndexOutOfBoundsException();
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            System.arraycopy(src, offset, buf, pos, count);
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            pos += count;
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IndexOutOfBoundsException e) {
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            pos = size;
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IOException("Internal Buffer Overflow");
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public byte[] toByteArray() {
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] toReturn = new byte[pos];
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        System.arraycopy(buf, 0, toReturn, 0, pos);
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return toReturn;
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new String(buf, 0, pos);
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
81