Возможность изменить вывод в консоли или перенаправить вывод в строку

This commit is contained in:
Victor 2018-12-07 23:33:58 +02:00
parent eb7430f507
commit 52d7121751
6 changed files with 203 additions and 22 deletions

View File

@ -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;
@ -10,43 +12,50 @@ public class Console {
private Console() { }
private static final String FILE_PREFIX = "tmp/";
private static boolean filePrefixEnabled;
private static OutputSettings outputSettings = new ConsoleOutputSettings();
public static void enableFilePrefix() {
Console.filePrefixEnabled = true;
public static void useSettings(OutputSettings outputSettings) {
Console.outputSettings = outputSettings;
}
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 outputSettings.fileInstance(path);
}
return new File(filepath);
}
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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) {