/* * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* @test * @bug 5067405 * @summary Basic test for classes which implement Appendable. */ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; import java.io.CharArrayWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; import java.nio.ByteBuffer; import java.nio.CharBuffer; interface BasicRunnable extends Runnable { void init(Appendable a, String csq, String exp); Appendable reset(Appendable csq); } public class Basic { private static final String s = "Beware the Jabberwock, my son!"; private static CharArrayWriter gw = new CharArrayWriter(); private static ByteArrayOutputStream gos = new ByteArrayOutputStream(); private static File newFile() { File f = null; try { f = File.createTempFile("append", ".txt"); f.deleteOnExit(); } catch (IOException x) { fail(x); } return f; } private static File gf = newFile(); private static int fail = 0; private static int pass = 0; private static Throwable first; static void pass() { pass++; } static void fail(Throwable ex) { if (first == null) first = ex; System.err.println("FAILED: unexpected exception"); fail++; } static void fail(String fs, Throwable ex) { String s = "'" + fs + "': " + ex.getClass().getName() + " not thrown"; if (first == null) first = ex; System.err.println("FAILED: " + s); fail++; } static void fail(String fs, String exp, String got) { String s = "'" + fs + "': Expected '" + exp + "', got '" + got + "'"; if (first == null) first = new RuntimeException(s); System.err.println("FAILED: " + s); fail++; } static void ck(String s, String exp, String got) { if (!exp.equals(got)) fail(s, exp, got); else pass(); } private static BasicRunnable testBufferedWriter = new BasicRunnable() { private String csn, exp; public void init(Appendable bw, String csn, String exp) { try { ((BufferedWriter)bw).flush(); } catch (IOException x) { fail(x); } this.csn = csn; this.exp = exp; } public void run() { ck("BufferedWriter.append(" + csn + ")", exp, gw.toString()); } public Appendable reset(Appendable bw) { gw.reset(); return bw; }}; private static BasicRunnable testCharArrayWriter = new BasicRunnable() { private String csn, exp; private CharArrayWriter cw; public void init(Appendable cw, String csn, String exp) { this.cw = (CharArrayWriter)cw; this.csn = csn; this.exp = exp; } public void run() { ck("CharArrayWriter.append(" + csn + ")", exp, cw.toString()); } public Appendable reset(Appendable cw) { ((CharArrayWriter)cw).reset(); return cw; }}; private static BasicRunnable testFileWriter = new BasicRunnable() { private String csn, exp; public void init(Appendable fw, String csn, String exp) { try { ((FileWriter)fw).flush(); } catch (IOException x) { fail(x); } this.csn = csn; this.exp = exp; } public void run() { StringBuilder sb = new StringBuilder(); try { BufferedReader in = new BufferedReader(new FileReader(gf)); String line; while (true) { if ((line = in.readLine()) == null) break; sb.append(line); } } catch (IOException x) { fail(x); } ck("FileWriter.append(" + csn + ")", exp, sb.toString()); } public Appendable reset(Appendable fw) { try { fw = new FileWriter(gf); } catch (IOException x) { fail(x); } return fw; }}; private static BasicRunnable testOutputStreamWriter = new BasicRunnable() { private String csn, exp; public void init(Appendable osw, String csn, String exp) { try { ((OutputStreamWriter)osw).flush(); } catch (IOException x) { fail(x); } this.csn = csn; this.exp = exp; } public void run() { ck("OutputStreamWriter.append(" + csn + ")", exp, gos.toString()); } public Appendable reset(Appendable osw) { gos.reset(); return osw; }}; private static BasicRunnable testPrintWriter = new BasicRunnable() { private String csn, exp; public void init(Appendable pw, String csn, String exp) { ((PrintWriter)pw).flush(); this.csn = csn; this.exp = exp; } public void run() { ck("PrintWriter.append(" + csn + ")", exp, gw.toString()); } public Appendable reset(Appendable pw) { gw.reset(); return pw; }}; private static BasicRunnable testStringWriter = new BasicRunnable() { private String csn, exp; private StringWriter sw; public void init(Appendable sw, String csn, String exp) { this.sw = (StringWriter)sw; this.csn = csn; this.exp = exp; } public void run() { ck("StringWriter.append(" + csn + ")", exp, sw.toString()); } public Appendable reset(Appendable sw) { return new StringWriter(); }}; private static BasicRunnable testPrintStream = new BasicRunnable() { private String csn, exp; public void init(Appendable ps, String csn, String exp) { ((PrintStream)ps).flush(); this.csn = csn; this.exp = exp; } public void run() { ck("PrintStream.append(" + csn + ")", exp, gos.toString()); } public Appendable reset(Appendable ps) { gos.reset(); return ps; }}; private static BasicRunnable testCharBuffer = new BasicRunnable() { private String csn, exp; private CharBuffer cb; public void init(Appendable cb, String csn, String exp) { this.cb = (CharBuffer)cb; this.csn = csn; this.exp = exp; } public void run() { cb.limit(cb.position()).rewind(); ck("CharBuffer.append(" + csn + ")", exp, cb.toString()); } public Appendable reset(Appendable cb) { ((CharBuffer)cb).clear(); return cb; }}; private static BasicRunnable testStringBuffer = new BasicRunnable() { private String csn, exp; private StringBuffer sb; public void init(Appendable sb, String csn, String exp) { this.sb = (StringBuffer)sb; this.csn = csn; this.exp = exp; } public void run() { ck("StringBuffer.append(" + csn + ")", exp, sb.toString()); } public Appendable reset(Appendable sb) { return new StringBuffer(); }}; private static BasicRunnable testStringBuilder = new BasicRunnable() { private String csn, exp; private StringBuilder sb; public void init(Appendable sb, String csn, String exp) { this.sb = (StringBuilder)sb; this.csn = csn; this.exp = exp; } public void run() { ck("StringBuilder.append(" + csn + ")", exp, sb.toString()); } public Appendable reset(Appendable sb) { return new StringBuilder(); }}; private static void test(Appendable a, CharSequence csq, BasicRunnable thunk) { // appends that should always work int [][] sp = { { 0, 0 }, { 11, 11 }, { 11, 21 }, { 0, 7 }, { 0, s.length() }, { s.length(), s.length() }, }; for (int j = 0; j < sp.length; j++) { int start = sp[j][0]; int end = sp[j][1]; try { thunk.init(a.append(csq, start, end), csq.getClass().getName(), s.subSequence(start, end).toString()); thunk.run(); a = thunk.reset(a); } catch (IOException x) { fail(x); } } // appends that should always throw IndexOutOfBoundsException int [][] sf = { { -1, 0 }, { 0, -1 }, { 11, 10 }, { 0, s.length() + 1}, }; for (int j = 0; j < sf.length; j++) { int start = sf[j][0]; int end = sf[j][1]; try { a.append(csq, start, end); fail("start = " + start + ", end = " + end, new IndexOutOfBoundsException()); a = thunk.reset(a); } catch (IndexOutOfBoundsException x) { pass(); } catch (IOException x) { fail(x); } } // appends of null int start = 1; int end = 2; try { thunk.init(a.append(null, start, end), "null", "null".subSequence(start, end).toString()); thunk.run(); a = thunk.reset(a); } catch (IOException x) { fail(x); } } public static void main(String [] args) throws Exception { // CharSequences CharBuffer cb = CharBuffer.allocate(128).put(s); cb.limit(s.length()).rewind(); CharBuffer dcb = ByteBuffer.allocateDirect(128).asCharBuffer().put(s); dcb.limit(s.length()).rewind(); CharSequence [] ca = { s, new StringBuffer(s), new StringBuilder(s), cb, dcb, }; // Appendables/Writers Object [][] wa = { { new CharArrayWriter(), testCharArrayWriter }, { new BufferedWriter(gw), testBufferedWriter }, // abstract, no implementing classes in jdk // { new FilterWriter(), testFilterWriter }, { new FileWriter(gf), testFileWriter }, { new OutputStreamWriter(gos), testOutputStreamWriter }, // covered by previous two test cases // { new PipedWriter(gw), testPipedWriter }, { new PrintWriter(gw), testPrintWriter }, { new StringWriter(), testStringWriter }, }; for (int i = 0; i < ca.length; i++) { CharSequence a = ca[i]; for (int j = 0; j < wa.length; j++) test((Writer)wa[j][0], a, (BasicRunnable)wa[j][1]); // other Appendables test(new PrintStream(gos), a, testPrintStream); test(CharBuffer.allocate(128), a, testCharBuffer); test(ByteBuffer.allocateDirect(128).asCharBuffer(), a, testCharBuffer); test(new StringBuffer(), a, testStringBuffer); test(new StringBuilder(), a, testStringBuilder); } if (fail != 0) throw new RuntimeException((fail + pass) + " tests: " + fail + " failure(s), first", first); else System.out.println("all " + (fail + pass) + " tests passed"); } }