Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
VM: initial setup and code for unit testing the c++ code using google…
…test
  • Loading branch information
bjourne committed Nov 18, 2014
commit b9cdcdc34a2e7850f171a5ce980ecea37da4627c
17 changes: 17 additions & 0 deletions Nmakefile
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ GIT_LABEL = git-label-missing

!IF DEFINED(PLATFORM)

GTEST = C:\p\pubwork\gtest-1.7.0

LINK_FLAGS = /nologo shell32.lib
CL_FLAGS = /nologo /O2 /WX /W3 /D_CRT_SECURE_NO_WARNINGS /DFACTOR_VERSION=$(VERSION) /DFACTOR_GIT_LABEL=$(GIT_LABEL)
CL_FLAGS_VISTA = /D_WIN32_WINNT=0x0600
Expand Down Expand Up @@ -118,6 +120,19 @@ factor.com: $(EXE_OBJS) $(DLL_OBJS)
factor.exe: $(EXE_OBJS) $(DLL_OBJS)
link $(LINK_FLAGS) /out:factor.exe /SUBSYSTEM:windows $(EXE_OBJS) $(DLL_OBJS)

TESTING_OBJS = vm\tests\gtest-all.obj vm\tests\gtest_main.obj vm\tests\factor-tests.obj

.cc.obj:
cl /EHsc $(CL_FLAGS) /I $(GTEST)\include /I $(GTEST) /I vm /Fo$@ /c $<

gtest-setup:
copy $(GTEST)\src\*.cc vm\tests

factor-tests.com: gtest-setup $(TESTING_OBJS) $(EXE_OBJS) $(DLL_OBJS)
link $(LINK_FLAGS) /out:factor-tests.com /SUBSYSTEM:console $(TESTING_OBJS) $(DLL_OBJS)

gtest: factor-tests.com

all: factor.com factor.exe factor.dll.lib libfactor-ffi-test.dll

!ENDIF
Expand Down Expand Up @@ -145,6 +160,8 @@ x86-64-vista:

clean:
del vm\*.obj
del vm\tests\*.obj
del vm\tests\gtest*.cc
if exist factor.lib del factor.lib
if exist factor.res del factor.res
if exist factor.com del factor.com
Expand Down
126 changes: 126 additions & 0 deletions vm/tests/factor-tests.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
#include <limits.h>
#include "master.hpp"
#include "gtest/gtest.h"

namespace factor {

cell stack_depth(cell stack_ptr, segment *seg) {
return (stack_ptr - seg->start + sizeof(cell)) / sizeof(cell);
}

cell datastack_depth(context *ctx) {
return stack_depth(ctx->datastack, ctx->datastack_seg);
}

factor_vm* setup_factor_vm() {
factor_vm* vm = new_factor_vm();
vm_char* image_path = STRING_LITERAL("factor.image");
vm_parameters p;
vm->default_parameters(&p);
p.image_path = image_path;
vm->init_factor(&p);
context* ctx = vm->spare_ctx;
vm->ctx = vm->spare_ctx;
return vm;
}

TEST(VMParametersTests, DefaultParameters) {
vm_parameters p;
factor_vm* vm = new_factor_vm();
vm->default_parameters(&p);
EXPECT_EQ(false, p.embedded_image);
EXPECT_EQ(32 * sizeof(cell), p.datastack_size);
EXPECT_EQ(32 * sizeof(cell), p.retainstack_size);
delete vm;
}

TEST(FactorVMTests, InitialValues) {
factor_vm* vm = new_factor_vm();
EXPECT_EQ(0, vm->current_jit_count);
EXPECT_EQ(false, vm->fep_p);
delete vm;
}

TEST(FactorVMTests, CheckStackSizes) {
factor_vm* vm = new_factor_vm();
vm_char* image_path = STRING_LITERAL("factor.image");
vm_parameters p;
vm->default_parameters(&p);
p.image_path = image_path;
vm->init_factor(&p);
EXPECT_TRUE(vm->spare_ctx != NULL);
EXPECT_TRUE(vm->spare_ctx->datastack_seg != NULL);
EXPECT_TRUE(vm->spare_ctx->retainstack_seg != NULL);
EXPECT_TRUE(vm->spare_ctx->callstack_seg != NULL);
EXPECT_EQ(p.datastack_size, vm->spare_ctx->datastack_seg->size);
EXPECT_EQ(p.retainstack_size, vm->spare_ctx->retainstack_seg->size);
EXPECT_EQ(p.callstack_size, vm->spare_ctx->callstack_seg->size);
delete vm;
}

TEST(ContextTests, PushAndPopItems) {
factor_vm* vm = setup_factor_vm();
context* ctx = vm->ctx;
cell initial_sp = ctx->datastack;
EXPECT_EQ(0, datastack_depth(ctx));
ctx->push(3);
ctx->push(4);
EXPECT_EQ(2, datastack_depth(ctx));
ctx->pop();
ctx->pop();
EXPECT_EQ(0, datastack_depth(ctx));
delete vm;
}

TEST(ArrayTests, PrimitiveArray) {
factor_vm* vm = setup_factor_vm();
context* ctx = vm->ctx;

EXPECT_EQ(0, datastack_depth(ctx));
ctx->push(tag_fixnum(9));
ctx->push(tag_fixnum(9));
EXPECT_EQ(2, datastack_depth(ctx));
vm->primitive_array();
EXPECT_EQ(1, datastack_depth(ctx));
cell obj = ctx->pop();
EXPECT_EQ(0, datastack_depth(ctx));

EXPECT_EQ(ARRAY_TYPE, TAG(obj));
array* arr = (array*)UNTAG(obj);
cell capacity = untag_fixnum(arr->capacity);
EXPECT_EQ(9, capacity);

// Iterate elements
for (int n = 0; n < capacity; n++) {
cell elt = arr->data()[n];
EXPECT_EQ(9, untag_fixnum(elt));
}
delete vm;
}

TEST(ArrayTests, SizeFromBignum) {
factor_vm* vm = setup_factor_vm();
context* ctx = vm->ctx;

ctx->push(tag<bignum>(vm->fixnum_to_bignum(2987)));
ctx->push(tag_fixnum(812));
vm->primitive_array();
EXPECT_EQ(1, datastack_depth(ctx));

array* arr = (array*)untag<array>(ctx->pop());
EXPECT_EQ(2987, untag_fixnum(arr->capacity));
delete vm;
}

TEST(BignumTests, FixnumToBignum) {
factor_vm* vm = setup_factor_vm();
fixnum numbers[] = {123, -123, 777, 0, 1000002};
for (int n = 0; n < 5; n++) {
fixnum num = numbers[n];
bignum* bn = vm->fixnum_to_bignum(num);
EXPECT_EQ(num, vm->bignum_to_fixnum(bn));
}
delete vm;
}

}