Rename directory "engines" to "languages"
This commit is contained in:
96
languages/befunge93/tests/index.test.ts
Normal file
96
languages/befunge93/tests/index.test.ts
Normal file
@ -0,0 +1,96 @@
|
||||
import { readTestProgram, executeProgram } from "../../test-utils";
|
||||
import { Bfg93Direction } from "../constants";
|
||||
import Engine from "../runtime";
|
||||
|
||||
/**
|
||||
* All test programs are picked up from https://esolangs.org/wiki/Befunge,
|
||||
* except the modifications mentioned alongside each test.
|
||||
*/
|
||||
|
||||
/** Relative path to directory of sample programs */
|
||||
const DIRNAME = __dirname + "/samples";
|
||||
|
||||
describe("Test programs", () => {
|
||||
// Standard hello-world program
|
||||
test("hello world", async () => {
|
||||
const code = readTestProgram(DIRNAME, "helloworld");
|
||||
const result = await executeProgram(new Engine(), code);
|
||||
expect(result.output.charCodeAt(result.output.length - 1)).toBe(0);
|
||||
expect(result.output.slice(0, -1)).toBe("Hello, World!");
|
||||
expect(result.rendererState.direction).toBe(Bfg93Direction.DOWN);
|
||||
expect(result.rendererState.stack.length).toBe(0);
|
||||
});
|
||||
|
||||
// cat program
|
||||
test("cat program", async () => {
|
||||
const input = "abcd efgh\nijkl mnop\n";
|
||||
const code = readTestProgram(DIRNAME, "cat");
|
||||
const result = await executeProgram(new Engine(), code, input);
|
||||
expect(result.output).toBe(input);
|
||||
expect(result.rendererState.direction).toBe(Bfg93Direction.LEFT);
|
||||
expect(result.rendererState.stack).toEqual([-1]);
|
||||
});
|
||||
|
||||
// Random DNA printer
|
||||
test("random DNA", async () => {
|
||||
const code = readTestProgram(DIRNAME, "dna");
|
||||
const result = await executeProgram(new Engine(), code);
|
||||
// program prints "\r\n" at the end of output
|
||||
expect(result.output.length).toBe(56 + 2);
|
||||
expect(result.output.trim().search(/[^ATGC]/)).toBe(-1);
|
||||
expect(result.rendererState.direction).toBe(Bfg93Direction.RIGHT);
|
||||
expect(result.rendererState.stack).toEqual([0]);
|
||||
});
|
||||
|
||||
// Factorial program
|
||||
test("factorial", async () => {
|
||||
const code = readTestProgram(DIRNAME, "factorial");
|
||||
const result = await executeProgram(new Engine(), code, "5");
|
||||
expect(result.output).toBe("120 ");
|
||||
expect(result.rendererState.direction).toBe(Bfg93Direction.RIGHT);
|
||||
expect(result.rendererState.stack.length).toBe(0);
|
||||
});
|
||||
|
||||
// Sieve of Eratosthenes - prints prime nums upto 36
|
||||
// (original prints up to 80, shortened here for testing purposes)
|
||||
test("sieve of eratosthenes", async () => {
|
||||
const code = readTestProgram(DIRNAME, "prime-sieve");
|
||||
const result = await executeProgram(new Engine(), code);
|
||||
const outputNums = result.output
|
||||
.trim()
|
||||
.split(" ")
|
||||
.map((a) => parseInt(a, 10));
|
||||
const primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31];
|
||||
expect(outputNums).toEqual(primes);
|
||||
expect(result.rendererState.direction).toBe(Bfg93Direction.DOWN);
|
||||
expect(result.rendererState.stack).toEqual([37]);
|
||||
});
|
||||
|
||||
// Quine 1 - simple single-line quine
|
||||
test("simple singleline quine", async () => {
|
||||
const code = readTestProgram(DIRNAME, "quine1");
|
||||
const result = await executeProgram(new Engine(), code);
|
||||
expect(result.output).toBe(code);
|
||||
expect(result.rendererState.direction).toBe(Bfg93Direction.RIGHT);
|
||||
expect(result.rendererState.stack).toEqual([44]);
|
||||
});
|
||||
|
||||
// Quine 2 - multiline quine
|
||||
test("multiline quine", async () => {
|
||||
const code = readTestProgram(DIRNAME, "quine2");
|
||||
const result = await executeProgram(new Engine(), code);
|
||||
// Output has an extra space at the end - verified on tio.run
|
||||
expect(result.output).toBe(code + " ");
|
||||
expect(result.rendererState.direction).toBe(Bfg93Direction.LEFT);
|
||||
expect(result.rendererState.stack).toEqual([0]);
|
||||
});
|
||||
|
||||
// Quine 3 - quine without using "g"
|
||||
test("quine without using 'g'", async () => {
|
||||
const code = readTestProgram(DIRNAME, "quine3");
|
||||
const result = await executeProgram(new Engine(), code);
|
||||
expect(result.output).toBe(code);
|
||||
expect(result.rendererState.direction).toBe(Bfg93Direction.LEFT);
|
||||
expect(result.rendererState.stack).toEqual([0]);
|
||||
});
|
||||
});
|
1
languages/befunge93/tests/samples/cat.txt
Normal file
1
languages/befunge93/tests/samples/cat.txt
Normal file
@ -0,0 +1 @@
|
||||
~:1+!#@_,
|
8
languages/befunge93/tests/samples/dna.txt
Normal file
8
languages/befunge93/tests/samples/dna.txt
Normal file
@ -0,0 +1,8 @@
|
||||
7^DN>vA
|
||||
v_#v? v
|
||||
7^<""""
|
||||
3 ACGT
|
||||
90!""""
|
||||
4*:>>>v
|
||||
+8^-1,<
|
||||
> ,+,@)
|
2
languages/befunge93/tests/samples/factorial.txt
Normal file
2
languages/befunge93/tests/samples/factorial.txt
Normal file
@ -0,0 +1,2 @@
|
||||
&>:1-:v v *_$.@
|
||||
^ _$>\:^
|
3
languages/befunge93/tests/samples/helloworld.txt
Normal file
3
languages/befunge93/tests/samples/helloworld.txt
Normal file
@ -0,0 +1,3 @@
|
||||
"!dlroW ,olleH">:v
|
||||
|,<
|
||||
@
|
4
languages/befunge93/tests/samples/prime-sieve.txt
Normal file
4
languages/befunge93/tests/samples/prime-sieve.txt
Normal file
@ -0,0 +1,4 @@
|
||||
2>:3g" "-!v\ g30 <
|
||||
|!`"$":+1_:.:03p>03g+:"$"`|
|
||||
@ ^ p3\" ":<
|
||||
2 234567890123456789012345678901234567890123456789012345678901234567890123456789
|
1
languages/befunge93/tests/samples/quine1.txt
Normal file
1
languages/befunge93/tests/samples/quine1.txt
Normal file
@ -0,0 +1 @@
|
||||
01->1# +# :# 0# g# ,# :# 5# 8# *# 4# +# -# _@
|
2
languages/befunge93/tests/samples/quine2.txt
Normal file
2
languages/befunge93/tests/samples/quine2.txt
Normal file
@ -0,0 +1,2 @@
|
||||
0 v
|
||||
"<@_ #! #: #,<*2-1*92,*84,*25,+*92*4*55.0
|
1
languages/befunge93/tests/samples/quine3.txt
Normal file
1
languages/befunge93/tests/samples/quine3.txt
Normal file
@ -0,0 +1 @@
|
||||
<@,+2*48_,#! #:<,_$#-:#*8#4<8"
|
Reference in New Issue
Block a user