Added minimal testsuite for IC

- main.c will now report errors for passed scripts
This commit is contained in:
CPunch 2021-03-19 22:23:04 -05:00 committed by cpunch
parent 0e730b9c51
commit d761970f17
2 changed files with 57 additions and 4 deletions

45
examples/testsuite.cosmo Normal file
View File

@ -0,0 +1,45 @@
/*
This script tests cosmo and makes sure everything still runs correctly. Pretty minimal for now
*/
print("starting Testsuite...")
// tests the string.* library
assert("Hello world!":sub(6) == "world!", "string.sub() failed!")
assert("A":rep(6) == "AAAAAA", "string.red() failed!")
// tests some basic PEMDAS arithmetic
assert(2 * (2 + 6) == 16, "PEMDAS check #1 failed!")
assert(2 / 5 + 3 / 5 == 1, "PEMDAS check #2 failed!")
// iterator test
proto Range
function __init(self, x)
self.max = x
end
function __iter(self)
self.i = 0
return self
end
function __next(self)
if self.i >= self.max then
return nil // exit iterator loop
end
return self.i++
end
end
var total = 0
for i in Range(100) do
total = total + i
end
assert(total == 4950, "Iterator check failed!")
print("Testsuite passed!")

16
main.c
View File

@ -31,7 +31,9 @@ int cosmoB_input(CState *state, int nargs, CValue *args) {
return 1; // 1 return value return 1; // 1 return value
} }
static void interpret(CState *state, const char *script, const char *mod) { static bool interpret(CState *state, const char *script, const char *mod) {
bool ret;
// cosmoV_compileString pushes the result onto the stack (COBJ_ERROR or COBJ_CLOSURE) // cosmoV_compileString pushes the result onto the stack (COBJ_ERROR or COBJ_CLOSURE)
if (cosmoV_compileString(state, script, mod)) { if (cosmoV_compileString(state, script, mod)) {
COSMOVMRESULT res = cosmoV_call(state, 0, 0); // 0 args being passed, 0 results expected COSMOVMRESULT res = cosmoV_call(state, 0, 0); // 0 args being passed, 0 results expected
@ -43,7 +45,9 @@ static void interpret(CState *state, const char *script, const char *mod) {
cosmoV_printError(state, state->error); cosmoV_printError(state, state->error);
} }
ret = state->panic;
state->panic = false; // so our repl isn't broken state->panic = false; // so our repl isn't broken
return !ret;
} }
static void repl() { static void repl() {
@ -110,7 +114,8 @@ static char *readFile(const char* path) {
return buffer; return buffer;
} }
static void runFile(const char* fileName) { static bool runFile(const char* fileName) {
bool ret;
char* script = readFile(fileName); char* script = readFile(fileName);
CState *state = cosmoV_newState(); CState *state = cosmoV_newState();
cosmoB_loadLibrary(state); cosmoB_loadLibrary(state);
@ -122,10 +127,11 @@ static void runFile(const char* fileName) {
cosmoV_register(state, 1); cosmoV_register(state, 1);
interpret(state, script, fileName); ret = interpret(state, script, fileName);
cosmoV_freeState(state); cosmoV_freeState(state);
free(script); free(script);
return ret; // let the caller know if the script failed
} }
int main(int argc, const char *argv[]) { int main(int argc, const char *argv[]) {
@ -133,7 +139,9 @@ int main(int argc, const char *argv[]) {
repl(); repl();
} else if (argc >= 2) { // they passed a file (or more lol) } else if (argc >= 2) { // they passed a file (or more lol)
for (int i = 1; i < argc; i++) { for (int i = 1; i < argc; i++) {
runFile(argv[i]); if (!runFile(argv[i])) {
exit(EXIT_FAILURE);
}
} }
} }