/*
* 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" );
}
}
Messung V0.5 in Prozent C=91 H=89 G=89
¤ Dauer der Verarbeitung: 0.7 Sekunden
¤
*© Formatika GbR, Deutschland