void potion_test_empty(CuTest *T) { PN empty = PN_TUP0(); CuAssert(T, "empty isn't a tuple", PN_IS_TUPLE(empty)); CuAssert(T, "empty isn't a ref", PN_IS_PTR(empty)); CuAssertIntEquals(T, "tuple length is off", 0, PN_INT(potion_send(empty, potion_str(P, "length")))); }
static void potion_init(Potion *P) { PN vtable, obj_vt; P->lobby = potion_type_new(P, PN_TLOBBY, 0); vtable = potion_type_new(P, PN_TVTABLE, P->lobby); obj_vt = potion_type_new(P, PN_TOBJECT, P->lobby); potion_type_new(P, PN_TNIL, obj_vt); potion_type_new(P, PN_TNUMBER, obj_vt); potion_type_new(P, PN_TBOOLEAN, obj_vt); potion_type_new(P, PN_TSTRING, obj_vt); potion_type_new(P, PN_TTABLE, obj_vt); potion_type_new(P, PN_TCLOSURE, obj_vt); potion_type_new(P, PN_TTUPLE, obj_vt); potion_type_new(P, PN_TFILE, obj_vt); potion_type_new(P, PN_TSTATE, obj_vt); potion_type_new(P, PN_TSOURCE, obj_vt); potion_type_new(P, PN_TBYTES, obj_vt); potion_type_new(P, PN_TPROTO, obj_vt); potion_type_new(P, PN_TWEAK, obj_vt); potion_type_new(P, PN_TLICK, obj_vt); potion_type_new(P, PN_TERROR, obj_vt); potion_type_new(P, PN_TCONT, obj_vt); potion_type_new(P, PN_TDECIMAL, obj_vt); potion_str_hash_init(P); PN_STR0 = PN_STRN("", 0); PN_add = PN_STRN("+", 1); PN_sub = PN_STRN("-", 1); PN_mult = PN_STRN("*", 1); PN_div = PN_STRN("/", 1); PN_rem = PN_STRN("%", 1); PN_bitn = PN_STRN("~", 1); PN_bitl = PN_STRN("<<", 2); PN_bitr = PN_STRN(">>", 2); PN_if = PN_STRN("if", 2); PN_def = PN_STRN("def", 3); PN_cmp = PN_STRN("cmp", 3); PN_call = PN_STRN("call", 4); PN_else = PN_STRN("else", 4); PN_loop = PN_STRN("loop", 4); PN_self = PN_STRN("self", 4); PN_name = PN_STRN("name", 4); PN_size = PN_STRN("size", 4); PN_break = PN_STRN("break", 5); PN_class = PN_STRN("class", 5); PN_elsif = PN_STRN("elsif", 5); PN_print = PN_STRN("print", 5); PN_while = PN_STRN("while", 5); PN_length = PN_STRN("length", 6); PN_return = PN_STRN("return", 6); PN_string = PN_STRN("string", 6); PN_lookup = PN_STRN("lookup", 6); PN_number = PN_STRN("number", 6); PN_compile = PN_STRN("compile", 7); PN_allocate = PN_STRN("allocate", 8); PN_continue = PN_STRN("continue", 8); PN_delegated = PN_STRN("delegated", 9); potion_def_method(P, 0, vtable, PN_lookup, PN_FUNC(potion_lookup, 0)); potion_def_method(P, 0, vtable, PN_def, PN_FUNC(potion_def_method, "name=S,block=&")); potion_send(vtable, PN_def, PN_allocate, PN_FUNC(potion_allocate, 0)); potion_send(vtable, PN_def, PN_delegated, PN_FUNC(potion_delegated, 0)); potion_vm_init(P); potion_lobby_init(P); potion_object_init(P); potion_error_init(P); #ifndef DISABLE_CALLCC potion_cont_init(P); #endif potion_primitive_init(P); potion_num_init(P); potion_str_init(P); potion_table_init(P); potion_source_init(P); potion_lick_init(P); potion_compiler_init(P); #ifndef SANDBOX potion_file_init(P); potion_loader_init(P); #endif pn_filenames = PN_TUP0(); GC_PROTECT(P); }