mirror of
https://codeberg.org/andyscott/marCsweep.git
synced 2024-11-09 13:50:51 -05:00
107 lines
2.3 KiB
C
107 lines
2.3 KiB
C
#include <assert.h>
|
|
#include <stdio.h>
|
|
|
|
#include "gc.h"
|
|
#include "test_gc.h"
|
|
#include "vm.h"
|
|
|
|
void test_int_alloc(void) {
|
|
struct virtualMachine *vm = initVM();
|
|
pushInt(vm, 100);
|
|
pushInt(vm, 1000);
|
|
pushInt(vm, 10000);
|
|
pushInt(vm, -100000);
|
|
assert(vm->refCount == 4 &&
|
|
"test_int_alloc: GARBAGE_INT allocation failure\n");
|
|
printf("test_int_alloc: PASS\n");
|
|
deinitVM(vm);
|
|
}
|
|
|
|
void test_pair_alloc(void) {
|
|
struct virtualMachine *vm = initVM();
|
|
pushInt(vm, 100);
|
|
pushInt(vm, 1000);
|
|
pushInt(vm, 10000);
|
|
pushInt(vm, -100000);
|
|
pushPair(vm);
|
|
pushPair(vm);
|
|
assert(vm->refCount == 6 &&
|
|
"test_pair_alloc: FAILED: GARBAGE_PAIR allocation failure\n");
|
|
printf("test_pair_alloc: PASS\n");
|
|
deinitVM(vm);
|
|
}
|
|
|
|
void test_obj_count(void) {
|
|
struct virtualMachine *vm = initVM();
|
|
pushInt(vm, 100);
|
|
pushInt(vm, 1000);
|
|
pushInt(vm, 10000);
|
|
pushInt(vm, -100000);
|
|
collect(vm);
|
|
assert(vm->refCount == 4 &&
|
|
"test_obj_count: FAILED: GC occurred when it shouldn't have\n");
|
|
printf("test_obj_count: PASS\n");
|
|
deinitVM(vm);
|
|
}
|
|
|
|
void test_nested_pair(void) {
|
|
struct virtualMachine *vm = initVM();
|
|
pushInt(vm, 100);
|
|
pushInt(vm, 1000);
|
|
pushPair(vm);
|
|
pushInt(vm, 10000);
|
|
pushInt(vm, -100000);
|
|
pushPair(vm);
|
|
pushPair(vm);
|
|
collect(vm);
|
|
assert(vm->refCount == 7 &&
|
|
"test_nested_pair: FAILED: GARBAGE_PAIR allocation failure\n");
|
|
printf("test_pair_alloc: PASS\n");
|
|
deinitVM(vm);
|
|
}
|
|
|
|
void test_unreachable(void) {
|
|
struct virtualMachine *vm = initVM();
|
|
pushInt(vm, 100);
|
|
pushInt(vm, 1000);
|
|
pop(vm);
|
|
pop(vm);
|
|
collect(vm);
|
|
assert(vm->refCount == 0 &&
|
|
"test_unreachable: FAILED: 2 GARBAGE_INT should have been freed\n");
|
|
printf("test_unreachable: PASS\n");
|
|
deinitVM(vm);
|
|
}
|
|
|
|
void test_auto_gc(void) {
|
|
struct virtualMachine *vm = initVM();
|
|
|
|
for (size_t i = 0; i < 505; ++i) {
|
|
pushInt(vm, 1);
|
|
}
|
|
|
|
for (size_t i = 0; i < 5; ++i) {
|
|
pop(vm);
|
|
}
|
|
|
|
for (size_t i = 0; i < 50; ++i) {
|
|
pushInt(vm, 2);
|
|
}
|
|
|
|
assert(vm->refCount == 550 &&
|
|
"test_auto_gc: FAILED: 5 references should have been freed\n");
|
|
printf("test_auto_gc: PASS\n");
|
|
deinitVM(vm);
|
|
}
|
|
|
|
int main(void) {
|
|
|
|
test_int_alloc();
|
|
test_pair_alloc();
|
|
test_obj_count();
|
|
test_nested_pair();
|
|
test_unreachable();
|
|
test_auto_gc();
|
|
|
|
return 0;
|
|
}
|