Skip to content

Commit 9d18fe0

Browse files
authored
Merge pull request #3 from FalsePattern/test-update
Updated testing
2 parents 9c37ac9 + 52dbd60 commit 9d18fe0

File tree

10 files changed

+211
-91
lines changed

10 files changed

+211
-91
lines changed

.github/workflows/test.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
name: Java CI
2+
3+
on: [push]
4+
5+
jobs:
6+
build:
7+
runs-on: ubuntu-latest
8+
9+
steps:
10+
- uses: actions/checkout@v3
11+
- name: Set up JDK 17
12+
uses: actions/setup-java@v3
13+
with:
14+
distribution: 'adopt'
15+
java-version: '17'
16+
- name: Build with Maven
17+
run: mvn --batch-mode --update-snapshots package

pom.xml

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,16 @@
1111
<properties>
1212
<java.version>8</java.version>
1313
<lombok.version>1.18.22</lombok.version>
14-
<junit.version>5.8.2</junit.version>
1514
<trove.version>3.0.3</trove.version>
1615
<joml.version>1.10.2</joml.version>
1716
<project.encoding>UTF-8</project.encoding>
1817
<project.distribution.name>mavenpattern</project.distribution.name>
1918
<project.distribution.url>https://mvn.falsepattern.com/releases/</project.distribution.url>
2019
<project.mainclass>com.falsepattern.jfunge.Main</project.mainclass>
20+
21+
<!--Test deps -->
22+
<commons-io.version>2.11.0</commons-io.version>
23+
<junit.version>5.8.2</junit.version>
2124
</properties>
2225

2326
<dependencies>
@@ -27,12 +30,6 @@
2730
<version>${lombok.version}</version>
2831
<scope>provided</scope>
2932
</dependency>
30-
<dependency>
31-
<groupId>org.junit.jupiter</groupId>
32-
<artifactId>junit-jupiter-engine</artifactId>
33-
<version>${junit.version}</version>
34-
<scope>test</scope>
35-
</dependency>
3633
<dependency>
3734
<groupId>net.sf.trove4j</groupId>
3835
<artifactId>trove4j</artifactId>
@@ -43,6 +40,18 @@
4340
<artifactId>joml</artifactId>
4441
<version>${joml.version}</version>
4542
</dependency>
43+
<dependency>
44+
<groupId>org.junit.jupiter</groupId>
45+
<artifactId>junit-jupiter-engine</artifactId>
46+
<version>${junit.version}</version>
47+
<scope>test</scope>
48+
</dependency>
49+
<dependency>
50+
<groupId>commons-io</groupId>
51+
<artifactId>commons-io</artifactId>
52+
<version>${commons-io.version}</version>
53+
<scope>test</scope>
54+
</dependency>
4655
</dependencies>
4756

4857
<distributionManagement>

src/main/java/com/falsepattern/jfunge/interpreter/Interpreter.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@
1515
import java.io.OutputStream;
1616
import java.nio.file.Files;
1717
import java.nio.file.Paths;
18-
import java.util.*;
18+
import java.util.ArrayList;
19+
import java.util.Arrays;
20+
import java.util.Collections;
21+
import java.util.List;
22+
import java.util.Map;
1923

2024
@Accessors(fluent = true)
2125
public class Interpreter implements ExecutionContext {

src/main/java/com/falsepattern/jfunge/interpreter/instructions/Funge98.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,19 @@
22

33
import com.falsepattern.jfunge.Globals;
44
import com.falsepattern.jfunge.interpreter.ExecutionContext;
5-
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.*;
5+
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.Fingerprint;
6+
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.MODE;
7+
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.MODU;
8+
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.NULL;
9+
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.ROMA;
610
import com.falsepattern.jfunge.ip.Stack;
711
import gnu.trove.map.TIntObjectMap;
812
import gnu.trove.map.hash.TIntObjectHashMap;
9-
import lombok.*;
13+
import lombok.AccessLevel;
14+
import lombok.NoArgsConstructor;
15+
import lombok.SneakyThrows;
16+
import lombok.val;
17+
import lombok.var;
1018
import org.joml.Vector2i;
1119
import org.joml.Vector3i;
1220

src/main/java/com/falsepattern/jfunge/ip/Stack.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@
44
import gnu.trove.list.TIntList;
55
import gnu.trove.list.array.TIntArrayList;
66
import lombok.val;
7-
import org.joml.*;
7+
import org.joml.Vector2i;
8+
import org.joml.Vector2ic;
9+
import org.joml.Vector3i;
10+
import org.joml.Vector3ic;
11+
import org.joml.Vector4i;
12+
import org.joml.Vector4ic;
813

914
public class Stack implements Copiable<Stack> {
1015
private final TIntList storage;

src/main/java/com/falsepattern/jfunge/ip/StackStack.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package com.falsepattern.jfunge.ip;
22

33
import com.falsepattern.jfunge.Copiable;
4-
import lombok.*;
4+
import lombok.AccessLevel;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
import lombok.NonNull;
8+
import lombok.Setter;
59
import lombok.experimental.Accessors;
10+
import lombok.val;
611

712
import java.util.ArrayDeque;
813
import java.util.Deque;

src/main/java/com/falsepattern/jfunge/storage/FungeSpace.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,15 @@
1111

1212
import java.io.ByteArrayOutputStream;
1313

14-
import static com.falsepattern.jfunge.storage.Chunk.*;
14+
import static com.falsepattern.jfunge.storage.Chunk.fromChunkX;
15+
import static com.falsepattern.jfunge.storage.Chunk.fromChunkY;
16+
import static com.falsepattern.jfunge.storage.Chunk.fromChunkZ;
17+
import static com.falsepattern.jfunge.storage.Chunk.inChunkX;
18+
import static com.falsepattern.jfunge.storage.Chunk.inChunkY;
19+
import static com.falsepattern.jfunge.storage.Chunk.inChunkZ;
20+
import static com.falsepattern.jfunge.storage.Chunk.toChunkX;
21+
import static com.falsepattern.jfunge.storage.Chunk.toChunkY;
22+
import static com.falsepattern.jfunge.storage.Chunk.toChunkZ;
1523

1624
@RequiredArgsConstructor
1725
public class FungeSpace implements Copiable<FungeSpace> {

src/test/java/com/falsepattern/jfunge/storage/TestFungeSpace.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66

77
import java.nio.charset.StandardCharsets;
88

9-
import static com.falsepattern.jfunge.storage.Chunk.*;
9+
import static com.falsepattern.jfunge.storage.Chunk.CHUNK_EDGE_SIZE_X;
10+
import static com.falsepattern.jfunge.storage.Chunk.CHUNK_EDGE_SIZE_Y;
11+
import static com.falsepattern.jfunge.storage.Chunk.CHUNK_EDGE_SIZE_Z;
1012

1113
public class TestFungeSpace {
1214
private static int toPos(int fragment, int es) {
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package com.falsepattern.jfunge.storage;
2+
3+
import com.falsepattern.jfunge.interpreter.Interpreter;
4+
import lombok.val;
5+
import lombok.var;
6+
import org.apache.commons.io.output.TeeOutputStream;
7+
import org.junit.jupiter.api.Assertions;
8+
import org.junit.jupiter.api.Test;
9+
10+
import java.io.ByteArrayInputStream;
11+
import java.io.ByteArrayOutputStream;
12+
import java.io.FileNotFoundException;
13+
import java.io.IOException;
14+
import java.io.InputStream;
15+
import java.io.OutputStream;
16+
import java.nio.charset.StandardCharsets;
17+
import java.util.Arrays;
18+
import java.util.HashMap;
19+
import java.util.Map;
20+
21+
public class TestInterpreter {
22+
private static final Interpreter.FileIOSupplier fakeSupplier = new Interpreter.FileIOSupplier() {
23+
24+
private final Map<String, byte[]> files = new HashMap<>();
25+
26+
@Override
27+
public byte[] readFile(String file) throws IOException {
28+
if (files.containsKey(file)) {
29+
val b = files.get(file);
30+
return Arrays.copyOf(b, b.length);
31+
} else {
32+
try (val s = TestInterpreter.class.getResourceAsStream("/" + file)) {
33+
if (s == null) {
34+
throw new FileNotFoundException("Could not find resource " + file);
35+
}
36+
val ret = new ByteArrayOutputStream();
37+
val b = new byte[4096];
38+
var r = 0;
39+
while ((r = s.read(b)) > 0) {
40+
ret.write(b, 0, r);
41+
}
42+
val bytes = ret.toByteArray();
43+
files.put(file, bytes);
44+
return Arrays.copyOf(bytes, bytes.length);
45+
}
46+
}
47+
}
48+
49+
@Override
50+
public boolean writeFile(String file, byte[] data) {
51+
files.put(file, Arrays.copyOf(data, data.length));
52+
return true;
53+
}
54+
};
55+
56+
@SuppressWarnings("SameParameterValue")
57+
private static byte[] readProgram(String path) {
58+
val program = new ByteArrayOutputStream();
59+
Assertions.assertDoesNotThrow(() -> {
60+
val reader = TestInterpreter.class.getResourceAsStream(path);
61+
Assertions.assertNotNull(reader);
62+
var read = 0;
63+
val b = new byte[4096];
64+
while ((read = reader.read(b)) > 0) {
65+
program.write(b, 0, read);
66+
}
67+
});
68+
return program.toByteArray();
69+
}
70+
71+
private static int interpret(String[] args, byte[] code, int iterLimit, InputStream input, OutputStream output) {
72+
return Assertions.assertDoesNotThrow(() -> Interpreter.executeProgram(false, args, code, iterLimit, input, output, fakeSupplier));
73+
}
74+
75+
private static InputStream nullStream() {
76+
return new ByteArrayInputStream(new byte[0]);
77+
}
78+
79+
@Test
80+
public void testMycology() {
81+
val checkingOutput = new ByteArrayOutputStream();
82+
val output = new TeeOutputStream(checkingOutput, System.out);
83+
val program = readProgram("/mycology.b98");
84+
val returnCode = interpret(new String[]{"mycology.b98"}, program, 300000, nullStream(), output);
85+
val txt = checkingOutput.toString();
86+
String currentlyActiveFingerprint = null;
87+
boolean fingerprintHadError = false;
88+
boolean good = true;
89+
for (val line: txt.split("\n")) {
90+
if (line.startsWith("Testing fingerprint ")) {
91+
int start = "Testing fingerprint ".length();
92+
currentlyActiveFingerprint = line.substring(start, start + 4);
93+
fingerprintHadError = false;
94+
} else if (line.equals("About to test detailed () behaviour with two fingerprints.")) {
95+
//Fingerprint core checks are over, stop tracking.
96+
currentlyActiveFingerprint = null;
97+
fingerprintHadError = false;
98+
}
99+
if (line.startsWith("BAD")) {
100+
if (good) {
101+
System.err.println("Found BAD check(s) in Mycology! Interpreter is NOT standard-compliant.");
102+
good = false;
103+
}
104+
if (currentlyActiveFingerprint != null) {
105+
if (!fingerprintHadError) {
106+
System.err.println("Broken fingerprint: " + currentlyActiveFingerprint);
107+
fingerprintHadError = true;
108+
}
109+
} else {
110+
System.err.println("Not inside a fingerprint test, base language spec is broken. Fix urgently!");
111+
}
112+
System.err.print(" ");
113+
System.err.println(line);
114+
}
115+
}
116+
Assertions.assertTrue(good);
117+
Assertions.assertEquals(15, returnCode);
118+
}
119+
120+
@Test
121+
public void testSemicolonAtStart() {
122+
System.out.println("Testing edge case ;;.@");
123+
val output = new ByteArrayOutputStream();
124+
val returnCode = interpret(new String[0], ";;.@".getBytes(StandardCharsets.UTF_8), 50, nullStream(), output);
125+
val txt = output.toString();
126+
Assertions.assertEquals("0 ", txt);
127+
Assertions.assertEquals(0, returnCode);
128+
}
129+
130+
@Test
131+
public void testPutCharAtStart() {
132+
System.out.println("Testing edge case 'a,@");
133+
val output = new ByteArrayOutputStream();
134+
val returnCode = interpret(new String[0], "'a,@".getBytes(StandardCharsets.UTF_8), 50, nullStream(), output);
135+
val txt = output.toString();
136+
Assertions.assertEquals("a", txt);
137+
Assertions.assertEquals(0, returnCode);
138+
}
139+
}

src/test/java/com/falsepattern/jfunge/storage/TestMycology.java

Lines changed: 0 additions & 77 deletions
This file was deleted.

0 commit comments

Comments
 (0)