diff --git a/src/main/java/com/annimon/ownlang/Console.java b/src/main/java/com/annimon/ownlang/Console.java index d6216cd..57487ac 100644 --- a/src/main/java/com/annimon/ownlang/Console.java +++ b/src/main/java/com/annimon/ownlang/Console.java @@ -1,6 +1,8 @@ package com.annimon.ownlang; import com.annimon.ownlang.lib.CallStack; +import com.annimon.ownlang.outputsettings.ConsoleOutputSettings; +import com.annimon.ownlang.outputsettings.OutputSettings; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.PrintStream; @@ -9,44 +11,51 @@ import java.io.UnsupportedEncodingException; public class Console { private Console() { } + + private static OutputSettings outputSettings = new ConsoleOutputSettings(); - private static final String FILE_PREFIX = "tmp/"; - private static boolean filePrefixEnabled; + public static void useSettings(OutputSettings outputSettings) { + Console.outputSettings = outputSettings; + } - public static void enableFilePrefix() { - Console.filePrefixEnabled = true; + public static OutputSettings getSettings() { + return outputSettings; } public static String newline() { - return System.lineSeparator(); + return outputSettings.newline(); } public static void print(String value) { - System.out.print(value); + outputSettings.print(value); } public static void print(Object value) { - print(value.toString()); + outputSettings.print(value); } public static void println() { - System.out.println(); + outputSettings.println(); } public static void println(String value) { - System.out.println(value); + outputSettings.println(value); } public static void println(Object value) { - println(value.toString()); + outputSettings.println(value); + } + + public static String text() { + return outputSettings.getText(); } public static void error(Throwable throwable) { - error(throwable.toString()); + outputSettings.error(throwable); } public static void error(CharSequence value) { - System.err.println(value); + outputSettings.error(value); } public static void handleException(Thread thread, Throwable throwable) { @@ -68,14 +77,6 @@ public class Console { } public static File fileInstance(String path) { - final String filepath; - if (filePrefixEnabled) { - filepath = FILE_PREFIX.concat(path); - } else { - filepath = path; - } - return new File(filepath); + return outputSettings.fileInstance(path); } - - } diff --git a/src/main/java/com/annimon/ownlang/outputsettings/ConsoleOutputSettings.java b/src/main/java/com/annimon/ownlang/outputsettings/ConsoleOutputSettings.java new file mode 100644 index 0000000..87c409d --- /dev/null +++ b/src/main/java/com/annimon/ownlang/outputsettings/ConsoleOutputSettings.java @@ -0,0 +1,56 @@ +package com.annimon.ownlang.outputsettings; + +import java.io.File; + +public class ConsoleOutputSettings implements OutputSettings { + + @Override + public String newline() { + return System.lineSeparator(); + } + + @Override + public void print(String value) { + System.out.print(value); + } + + @Override + public void print(Object value) { + print(value.toString()); + } + + @Override + public void println() { + System.out.println(); + } + + @Override + public void println(String value) { + System.out.println(value); + } + + @Override + public void println(Object value) { + println(value.toString()); + } + + @Override + public String getText() { + return ""; + } + + @Override + public void error(Throwable throwable) { + error(throwable.toString()); + } + + @Override + public void error(CharSequence value) { + System.err.println(value); + } + + @Override + public File fileInstance(String path) { + return new File(path); + } +} diff --git a/src/main/java/com/annimon/ownlang/outputsettings/OutputSettings.java b/src/main/java/com/annimon/ownlang/outputsettings/OutputSettings.java new file mode 100644 index 0000000..3042708 --- /dev/null +++ b/src/main/java/com/annimon/ownlang/outputsettings/OutputSettings.java @@ -0,0 +1,27 @@ +package com.annimon.ownlang.outputsettings; + +import java.io.File; + +public interface OutputSettings { + + String newline(); + + void print(String value); + + void print(Object value); + + void println(); + + void println(String value); + + void println(Object value); + + String getText(); + + void error(Throwable throwable); + + void error(CharSequence value); + + File fileInstance(String path); + +} diff --git a/src/main/java/com/annimon/ownlang/outputsettings/StringOutputSettings.java b/src/main/java/com/annimon/ownlang/outputsettings/StringOutputSettings.java new file mode 100644 index 0000000..3ffc8f1 --- /dev/null +++ b/src/main/java/com/annimon/ownlang/outputsettings/StringOutputSettings.java @@ -0,0 +1,71 @@ +package com.annimon.ownlang.outputsettings; + +import java.io.File; + +public class StringOutputSettings implements OutputSettings { + + private final StringBuffer out, err; + + public StringOutputSettings() { + this(new StringBuffer()); + } + + public StringOutputSettings(StringBuffer out) { + this(out, out); + } + + public StringOutputSettings(StringBuffer out, StringBuffer err) { + this.out = out; + this.err = err; + } + + @Override + public String newline() { + return System.lineSeparator(); + } + + @Override + public void print(String value) { + out.append(value); + } + + @Override + public void print(Object value) { + out.append(value.toString()); + } + + @Override + public void println() { + out.append(newline()); + } + + @Override + public void println(String value) { + out.append(value).append(newline()); + } + + @Override + public void println(Object value) { + println(value.toString()); + } + + @Override + public String getText() { + return out.toString(); + } + + @Override + public void error(Throwable throwable) { + error(throwable.toString()); + } + + @Override + public void error(CharSequence value) { + err.append(value).append(newline()); + } + + @Override + public File fileInstance(String path) { + return new File(path); + } +} diff --git a/src/main/java/com/annimon/ownlang/utils/Sandbox.java b/src/main/java/com/annimon/ownlang/utils/Sandbox.java index ee09be8..7d23ed6 100644 --- a/src/main/java/com/annimon/ownlang/utils/Sandbox.java +++ b/src/main/java/com/annimon/ownlang/utils/Sandbox.java @@ -3,12 +3,14 @@ package com.annimon.ownlang.utils; import com.annimon.ownlang.Console; import com.annimon.ownlang.exceptions.StoppedException; import com.annimon.ownlang.lib.CallStack; +import com.annimon.ownlang.outputsettings.ConsoleOutputSettings; import com.annimon.ownlang.parser.Lexer; import com.annimon.ownlang.parser.Parser; import com.annimon.ownlang.parser.SourceLoader; import com.annimon.ownlang.parser.Token; import com.annimon.ownlang.parser.ast.Statement; import com.annimon.ownlang.parser.visitors.FunctionAdder; +import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Arrays; @@ -18,7 +20,12 @@ import java.util.List; public final class Sandbox { public static void main(String[] args) throws IOException { - Console.enableFilePrefix(); + Console.useSettings(new ConsoleOutputSettings() { + @Override + public File fileInstance(String path) { + return new File("tmp/" + path); + } + }); final String input = SourceLoader.readAndCloseStream(System.in); dumpInputArguments(input, args); diff --git a/src/test/java/com/annimon/ownlang/parser/ProgramsTest.java b/src/test/java/com/annimon/ownlang/parser/ProgramsTest.java index a59c539..d142122 100644 --- a/src/test/java/com/annimon/ownlang/parser/ProgramsTest.java +++ b/src/test/java/com/annimon/ownlang/parser/ProgramsTest.java @@ -1,8 +1,11 @@ package com.annimon.ownlang.parser; +import com.annimon.ownlang.Console; import com.annimon.ownlang.lib.Functions; import com.annimon.ownlang.lib.NumberValue; import com.annimon.ownlang.lib.Variables; +import com.annimon.ownlang.outputsettings.OutputSettings; +import com.annimon.ownlang.outputsettings.StringOutputSettings; import com.annimon.ownlang.parser.ast.FunctionDefineStatement; import com.annimon.ownlang.parser.ast.Statement; import com.annimon.ownlang.parser.ast.Visitor; @@ -94,6 +97,22 @@ public class ProgramsTest { } } + @Test + public void testOutput() throws IOException { + OutputSettings oldSettings = Console.getSettings(); + Console.useSettings(new StringOutputSettings()); + String source = "for i = 0, i <= 5, i++\n print i"; + final Statement s = Parser.parse(Lexer.tokenize(source)); + try { + s.execute(); + assertEquals("012345", Console.text()); + } catch (Exception oae) { + Assert.fail(oae.toString()); + } finally { + Console.useSettings(oldSettings); + } + } + private static Visitor testFunctionsExecutor = new AbstractVisitor() { @Override public void visit(FunctionDefineStatement s) {