This commit is contained in:
Ilusha 2024-03-14 09:00:14 +03:00 committed by Ilya Shurupov
parent 101ef375ef
commit 5c7ee99d43
32 changed files with 232 additions and 2023 deletions

View file

@ -1,6 +1,9 @@
#include "Testing.hpp"
#include "Module.hpp"
#include "primitives/primitives.h"
#include <UnitTest++/UnitTest++.h>
#include <UnitTest++/TestReporterStdout.h>
extern tp::ModuleManifest objTestModule;
extern tp::ModuleManifest objTestModule;
#define TEST_OFF(name) static void name()

View file

@ -2,6 +2,7 @@
#include "ObjectTests.hpp"
#include "compiler/function.h"
#include "parser/parser.h"
#include "core/object.h"
#include "interpreter/interpreter.h"
#include "primitives/interpreterobject.h"
@ -11,47 +12,51 @@
using namespace tp;
using namespace obj;
TEST_DEF_STATIC(Basic) {
{
// no errors
auto method = NDO_CAST(MethodObject, NDO->create("method"));
SUITE(Compiler) {
TEST(Basic) {
objTestModule.initialize();
method->mScript->mReadable->val = "print 1 * 20 + 10;";
method->compile();
{
// no errors
auto method = NDO_CAST(MethodObject, NDO->create("method"));
NDO->destroy(method);
method->mScript->mReadable->val = "print 1 * 20 + 10;";
method->compile();
assertNoLeaks();
}
NDO->destroy(method);
{
// with errors
auto method = NDO_CAST(MethodObject, NDO->create("method"));
assertNoLeaks();
}
method->mScript->mReadable->val = "print undefinedVariable;";
method->compile();
{
// with errors
auto method = NDO_CAST(MethodObject, NDO->create("method"));
NDO->destroy(method);
method->mScript->mReadable->val = "print undefinedVariable;";
method->compile();
assertNoLeaks();
}
}
NDO->destroy(method);
TEST_DEF_STATIC(ErrorHandling) {
Parser parser;
assertNoLeaks();
}
String stream = "var i = true; print (i + 1) * 10; invalidCharacter ";
auto res = parser.parse(stream);
TEST(res.isError);
delete res.scope;
}
TEST_DEF(Compiler) {
if (objTestModule.initialize()) {
testBasic();
testErrorHandling();
objTestModule.deinitialize();
}
}
/*
TEST(ErrorHandling) {
objTestModule.initialize();
obj::Parser parser;
String stream = "var i = true; print (i + 1) * 10; invalidCharacter ";
auto res = parser.parse(stream);
CHECK(res.isError);
delete res.scope;
objTestModule.deinitialize();
}
*/
}

View file

@ -8,29 +8,30 @@
using namespace tp;
using namespace obj;
TEST_DEF_STATIC(BasicAPI) {
auto integer = NDO_CAST(IntObject, NDO->create("int"));
SUITE(Core) {
TEST(BasicAPI) {
objTestModule.initialize();
integer->val = 10;
{
auto integer = NDO_CAST(IntObject, NDO->create("int"));
printf("%s\n", NDO->toString(integer).read());
integer->val = 10;
NDO->save(integer, "tmp.o");
auto savedInt = NDO->load("tmp.o");
printf("%s\n", NDO->toString(integer).read());
printf("%s\n", NDO->toString(savedInt).read());
NDO->save(integer, "tmp.o");
auto savedInt = NDO->load("tmp.o");
TEST(NDO->compare(integer, savedInt));
TEST(NDO_CAST(IntObject, savedInt));
TEST(integer->val == NDO_CAST(IntObject, savedInt)->val);
printf("%s\n", NDO->toString(savedInt).read());
NDO->destroy(integer);
NDO->destroy(savedInt);
}
CHECK(NDO->compare(integer, savedInt));
CHECK(NDO_CAST(IntObject, savedInt));
CHECK(integer->val == NDO_CAST(IntObject, savedInt)->val);
NDO->destroy(integer);
NDO->destroy(savedInt);
}
TEST_DEF(Core) {
if (objTestModule.initialize()) {
testBasicAPI();
objTestModule.deinitialize();
}
}
}

View file

@ -44,104 +44,118 @@ auto script = R"(
print false;
)";
TEST_DEF_STATIC(Entry) {
auto method = NDO_CAST(MethodObject, NDO->create("method"));
auto interpreter = NDO_CAST(InterpreterObject, NDO->create("interpreter"));
SUITE(Interpreter) {
TEST(Entry) {
objTestModule.initialize();
{
auto method = NDO_CAST(MethodObject, NDO->create("method"));
auto interpreter = NDO_CAST(InterpreterObject, NDO->create("interpreter"));
interpreter->getMember<LinkObject>("target method")->setLink(method);
interpreter->getMember<LinkObject>("target method")->setLink(method);
method->mScript->mReadable->val = script;
method->compile();
method->mScript->mReadable->val = script;
method->compile();
interpreter->exec();
interpreter->exec();
NDO->destroy(interpreter);
NDO->destroy(interpreter);
printf("\n");
}
TEST_DEF_STATIC(SimpleSave) {
auto method = NDO_CAST(MethodObject, NDO->create("method"));
auto interpreter = NDO_CAST(InterpreterObject, NDO->create("interpreter"));
interpreter->getMember<LinkObject>("target method")->setLink(method);
method->mScript->mReadable->val = script;
method->compile();
interpreter->exec();
NDO->save(interpreter, "interp.o");
auto interpreterLoaded = NDO_CAST(InterpreterObject, NDO->load("interp.o"));
interpreterLoaded->exec();
NDO->destroy(interpreterLoaded);
NDO->destroy(interpreter);
printf("\n");
}
TEST_DEF_STATIC(Simple) {
auto compileStartCount = getObjCount();
auto method = NDO_CAST(MethodObject, NDO->create("method"));
auto interpreter = NDO_CAST(InterpreterObject, NDO->create("interpreter"));
interpreter->getMember<LinkObject>("target method")->setLink(method);
auto exec = [&](const char* script){
method->mScript->mReadable->val = script;
method->compile();
auto startCount = getObjCount();
interpreter->exec();
if (getObjCount() != startCount) {
TEST(false && "Mem leaks in interpreter");
printf("\n");
}
printf("\n");
};
exec("10 + 15;");
exec("print 10 + 15 * 10;");
exec("print 10 + 15 * (10 + 10) + 5;");
exec("print 10 + 15;");
exec("print (10 + 15) * 20;");
exec("var k : int;");
exec("var k : int; print k;");
NDO->destroy(interpreter);
if (getObjCount() != compileStartCount) {
TEST(false && "Mem leaks in compiler and interpreter");
objTestModule.deinitialize();
}
}
TEST_DEF_STATIC(Complex) {
auto method = NDO_CAST(MethodObject, NDO->create("method"));
auto interpreter = NDO_CAST(InterpreterObject, NDO->create("interpreter"));
TEST(SimpleSave) {
objTestModule.initialize();
interpreter->getMember<LinkObject>("target method")->setLink(method);
{
auto method = NDO_CAST(MethodObject, NDO->create("method"));
auto interpreter = NDO_CAST(InterpreterObject, NDO->create("interpreter"));
method->mScript->mReadable->val = script1;
method->compile();
interpreter->getMember<LinkObject>("target method")->setLink(method);
interpreter->exec();
method->mScript->mReadable->val = script;
method->compile();
NDO->destroy(interpreter);
}
interpreter->exec();
NDO->save(interpreter, "interp.o");
auto interpreterLoaded = NDO_CAST(InterpreterObject, NDO->load("interp.o"));
interpreterLoaded->exec();
NDO->destroy(interpreterLoaded);
NDO->destroy(interpreter);
printf("\n");
}
objTestModule.deinitialize();
}
TEST_OFF(Simple) {
objTestModule.initialize();
{
auto compileStartCount = getObjCount();
auto method = NDO_CAST(MethodObject, NDO->create("method"));
auto interpreter = NDO_CAST(InterpreterObject, NDO->create("interpreter"));
interpreter->getMember<LinkObject>("target method")->setLink(method);
auto exec = [&](const char* script) {
method->mScript->mReadable->val = script;
method->compile();
auto startCount = getObjCount();
interpreter->exec();
if (getObjCount() != startCount) {
CHECK(false && "Mem leaks in interpreter");
}
printf("\n");
};
exec("10 + 15;");
exec("print 10 + 15 * 10;");
exec("print 10 + 15 * (10 + 10) + 5;");
exec("print 10 + 15;");
exec("print (10 + 15) * 20;");
exec("var k : int;");
exec("var k : int; print k;");
NDO->destroy(interpreter);
if (getObjCount() != compileStartCount) {
CHECK(false && "Mem leaks in compiler and interpreter");
}
}
objTestModule.deinitialize();
}
TEST(Complex) {
objTestModule.initialize();
{
auto method = NDO_CAST(MethodObject, NDO->create("method"));
auto interpreter = NDO_CAST(InterpreterObject, NDO->create("interpreter"));
interpreter->getMember<LinkObject>("target method")->setLink(method);
method->mScript->mReadable->val = script1;
method->compile();
interpreter->exec();
NDO->destroy(interpreter);
}
TEST_DEF(Interpreter) {
if (objTestModule.initialize()) {
testEntry();
testSimple();
testSimpleSave();
// testComplex();
objTestModule.deinitialize();
}
}

View file

@ -6,58 +6,59 @@
using namespace tp;
using namespace obj;
TEST_DEF_STATIC(Basic) {
{
Parser parser;
SUITE(Parser) {
TEST(Basic) {
objTestModule.initialize();
String stream = "";
auto res = parser.parse(stream);
{
Parser parser;
TEST(!res.isError);
String stream = "";
auto res = parser.parse(stream);
delete res.scope;
}
CHECK(!res.isError);
{
Parser parser;
delete res.scope;
}
String stream = "var i = true;";
auto res = parser.parse(stream);
{
Parser parser;
TEST(!res.isError);
String stream = "var i = true;";
auto res = parser.parse(stream);
delete res.scope;
}
CHECK(!res.isError);
{
Parser parser;
delete res.scope;
}
String stream = "var i = true; print (i + 1) * 10;";
auto res = parser.parse(stream);
{
Parser parser;
TEST(!res.isError);
String stream = "var i = true; print (i + 1) * 10;";
auto res = parser.parse(stream);
delete res.scope;
}
}
CHECK(!res.isError);
TEST_DEF_STATIC(ErrorHandling) {
Parser parser;
String stream = "var i = true; print (i + 1) * 10; invalidCharacter ";
auto res = parser.parse(stream);
TEST(res.isError);
delete res.scope;
}
TEST_DEF(Parser) {
if (objTestModule.initialize()) {
testBasic();
testErrorHandling();
delete res.scope;
}
objTestModule.deinitialize();
}
}
TEST(ErrorHandling) {
objTestModule.initialize();
{
Parser parser;
String stream = "var i = true; print (i + 1) * 10; invalidCharacter ";
auto res = parser.parse(stream);
CHECK(res.isError);
delete res.scope;
}
objTestModule.deinitialize();
}
}

View file

@ -11,28 +11,29 @@
using namespace tp;
using namespace obj;
TEST_DEF_STATIC(Dict) {
auto integer = NDO_CAST(IntObject, NDO->create("int"));
integer->val = 10;
SUITE(PrimitiveObjects) {
TEST(Dict) {
objTestModule.initialize();
auto dict = NDO_CAST(DictObject, NDO->create("dict"));
{
auto integer = NDO_CAST(IntObject, NDO->create("int"));
integer->val = 10;
dict->put("val", integer);
auto dict = NDO_CAST(DictObject, NDO->create("dict"));
NDO->save(dict, "dict.o");
dict->put("val", integer);
auto dictLoaded = NDO_CAST(DictObject, NDO->load("dict.o"));
NDO->save(dict, "dict.o");
TEST(dictLoaded->presents("val").isValid());
TEST(NDO_CAST(IntObject, dictLoaded->get("val"))->val == 10);
auto dictLoaded = NDO_CAST(DictObject, NDO->load("dict.o"));
NDO->destroy(dict);
NDO->destroy(dictLoaded);
}
CHECK(dictLoaded->presents("val").isValid());
CHECK(NDO_CAST(IntObject, dictLoaded->get("val"))->val == 10);
NDO->destroy(dict);
NDO->destroy(dictLoaded);
}
TEST_DEF(Primitives) {
if (objTestModule.initialize()) {
testDict();
objTestModule.deinitialize();
}
}

View file

@ -1,23 +0,0 @@
#include "ObjectTests.hpp"
using namespace tp;
using namespace obj;
void testParser();
void testCore();
void testPrimitives();
void testInterpreter();
tp::ModuleManifest* objDeps[] = { &gModuleObjects, nullptr };
tp::ModuleManifest objTestModule("ObjectsTests", nullptr, nullptr, objDeps);
int main() {
testParser();
testCore();
testPrimitives();
testInterpreter();
return 0;
}

12
Objects/tests/main.cpp Normal file
View file

@ -0,0 +1,12 @@
#include "ObjectTests.hpp"
#include "primitives/primitives.h"
tp::ModuleManifest* objDeps[] = { &obj::gModuleObjects, nullptr };
tp::ModuleManifest objTestModule("ObjectsTests", nullptr, nullptr, objDeps);
#include <UnitTest++/UnitTest++.h>
#include <UnitTest++/TestReporterStdout.h>
int main(int /*argc*/, char** /*argv*/) { return UnitTest::RunAllTests(); }