mirror of
https://github.com/samsonjs/elisp.js.git
synced 2026-03-25 09:15:49 +00:00
Started some basic functional tests. Need to choose a real test suite.
This commit is contained in:
parent
bfa09931e9
commit
fe67ea2e82
2 changed files with 194 additions and 0 deletions
3
test.sh
Executable file
3
test.sh
Executable file
|
|
@ -0,0 +1,3 @@
|
|||
#!/bin/sh
|
||||
|
||||
NARWHAL_ENGINE=jsc js test/test.js
|
||||
191
test/test.js
Normal file
191
test/test.js
Normal file
|
|
@ -0,0 +1,191 @@
|
|||
// A basic test of the whole interpreter.
|
||||
|
||||
require.paths.unshift('.'); // expected to be run from project root!
|
||||
|
||||
var elisp = require('elisp'),
|
||||
type = elisp.type,
|
||||
LispSymbol = type.LispSymbol,
|
||||
LispString = type.LispString,
|
||||
LispNumber = type.LispNumber,
|
||||
LispCons = type.LispCons,
|
||||
T = type.T,
|
||||
NIL = type.NIL,
|
||||
ok = true;
|
||||
|
||||
var test = function(name, code, expected) {
|
||||
//print(' * ' + name + ' :: ' + code);
|
||||
var result = elisp.repl.eval(code),
|
||||
success = result === expected || result && result.eq(expected);
|
||||
if (!success) {
|
||||
//print(' * ' + name + ' :: ' + code);
|
||||
print('*** FAILED result: ' + (result ? result.repr() : '(null)') +
|
||||
' expected: ' + (expected ? expected.repr() : '(null)'));
|
||||
ok = false;
|
||||
}
|
||||
return success;
|
||||
};
|
||||
|
||||
|
||||
/////////
|
||||
// Nil //
|
||||
/////////
|
||||
|
||||
print('---- Testing Nil ----');
|
||||
|
||||
test('Empty quoted list', "'()", elisp.NIL);
|
||||
test('Nil symbol', "'nil", elisp.NIL);
|
||||
test('Nil constant', "nil", elisp.NIL);
|
||||
|
||||
|
||||
/////////////
|
||||
// Numbers //
|
||||
/////////////
|
||||
|
||||
print('---- Testing Numbers ----');
|
||||
|
||||
test('Positive Zero', '+0', new LispNumber(0));
|
||||
test('Negative Zero', '-0', new LispNumber(0));
|
||||
|
||||
test('Simple Integer', '42', new LispNumber(42));
|
||||
test('Positive Integer', '+42', new LispNumber(42));
|
||||
test('Negative Integer', '-42', new LispNumber(-42));
|
||||
|
||||
test('Simple Integer w/ Exponent', '42e2', new LispNumber(4200));
|
||||
test('Positive Integer w/ Exponent', '+42e2', new LispNumber(4200));
|
||||
test('Negative Integer w/ Exponent', '-42e2', new LispNumber(-4200));
|
||||
|
||||
test('Simple Integer w/ Negative Exponent', '42e-2', new LispNumber(0.42));
|
||||
test('Positive Integer w/ Negative Exponent', '+42e-2', new LispNumber(0.42));
|
||||
test('Negative Integer w/ Negative Exponent', '-42e-2', new LispNumber(-0.42));
|
||||
|
||||
test('Simple Float', '123.456', new LispNumber(123.456));
|
||||
test('Positive Float', '+123.456', new LispNumber(123.456));
|
||||
test('Negative Float', '-123.456', new LispNumber(-123.456));
|
||||
|
||||
test('Fraction-only Float', '.456', new LispNumber(0.456));
|
||||
test('Fraction-only Positive Float', '+.456', new LispNumber(0.456));
|
||||
test('Fraction-only Negative Float', '-.456', new LispNumber(-0.456));
|
||||
|
||||
test('Simple Float w/ Exponent', '123.456e2', new LispNumber(12345.6));
|
||||
test('Positive Float w/ Exponent', '+123.456e2', new LispNumber(12345.6));
|
||||
test('Negative Float w/ Exponent', '-123.456e2', new LispNumber(-12345.6));
|
||||
|
||||
test('Simple Float w/ Negative Exponent', '123.456e-2', new LispNumber(1.23456));
|
||||
test('Positive Float w/ Negative Exponent', '+123.456e-2', new LispNumber(1.23456));
|
||||
test('Negative Float w/ Negative Exponent', '-123.456e-2', new LispNumber(-1.23456));
|
||||
|
||||
|
||||
/////////////
|
||||
// Symbols //
|
||||
/////////////
|
||||
|
||||
print('---- Testing Symbols ----');
|
||||
|
||||
test('Simple Symbol', "'i-am-a-symbol", new LispSymbol('i-am-a-symbol'));
|
||||
|
||||
|
||||
/////////////
|
||||
// Strings //
|
||||
/////////////
|
||||
|
||||
print('---- Testing Strings ----');
|
||||
|
||||
test('Simple String', '"Hello, world!"', new LispString('Hello, world!'));
|
||||
test('String w/ Quotes', '"Hello, \\"world\\"!"', new LispString('Hello, "world"!'));
|
||||
|
||||
|
||||
/////////////
|
||||
// Lambdas //
|
||||
/////////////
|
||||
|
||||
print('---- Testing Lambdas ----');
|
||||
|
||||
// TODO
|
||||
|
||||
|
||||
////////////////
|
||||
// Primitives //
|
||||
////////////////
|
||||
|
||||
print('---- Testing Primitives ----');
|
||||
|
||||
|
||||
// arithmetic
|
||||
|
||||
test('(+)', '(+)', new LispNumber(0));
|
||||
test('(+ 5)', '(+ 5)', new LispNumber(5));
|
||||
test('(+ 5 10 15)', '(+ 5 10 15)', new LispNumber(30));
|
||||
|
||||
test('(-)', '(-)', new LispNumber(0));
|
||||
test('(- 5)', '(- 5)', new LispNumber(-5));
|
||||
test('(- 15 10 5)', '(- 15 10 5)', new LispNumber(0));
|
||||
|
||||
test('(*)', '(*)', new LispNumber(1));
|
||||
test('(* 5)', '(* 5)', new LispNumber(5));
|
||||
test('(* 5 5)', '(* 5 5)', new LispNumber(25));
|
||||
test('(* 5 5 5)', '(* 5 5 5)', new LispNumber(125));
|
||||
|
||||
////
|
||||
// need not test these every time until the test output isn't
|
||||
// screwed up with division error messages
|
||||
////
|
||||
// test('(/)', '(/)', null); // error, or will be in any case
|
||||
// test('(/ 5)', '(/ 5)', null); // error
|
||||
////
|
||||
test('(/ 125 5)', '(/ 125 5)', new LispNumber(25));
|
||||
test('(/ 125 5 5)', '(/ 125 5 5)', new LispNumber(5));
|
||||
|
||||
|
||||
// consp
|
||||
|
||||
// atom
|
||||
|
||||
// symbol-name
|
||||
|
||||
// string-match
|
||||
|
||||
// print
|
||||
|
||||
// hide-prompt
|
||||
|
||||
|
||||
///////////////////
|
||||
// Special Forms //
|
||||
///////////////////
|
||||
|
||||
print('---- Testing Special Forms ----');
|
||||
|
||||
|
||||
// quote
|
||||
|
||||
var cons = new LispCons(new LispSymbol('foo'), elisp.NIL);
|
||||
test('Simple Quoted Expression', "'(foo)", cons);
|
||||
|
||||
var diff = elisp.type.mkList([new LispSymbol('-'), new LispNumber(5), new LispNumber(2)]),
|
||||
prod = elisp.type.mkList([new LispSymbol('*'), new LispNumber(17), new LispNumber(5)]);
|
||||
cons = elisp.type.mkList([new LispSymbol('+'), diff, prod]);
|
||||
test('Nested Quoted Expression', "'(+ (- 5 2) (* 17 5))", cons);
|
||||
|
||||
|
||||
// defvar
|
||||
|
||||
// defun
|
||||
|
||||
// set
|
||||
|
||||
// setq
|
||||
|
||||
// cond
|
||||
|
||||
// if
|
||||
|
||||
|
||||
// done, print overall status
|
||||
|
||||
print('');
|
||||
if (ok) {
|
||||
print('all ok :)');
|
||||
}
|
||||
else {
|
||||
print('***** TESTS FAILED *****');
|
||||
}
|
||||
Loading…
Reference in a new issue