Skip to content

Commit 52d7121

Browse files
committed
Возможность изменить вывод в консоли или перенаправить вывод в строку
1 parent eb7430f commit 52d7121

File tree

6 files changed

+203
-22
lines changed

6 files changed

+203
-22
lines changed
Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.annimon.ownlang;
22

33
import com.annimon.ownlang.lib.CallStack;
4+
import com.annimon.ownlang.outputsettings.ConsoleOutputSettings;
5+
import com.annimon.ownlang.outputsettings.OutputSettings;
46
import java.io.ByteArrayOutputStream;
57
import java.io.File;
68
import java.io.PrintStream;
@@ -9,44 +11,51 @@
911
public class Console {
1012

1113
private Console() { }
14+
15+
private static OutputSettings outputSettings = new ConsoleOutputSettings();
1216

13-
private static final String FILE_PREFIX = "tmp/";
14-
private static boolean filePrefixEnabled;
17+
public static void useSettings(OutputSettings outputSettings) {
18+
Console.outputSettings = outputSettings;
19+
}
1520

16-
public static void enableFilePrefix() {
17-
Console.filePrefixEnabled = true;
21+
public static OutputSettings getSettings() {
22+
return outputSettings;
1823
}
1924

2025
public static String newline() {
21-
return System.lineSeparator();
26+
return outputSettings.newline();
2227
}
2328

2429
public static void print(String value) {
25-
System.out.print(value);
30+
outputSettings.print(value);
2631
}
2732

2833
public static void print(Object value) {
29-
print(value.toString());
34+
outputSettings.print(value);
3035
}
3136

3237
public static void println() {
33-
System.out.println();
38+
outputSettings.println();
3439
}
3540

3641
public static void println(String value) {
37-
System.out.println(value);
42+
outputSettings.println(value);
3843
}
3944

4045
public static void println(Object value) {
41-
println(value.toString());
46+
outputSettings.println(value);
47+
}
48+
49+
public static String text() {
50+
return outputSettings.getText();
4251
}
4352

4453
public static void error(Throwable throwable) {
45-
error(throwable.toString());
54+
outputSettings.error(throwable);
4655
}
4756

4857
public static void error(CharSequence value) {
49-
System.err.println(value);
58+
outputSettings.error(value);
5059
}
5160

5261
public static void handleException(Thread thread, Throwable throwable) {
@@ -68,14 +77,6 @@ public static void handleException(Thread thread, Throwable throwable) {
6877
}
6978

7079
public static File fileInstance(String path) {
71-
final String filepath;
72-
if (filePrefixEnabled) {
73-
filepath = FILE_PREFIX.concat(path);
74-
} else {
75-
filepath = path;
76-
}
77-
return new File(filepath);
80+
return outputSettings.fileInstance(path);
7881
}
79-
80-
8182
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.annimon.ownlang.outputsettings;
2+
3+
import java.io.File;
4+
5+
public class ConsoleOutputSettings implements OutputSettings {
6+
7+
@Override
8+
public String newline() {
9+
return System.lineSeparator();
10+
}
11+
12+
@Override
13+
public void print(String value) {
14+
System.out.print(value);
15+
}
16+
17+
@Override
18+
public void print(Object value) {
19+
print(value.toString());
20+
}
21+
22+
@Override
23+
public void println() {
24+
System.out.println();
25+
}
26+
27+
@Override
28+
public void println(String value) {
29+
System.out.println(value);
30+
}
31+
32+
@Override
33+
public void println(Object value) {
34+
println(value.toString());
35+
}
36+
37+
@Override
38+
public String getText() {
39+
return "";
40+
}
41+
42+
@Override
43+
public void error(Throwable throwable) {
44+
error(throwable.toString());
45+
}
46+
47+
@Override
48+
public void error(CharSequence value) {
49+
System.err.println(value);
50+
}
51+
52+
@Override
53+
public File fileInstance(String path) {
54+
return new File(path);
55+
}
56+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.annimon.ownlang.outputsettings;
2+
3+
import java.io.File;
4+
5+
public interface OutputSettings {
6+
7+
String newline();
8+
9+
void print(String value);
10+
11+
void print(Object value);
12+
13+
void println();
14+
15+
void println(String value);
16+
17+
void println(Object value);
18+
19+
String getText();
20+
21+
void error(Throwable throwable);
22+
23+
void error(CharSequence value);
24+
25+
File fileInstance(String path);
26+
27+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package com.annimon.ownlang.outputsettings;
2+
3+
import java.io.File;
4+
5+
public class StringOutputSettings implements OutputSettings {
6+
7+
private final StringBuffer out, err;
8+
9+
public StringOutputSettings() {
10+
this(new StringBuffer());
11+
}
12+
13+
public StringOutputSettings(StringBuffer out) {
14+
this(out, out);
15+
}
16+
17+
public StringOutputSettings(StringBuffer out, StringBuffer err) {
18+
this.out = out;
19+
this.err = err;
20+
}
21+
22+
@Override
23+
public String newline() {
24+
return System.lineSeparator();
25+
}
26+
27+
@Override
28+
public void print(String value) {
29+
out.append(value);
30+
}
31+
32+
@Override
33+
public void print(Object value) {
34+
out.append(value.toString());
35+
}
36+
37+
@Override
38+
public void println() {
39+
out.append(newline());
40+
}
41+
42+
@Override
43+
public void println(String value) {
44+
out.append(value).append(newline());
45+
}
46+
47+
@Override
48+
public void println(Object value) {
49+
println(value.toString());
50+
}
51+
52+
@Override
53+
public String getText() {
54+
return out.toString();
55+
}
56+
57+
@Override
58+
public void error(Throwable throwable) {
59+
error(throwable.toString());
60+
}
61+
62+
@Override
63+
public void error(CharSequence value) {
64+
err.append(value).append(newline());
65+
}
66+
67+
@Override
68+
public File fileInstance(String path) {
69+
return new File(path);
70+
}
71+
}

src/main/java/com/annimon/ownlang/utils/Sandbox.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
import com.annimon.ownlang.Console;
44
import com.annimon.ownlang.exceptions.StoppedException;
55
import com.annimon.ownlang.lib.CallStack;
6+
import com.annimon.ownlang.outputsettings.ConsoleOutputSettings;
67
import com.annimon.ownlang.parser.Lexer;
78
import com.annimon.ownlang.parser.Parser;
89
import com.annimon.ownlang.parser.SourceLoader;
910
import com.annimon.ownlang.parser.Token;
1011
import com.annimon.ownlang.parser.ast.Statement;
1112
import com.annimon.ownlang.parser.visitors.FunctionAdder;
13+
import java.io.File;
1214
import java.io.IOException;
1315
import java.text.SimpleDateFormat;
1416
import java.util.Arrays;
@@ -18,7 +20,12 @@
1820
public final class Sandbox {
1921

2022
public static void main(String[] args) throws IOException {
21-
Console.enableFilePrefix();
23+
Console.useSettings(new ConsoleOutputSettings() {
24+
@Override
25+
public File fileInstance(String path) {
26+
return new File("tmp/" + path);
27+
}
28+
});
2229
final String input = SourceLoader.readAndCloseStream(System.in);
2330
dumpInputArguments(input, args);
2431

src/test/java/com/annimon/ownlang/parser/ProgramsTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package com.annimon.ownlang.parser;
22

3+
import com.annimon.ownlang.Console;
34
import com.annimon.ownlang.lib.Functions;
45
import com.annimon.ownlang.lib.NumberValue;
56
import com.annimon.ownlang.lib.Variables;
7+
import com.annimon.ownlang.outputsettings.OutputSettings;
8+
import com.annimon.ownlang.outputsettings.StringOutputSettings;
69
import com.annimon.ownlang.parser.ast.FunctionDefineStatement;
710
import com.annimon.ownlang.parser.ast.Statement;
811
import com.annimon.ownlang.parser.ast.Visitor;
@@ -94,6 +97,22 @@ public void testProgram() throws IOException {
9497
}
9598
}
9699

100+
@Test
101+
public void testOutput() throws IOException {
102+
OutputSettings oldSettings = Console.getSettings();
103+
Console.useSettings(new StringOutputSettings());
104+
String source = "for i = 0, i <= 5, i++\n print i";
105+
final Statement s = Parser.parse(Lexer.tokenize(source));
106+
try {
107+
s.execute();
108+
assertEquals("012345", Console.text());
109+
} catch (Exception oae) {
110+
Assert.fail(oae.toString());
111+
} finally {
112+
Console.useSettings(oldSettings);
113+
}
114+
}
115+
97116
private static Visitor testFunctionsExecutor = new AbstractVisitor() {
98117
@Override
99118
public void visit(FunctionDefineStatement s) {

0 commit comments

Comments
 (0)