mgba-ps3/src/script/test/context.c

104 lines
3.3 KiB
C

/* Copyright (c) 2013-2023 Jeffrey Pfau
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "util/test/suite.h"
#include <mgba/script/context.h>
#include <mgba/script/macros.h>
#include <mgba/script/types.h>
M_TEST_DEFINE(weakrefBasic) {
struct mScriptContext context;
mScriptContextInit(&context);
struct mScriptValue weakref = mSCRIPT_VAL(WEAKREF, 1);
struct mScriptValue fakeVal = mSCRIPT_S32(0x7E57CA5E);
struct mScriptValue* val;
assert_int_equal(TableSize(&context.weakrefs), 0);
assert_null(TableLookup(&context.weakrefs, 1));
assert_int_equal(context.nextWeakref, 1);
assert_null(mScriptContextAccessWeakref(&context, &weakref));
assert_int_equal(mScriptContextSetWeakref(&context, &fakeVal), 1);
assert_int_equal(context.nextWeakref, 2);
assert_int_equal(TableSize(&context.weakrefs), 1);
val = mScriptContextAccessWeakref(&context, &weakref);
assert_non_null(val);
assert_int_equal(val->value.u32, 0x7E57CA5E);
mScriptContextClearWeakref(&context, 1);
assert_int_equal(TableSize(&context.weakrefs), 0);
assert_null(TableLookup(&context.weakrefs, 1));
assert_int_equal(context.nextWeakref, 2);
assert_null(mScriptContextAccessWeakref(&context, &weakref));
mScriptContextDeinit(&context);
}
M_TEST_DEFINE(drainPool) {
struct mScriptContext context;
mScriptContextInit(&context);
assert_int_equal(mScriptListSize(&context.refPool), 0);
struct mScriptValue fakeVal = mSCRIPT_CHARP("foo");
fakeVal.refs = 2;
mScriptContextFillPool(&context, &fakeVal);
assert_int_equal(mScriptListSize(&context.refPool), 1);
assert_int_equal(fakeVal.refs, 2);
mScriptContextDrainPool(&context);
assert_int_equal(mScriptListSize(&context.refPool), 0);
assert_int_equal(fakeVal.refs, 1);
mScriptContextDeinit(&context);
}
M_TEST_DEFINE(disownWeakref) {
struct mScriptContext context;
mScriptContextInit(&context);
struct mScriptValue weakref = mSCRIPT_VAL(WEAKREF, 1);
struct mScriptValue fakeVal = mSCRIPT_S32(0x7E57CA5E);
struct mScriptValue* val;
assert_int_equal(mScriptListSize(&context.refPool), 0);
assert_int_equal(TableSize(&context.weakrefs), 0);
assert_null(TableLookup(&context.weakrefs, 1));
assert_int_equal(context.nextWeakref, 1);
assert_null(mScriptContextAccessWeakref(&context, &weakref));
assert_int_equal(mScriptContextSetWeakref(&context, &fakeVal), 1);
assert_int_equal(TableSize(&context.weakrefs), 1);
assert_int_equal(context.nextWeakref, 2);
val = mScriptContextAccessWeakref(&context, &weakref);
assert_non_null(val);
assert_int_equal(val->value.u32, 0x7E57CA5E);
mScriptContextDisownWeakref(&context, 1);
assert_int_equal(mScriptListSize(&context.refPool), 1);
assert_int_equal(TableSize(&context.weakrefs), 1);
val = mScriptContextAccessWeakref(&context, &weakref);
assert_non_null(val);
assert_int_equal(val->value.u32, 0x7E57CA5E);
mScriptContextDrainPool(&context);
assert_int_equal(mScriptListSize(&context.refPool), 0);
assert_int_equal(TableSize(&context.weakrefs), 0);
assert_null(TableLookup(&context.weakrefs, 1));
assert_null(mScriptContextAccessWeakref(&context, &weakref));
mScriptContextDeinit(&context);
}
M_TEST_SUITE_DEFINE(mScript,
cmocka_unit_test(weakrefBasic),
cmocka_unit_test(drainPool),
cmocka_unit_test(disownWeakref),
)