# HG changeset patch # User Jaroslav Tulach # Date 1386692055 -3600 # Node ID a0a31f8f7dc161b873640dfd3dc9761b4bc87410 # Parent 9718335431b73c2ecb69c1a66d203e94e926c31c Tim wanted functional System.out, so let's make it do something useful diff -r 9718335431b7 -r a0a31f8f7dc1 rt/emul/compact/src/main/java/java/lang/System.java --- a/rt/emul/compact/src/main/java/java/lang/System.java Fri Nov 22 14:20:49 2013 +0100 +++ b/rt/emul/compact/src/main/java/java/lang/System.java Tue Dec 10 17:14:15 2013 +0100 @@ -17,9 +17,11 @@ */ package java.lang; +import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.io.PrintStream; import java.util.Properties; import org.apidesign.bck2brwsr.core.JavaScriptBody; @@ -88,9 +90,42 @@ public final static PrintStream err; + public static void setOut(PrintStream out) { + throw new SecurityException(); + } + + public static void setIn(InputStream in) { + throw new SecurityException(); + } + + public static void setErr(PrintStream err) { + throw new SecurityException(); + } + static { in = new ByteArrayInputStream(new byte[0]); - out = err = new PrintStream(new ByteArrayOutputStream()); + out = new PrintStream(new BufferedOutputStream(new SystemStream("log"))); + err = new PrintStream(new BufferedOutputStream(new SystemStream("warn"))); } - + + private static final class SystemStream extends OutputStream { + private final String method; + + public SystemStream(String method) { + this.method = method; + } + + @Override + public void write(byte b[], int off, int len) throws IOException { + write(method, new String(b, off, len, "UTF-8")); + } + + @JavaScriptBody(args = { "method", "b" }, body = "if (typeof console !== 'undefined') console[method](b.toString());") + private static native void write(String method, String b); + + @Override + public void write(int b) throws IOException { + write(new byte[] { (byte)b }); + } + } // end of SystemStream } diff -r 9718335431b7 -r a0a31f8f7dc1 rt/emul/compact/src/test/java/org/apidesign/bck2brwsr/tck/SystemTest.java --- a/rt/emul/compact/src/test/java/org/apidesign/bck2brwsr/tck/SystemTest.java Fri Nov 22 14:20:49 2013 +0100 +++ b/rt/emul/compact/src/test/java/org/apidesign/bck2brwsr/tck/SystemTest.java Tue Dec 10 17:14:15 2013 +0100 @@ -17,6 +17,9 @@ */ package org.apidesign.bck2brwsr.tck; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import org.apidesign.bck2brwsr.core.JavaScriptBody; import org.apidesign.bck2brwsr.vmtest.Compare; import org.apidesign.bck2brwsr.vmtest.VMTest; import org.testng.annotations.Factory; @@ -30,6 +33,30 @@ return System.getProperty("os.name") != null; } + @Compare public String captureStdOut() throws Exception { + Object capture = initCapture(); + System.out.println("Ahoj"); + return textCapture(capture); + } + + @JavaScriptBody(args = {}, body = "" + + "var lines = [];" + + "console.log = function(l) { lines.push(l); };" + + "return lines;") + Object initCapture() { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + PrintStream ps = new PrintStream(os); + + System.setOut(ps); + return os; + } + + @JavaScriptBody(args = { "o" }, body = "return o.join('');") + String textCapture(Object o) throws java.io.IOException { + ByteArrayOutputStream b = (ByteArrayOutputStream) o; + return new String(b.toByteArray(), "UTF-8"); + } + @Factory public static Object[] create() { return VMTest.create(SystemTest.class); }