You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.1 KiB
119 lines
3.1 KiB
15 years ago
|
/*
|
||
|
* TinyJS
|
||
|
*
|
||
|
* A single-file Javascript-alike engine
|
||
|
*
|
||
|
* Authored By Gordon Williams <gw@pur3.co.uk>
|
||
|
*
|
||
|
* Copyright (C) 2009 Pur3 Ltd
|
||
|
*
|
||
|
* This library is free software; you can redistribute it and/or
|
||
|
* modify it under the terms of the GNU Lesser General Public
|
||
|
* License as published by the Free Software Foundation; either
|
||
|
* version 2 of the License, or (at your option) any later version.
|
||
|
*
|
||
|
* This library is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
|
* Lesser General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU Lesser General Public
|
||
|
* License along with this library; if not, write to the
|
||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||
|
* Boston, MA 02111-1307, USA.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* This is a program to run all the tests in the tests folder...
|
||
|
*/
|
||
|
|
||
|
#include <assert.h>
|
||
|
#include <sys/stat.h>
|
||
|
#include <string>
|
||
|
#include <sstream>
|
||
|
|
||
|
#include "TinyJS.h"
|
||
|
#include "TinyJS_Functions.h"
|
||
|
|
||
|
bool run_test(const char *filename) {
|
||
|
printf("TEST %s ", filename);
|
||
|
struct stat results;
|
||
|
if (!stat(filename, &results) == 0) {
|
||
|
printf("Cannot stat file! '%s'\n", filename);
|
||
|
return false;
|
||
|
}
|
||
|
int size = results.st_size;
|
||
|
FILE *file = fopen( filename, "rb" );
|
||
|
/* if we open as text, the number of bytes read may be > the size we read */
|
||
|
if( !file ) {
|
||
|
printf("Unable to open file! '%s'\n", filename);
|
||
|
return false;
|
||
|
}
|
||
|
char *buffer = new char[size+1];
|
||
|
long actualRead = fread(buffer,1,size,file);
|
||
|
buffer[actualRead]=0;
|
||
|
buffer[size]=0;
|
||
|
fclose(file);
|
||
|
|
||
|
CTinyJS s;
|
||
|
s.root->addChild(new CScriptVar("result","0",SCRIPTVAR_INTEGER));
|
||
|
try {
|
||
|
s.execute(buffer);
|
||
|
} catch (CScriptException *e) {
|
||
|
printf("ERROR: %s\n", e->text.c_str());
|
||
|
}
|
||
|
bool pass = s.root->findChildOrCreate("result")->getBool();
|
||
|
|
||
|
if (pass)
|
||
|
printf("PASS\n");
|
||
|
else {
|
||
|
char fn[64];
|
||
|
sprintf(fn, "%s.fail.js", filename);
|
||
|
FILE *f = fopen(fn, "wt");
|
||
|
if (f) {
|
||
|
std::ostringstream symbols;
|
||
|
s.root->getJSON(symbols);
|
||
|
fprintf(f, "%s", symbols.str().c_str());
|
||
|
fclose(f);
|
||
|
}
|
||
|
|
||
|
printf("FAIL - symbols written to %s\n", fn);
|
||
|
}
|
||
|
|
||
|
delete[] buffer;
|
||
|
return pass;
|
||
|
}
|
||
|
|
||
|
int main(int argc, char **argv)
|
||
|
{
|
||
|
printf("TinyJS test runner\n");
|
||
|
printf("USAGE:\n");
|
||
|
printf(" ./run_tests test.js : run just one test\n");
|
||
|
printf(" ./run_tests : run all tests\n");
|
||
|
if (argc==2) {
|
||
|
return !run_test(argv[1]);
|
||
|
}
|
||
|
|
||
|
int test_num = 1;
|
||
|
int count = 0;
|
||
|
int passed = 0;
|
||
|
|
||
|
while (test_num<1000) {
|
||
|
char fn[32];
|
||
|
sprintf(fn, "tests/test%03d.js", test_num);
|
||
|
// check if the file exists - if not, assume we're at the end of our tests
|
||
|
FILE *f = fopen(fn,"r");
|
||
|
if (!f) break;
|
||
|
fclose(f);
|
||
|
|
||
|
if (run_test(fn))
|
||
|
passed++;
|
||
|
count++;
|
||
|
test_num++;
|
||
|
}
|
||
|
|
||
|
printf("Done. %d tests, %d pass, %d fail\n", count, passed, count-passed);
|
||
|
|
||
|
return 0;
|
||
|
}
|