Add Befunge-93
This commit is contained in:
		
							
								
								
									
										96
									
								
								engines/befunge93/tests/index.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								engines/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
									
								
								engines/befunge93/tests/samples/cat.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								engines/befunge93/tests/samples/cat.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
~:1+!#@_,
 | 
			
		||||
							
								
								
									
										8
									
								
								engines/befunge93/tests/samples/dna.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								engines/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
									
								
								engines/befunge93/tests/samples/factorial.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								engines/befunge93/tests/samples/factorial.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
&>:1-:v v *_$.@ 
 | 
			
		||||
 ^    _$>\:^
 | 
			
		||||
							
								
								
									
										3
									
								
								engines/befunge93/tests/samples/helloworld.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								engines/befunge93/tests/samples/helloworld.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
"!dlroW ,olleH">:v
 | 
			
		||||
               |,<
 | 
			
		||||
               @
 | 
			
		||||
							
								
								
									
										4
									
								
								engines/befunge93/tests/samples/prime-sieve.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								engines/befunge93/tests/samples/prime-sieve.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,4 @@
 | 
			
		||||
2>:3g" "-!v\  g30          <
 | 
			
		||||
 |!`"$":+1_:.:03p>03g+:"$"`|
 | 
			
		||||
 @               ^  p3\" ":<
 | 
			
		||||
2 234567890123456789012345678901234567890123456789012345678901234567890123456789
 | 
			
		||||
							
								
								
									
										1
									
								
								engines/befunge93/tests/samples/quine1.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								engines/befunge93/tests/samples/quine1.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
01->1# +# :# 0# g# ,# :# 5# 8# *# 4# +# -# _@
 | 
			
		||||
							
								
								
									
										2
									
								
								engines/befunge93/tests/samples/quine2.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								engines/befunge93/tests/samples/quine2.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
0 v
 | 
			
		||||
 "<@_ #! #: #,<*2-1*92,*84,*25,+*92*4*55.0                                      
 | 
			
		||||
							
								
								
									
										1
									
								
								engines/befunge93/tests/samples/quine3.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								engines/befunge93/tests/samples/quine3.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
<@,+2*48_,#! #:<,_$#-:#*8#4<8"
 | 
			
		||||
		Reference in New Issue
	
	Block a user