Files
wren/test/api/call.c
2020-06-05 14:57:20 -07:00

127 lines
3.4 KiB
C

#include <stdio.h>
#include <string.h>
#include "call.h"
int callRunTests(WrenVM* vm)
{
wrenEnsureSlots(vm, 1);
wrenGetVariable(vm, "./test/api/call", "Call", 0);
WrenHandle* callClass = wrenGetSlotHandle(vm, 0);
WrenHandle* noParams = wrenMakeCallHandle(vm, "noParams");
WrenHandle* zero = wrenMakeCallHandle(vm, "zero()");
WrenHandle* one = wrenMakeCallHandle(vm, "one(_)");
WrenHandle* two = wrenMakeCallHandle(vm, "two(_,_)");
WrenHandle* unary = wrenMakeCallHandle(vm, "-");
WrenHandle* binary = wrenMakeCallHandle(vm, "-(_)");
WrenHandle* subscript = wrenMakeCallHandle(vm, "[_,_]");
WrenHandle* subscriptSet = wrenMakeCallHandle(vm, "[_,_]=(_)");
// Different arity.
wrenEnsureSlots(vm, 1);
wrenSetSlotHandle(vm, 0, callClass);
wrenCall(vm, noParams);
wrenEnsureSlots(vm, 1);
wrenSetSlotHandle(vm, 0, callClass);
wrenCall(vm, zero);
wrenEnsureSlots(vm, 2);
wrenSetSlotHandle(vm, 0, callClass);
wrenSetSlotDouble(vm, 1, 1.0);
wrenCall(vm, one);
wrenEnsureSlots(vm, 3);
wrenSetSlotHandle(vm, 0, callClass);
wrenSetSlotDouble(vm, 1, 1.0);
wrenSetSlotDouble(vm, 2, 2.0);
wrenCall(vm, two);
// Operators.
wrenEnsureSlots(vm, 1);
wrenSetSlotHandle(vm, 0, callClass);
wrenCall(vm, unary);
wrenEnsureSlots(vm, 2);
wrenSetSlotHandle(vm, 0, callClass);
wrenSetSlotDouble(vm, 1, 1.0);
wrenCall(vm, binary);
wrenEnsureSlots(vm, 3);
wrenSetSlotHandle(vm, 0, callClass);
wrenSetSlotDouble(vm, 1, 1.0);
wrenSetSlotDouble(vm, 2, 2.0);
wrenCall(vm, subscript);
wrenEnsureSlots(vm, 4);
wrenSetSlotHandle(vm, 0, callClass);
wrenSetSlotDouble(vm, 1, 1.0);
wrenSetSlotDouble(vm, 2, 2.0);
wrenSetSlotDouble(vm, 3, 3.0);
wrenCall(vm, subscriptSet);
// Returning a value.
WrenHandle* getValue = wrenMakeCallHandle(vm, "getValue()");
wrenEnsureSlots(vm, 1);
wrenSetSlotHandle(vm, 0, callClass);
wrenCall(vm, getValue);
printf("slots after call: %d\n", wrenGetSlotCount(vm));
WrenHandle* value = wrenGetSlotHandle(vm, 0);
// Different argument types.
wrenEnsureSlots(vm, 3);
wrenSetSlotHandle(vm, 0, callClass);
wrenSetSlotBool(vm, 1, true);
wrenSetSlotBool(vm, 2, false);
wrenCall(vm, two);
wrenEnsureSlots(vm, 3);
wrenSetSlotHandle(vm, 0, callClass);
wrenSetSlotDouble(vm, 1, 1.2);
wrenSetSlotDouble(vm, 2, 3.4);
wrenCall(vm, two);
wrenEnsureSlots(vm, 3);
wrenSetSlotHandle(vm, 0, callClass);
wrenSetSlotString(vm, 1, "string");
wrenSetSlotString(vm, 2, "another");
wrenCall(vm, two);
wrenEnsureSlots(vm, 3);
wrenSetSlotHandle(vm, 0, callClass);
wrenSetSlotNull(vm, 1);
wrenSetSlotHandle(vm, 2, value);
wrenCall(vm, two);
// Truncate a string, or allow null bytes.
wrenEnsureSlots(vm, 3);
wrenSetSlotHandle(vm, 0, callClass);
wrenSetSlotBytes(vm, 1, "string", 3);
wrenSetSlotBytes(vm, 2, "b\0y\0t\0e", 7);
wrenCall(vm, two);
// Call ignores with extra temporary slots on stack.
wrenEnsureSlots(vm, 10);
wrenSetSlotHandle(vm, 0, callClass);
for (int i = 1; i < 10; i++)
{
wrenSetSlotDouble(vm, i, i * 0.1);
}
wrenCall(vm, one);
wrenReleaseHandle(vm, callClass);
wrenReleaseHandle(vm, noParams);
wrenReleaseHandle(vm, zero);
wrenReleaseHandle(vm, one);
wrenReleaseHandle(vm, two);
wrenReleaseHandle(vm, getValue);
wrenReleaseHandle(vm, value);
wrenReleaseHandle(vm, unary);
wrenReleaseHandle(vm, binary);
wrenReleaseHandle(vm, subscript);
wrenReleaseHandle(vm, subscriptSet);
return 0;
}