Skip to content

Commit

Permalink
Merge pull request #3 from FalsePattern/test-update
Browse files Browse the repository at this point in the history
Updated testing
  • Loading branch information
FalsePattern authored Oct 16, 2022
2 parents 9c37ac9 + 52dbd60 commit 9d18fe0
Show file tree
Hide file tree
Showing 10 changed files with 211 additions and 91 deletions.
17 changes: 17 additions & 0 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
name: Java CI

on: [push]

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'adopt'
java-version: '17'
- name: Build with Maven
run: mvn --batch-mode --update-snapshots package
23 changes: 16 additions & 7 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,16 @@
<properties>
<java.version>8</java.version>
<lombok.version>1.18.22</lombok.version>
<junit.version>5.8.2</junit.version>
<trove.version>3.0.3</trove.version>
<joml.version>1.10.2</joml.version>
<project.encoding>UTF-8</project.encoding>
<project.distribution.name>mavenpattern</project.distribution.name>
<project.distribution.url>https://mvn.falsepattern.com/releases/</project.distribution.url>
<project.mainclass>com.falsepattern.jfunge.Main</project.mainclass>

<!--Test deps -->
<commons-io.version>2.11.0</commons-io.version>
<junit.version>5.8.2</junit.version>
</properties>

<dependencies>
Expand All @@ -27,12 +30,6 @@
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.sf.trove4j</groupId>
<artifactId>trove4j</artifactId>
Expand All @@ -43,6 +40,18 @@
<artifactId>joml</artifactId>
<version>${joml.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
<scope>test</scope>
</dependency>
</dependencies>

<distributionManagement>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;

@Accessors(fluent = true)
public class Interpreter implements ExecutionContext {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,19 @@

import com.falsepattern.jfunge.Globals;
import com.falsepattern.jfunge.interpreter.ExecutionContext;
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.*;
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.Fingerprint;
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.MODE;
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.MODU;
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.NULL;
import com.falsepattern.jfunge.interpreter.instructions.fingerprints.ROMA;
import com.falsepattern.jfunge.ip.Stack;
import gnu.trove.map.TIntObjectMap;
import gnu.trove.map.hash.TIntObjectHashMap;
import lombok.*;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.SneakyThrows;
import lombok.val;
import lombok.var;
import org.joml.Vector2i;
import org.joml.Vector3i;

Expand Down
7 changes: 6 additions & 1 deletion src/main/java/com/falsepattern/jfunge/ip/Stack.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@
import gnu.trove.list.TIntList;
import gnu.trove.list.array.TIntArrayList;
import lombok.val;
import org.joml.*;
import org.joml.Vector2i;
import org.joml.Vector2ic;
import org.joml.Vector3i;
import org.joml.Vector3ic;
import org.joml.Vector4i;
import org.joml.Vector4ic;

public class Stack implements Copiable<Stack> {
private final TIntList storage;
Expand Down
7 changes: 6 additions & 1 deletion src/main/java/com/falsepattern/jfunge/ip/StackStack.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package com.falsepattern.jfunge.ip;

import com.falsepattern.jfunge.Copiable;
import lombok.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.Setter;
import lombok.experimental.Accessors;
import lombok.val;

import java.util.ArrayDeque;
import java.util.Deque;
Expand Down
10 changes: 9 additions & 1 deletion src/main/java/com/falsepattern/jfunge/storage/FungeSpace.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,15 @@

import java.io.ByteArrayOutputStream;

import static com.falsepattern.jfunge.storage.Chunk.*;
import static com.falsepattern.jfunge.storage.Chunk.fromChunkX;
import static com.falsepattern.jfunge.storage.Chunk.fromChunkY;
import static com.falsepattern.jfunge.storage.Chunk.fromChunkZ;
import static com.falsepattern.jfunge.storage.Chunk.inChunkX;
import static com.falsepattern.jfunge.storage.Chunk.inChunkY;
import static com.falsepattern.jfunge.storage.Chunk.inChunkZ;
import static com.falsepattern.jfunge.storage.Chunk.toChunkX;
import static com.falsepattern.jfunge.storage.Chunk.toChunkY;
import static com.falsepattern.jfunge.storage.Chunk.toChunkZ;

@RequiredArgsConstructor
public class FungeSpace implements Copiable<FungeSpace> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@

import java.nio.charset.StandardCharsets;

import static com.falsepattern.jfunge.storage.Chunk.*;
import static com.falsepattern.jfunge.storage.Chunk.CHUNK_EDGE_SIZE_X;
import static com.falsepattern.jfunge.storage.Chunk.CHUNK_EDGE_SIZE_Y;
import static com.falsepattern.jfunge.storage.Chunk.CHUNK_EDGE_SIZE_Z;

public class TestFungeSpace {
private static int toPos(int fragment, int es) {
Expand Down
139 changes: 139 additions & 0 deletions src/test/java/com/falsepattern/jfunge/storage/TestInterpreter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
package com.falsepattern.jfunge.storage;

import com.falsepattern.jfunge.interpreter.Interpreter;
import lombok.val;
import lombok.var;
import org.apache.commons.io.output.TeeOutputStream;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class TestInterpreter {
private static final Interpreter.FileIOSupplier fakeSupplier = new Interpreter.FileIOSupplier() {

private final Map<String, byte[]> files = new HashMap<>();

@Override
public byte[] readFile(String file) throws IOException {
if (files.containsKey(file)) {
val b = files.get(file);
return Arrays.copyOf(b, b.length);
} else {
try (val s = TestInterpreter.class.getResourceAsStream("/" + file)) {
if (s == null) {
throw new FileNotFoundException("Could not find resource " + file);
}
val ret = new ByteArrayOutputStream();
val b = new byte[4096];
var r = 0;
while ((r = s.read(b)) > 0) {
ret.write(b, 0, r);
}
val bytes = ret.toByteArray();
files.put(file, bytes);
return Arrays.copyOf(bytes, bytes.length);
}
}
}

@Override
public boolean writeFile(String file, byte[] data) {
files.put(file, Arrays.copyOf(data, data.length));
return true;
}
};

@SuppressWarnings("SameParameterValue")
private static byte[] readProgram(String path) {
val program = new ByteArrayOutputStream();
Assertions.assertDoesNotThrow(() -> {
val reader = TestInterpreter.class.getResourceAsStream(path);
Assertions.assertNotNull(reader);
var read = 0;
val b = new byte[4096];
while ((read = reader.read(b)) > 0) {
program.write(b, 0, read);
}
});
return program.toByteArray();
}

private static int interpret(String[] args, byte[] code, int iterLimit, InputStream input, OutputStream output) {
return Assertions.assertDoesNotThrow(() -> Interpreter.executeProgram(false, args, code, iterLimit, input, output, fakeSupplier));
}

private static InputStream nullStream() {
return new ByteArrayInputStream(new byte[0]);
}

@Test
public void testMycology() {
val checkingOutput = new ByteArrayOutputStream();
val output = new TeeOutputStream(checkingOutput, System.out);
val program = readProgram("/mycology.b98");
val returnCode = interpret(new String[]{"mycology.b98"}, program, 300000, nullStream(), output);
val txt = checkingOutput.toString();
String currentlyActiveFingerprint = null;
boolean fingerprintHadError = false;
boolean good = true;
for (val line: txt.split("\n")) {
if (line.startsWith("Testing fingerprint ")) {
int start = "Testing fingerprint ".length();
currentlyActiveFingerprint = line.substring(start, start + 4);
fingerprintHadError = false;
} else if (line.equals("About to test detailed () behaviour with two fingerprints.")) {
//Fingerprint core checks are over, stop tracking.
currentlyActiveFingerprint = null;
fingerprintHadError = false;
}
if (line.startsWith("BAD")) {
if (good) {
System.err.println("Found BAD check(s) in Mycology! Interpreter is NOT standard-compliant.");
good = false;
}
if (currentlyActiveFingerprint != null) {
if (!fingerprintHadError) {
System.err.println("Broken fingerprint: " + currentlyActiveFingerprint);
fingerprintHadError = true;
}
} else {
System.err.println("Not inside a fingerprint test, base language spec is broken. Fix urgently!");
}
System.err.print(" ");
System.err.println(line);
}
}
Assertions.assertTrue(good);
Assertions.assertEquals(15, returnCode);
}

@Test
public void testSemicolonAtStart() {
System.out.println("Testing edge case ;;.@");
val output = new ByteArrayOutputStream();
val returnCode = interpret(new String[0], ";;.@".getBytes(StandardCharsets.UTF_8), 50, nullStream(), output);
val txt = output.toString();
Assertions.assertEquals("0 ", txt);
Assertions.assertEquals(0, returnCode);
}

@Test
public void testPutCharAtStart() {
System.out.println("Testing edge case 'a,@");
val output = new ByteArrayOutputStream();
val returnCode = interpret(new String[0], "'a,@".getBytes(StandardCharsets.UTF_8), 50, nullStream(), output);
val txt = output.toString();
Assertions.assertEquals("a", txt);
Assertions.assertEquals(0, returnCode);
}
}
77 changes: 0 additions & 77 deletions src/test/java/com/falsepattern/jfunge/storage/TestMycology.java

This file was deleted.

0 comments on commit 9d18fe0

Please sign in to comment.