void st_methods_ptr(void) { useclass(Counter); usegeneric((gincr)gincr_s, (gincrBy1)gincrBy1_s, (gincrBy2)gincrBy2_s, (gincrBy3)gincrBy3_s, (gincrBy4)gincrBy4_s, (gincrBy5)gincrBy5_s); OBJ cnt = gnew(Counter); OBJ ret; IMP1 gincr_p = cos_method_lookup1((SEL)gincr_s , cos_object_id(cnt)); IMP1 gincrBy1_p = cos_method_lookup1((SEL)gincrBy1_s, cos_object_id(cnt)); IMP1 gincrBy2_p = cos_method_lookup1((SEL)gincrBy2_s, cos_object_id(cnt)); IMP1 gincrBy3_p = cos_method_lookup1((SEL)gincrBy3_s, cos_object_id(cnt)); IMP1 gincrBy4_p = cos_method_lookup1((SEL)gincrBy4_s, cos_object_id(cnt)); IMP1 gincrBy5_p = cos_method_lookup1((SEL)gincrBy5_s, cos_object_id(cnt)); gincrBy1_arg_t arg1 = { 1 }; gincrBy2_arg_t arg2 = { 1,1 }; gincrBy3_arg_t arg3 = { 1,1,1 }; gincrBy4_arg_t arg4 = { 1,1,1,1 }; gincrBy5_arg_t arg5 = { 1,1,1,1,1 }; STEST( "method pointer (0 argument )", N, gincr_p ((SEL)gincr_s ,cnt,0 ,&ret) ); STEST( "method pointer (1 argument )", N, gincrBy1_p((SEL)gincrBy1_s,cnt,&arg1,&ret) ); STEST( "method pointer (2 arguments)", N, gincrBy2_p((SEL)gincrBy2_s,cnt,&arg2,&ret) ); STEST( "method pointer (3 arguments)", N, gincrBy3_p((SEL)gincrBy3_s,cnt,&arg3,&ret) ); STEST( "method pointer (4 arguments)", N, gincrBy4_p((SEL)gincrBy4_s,cnt,&arg4,&ret) ); STEST( "method pointer (5 arguments)", N, gincrBy5_p((SEL)gincrBy5_s,cnt,&arg5,&ret) ); test_assert( gint(cnt) == N+N+2*N+3*N+4*N+5*N ); grelease(cnt); }
void st_multimethods_ptr(void) { useclass(Counter); usegeneric((gaddTo1)gaddTo1_s, (gaddTo2)gaddTo2_s, (gaddTo3)gaddTo3_s, (gaddTo4)gaddTo4_s); OBJ cnt = gnew(Counter); OBJ one = gincr(gnew(Counter)); OBJ ret; U32 cid = cos_object_id(cnt); U32 oid = cos_object_id(one); IMP2 gaddTo1_p = cos_method_lookup2((SEL)gaddTo1_s, cid, oid); IMP3 gaddTo2_p = cos_method_lookup3((SEL)gaddTo2_s, cid, oid, oid); IMP4 gaddTo3_p = cos_method_lookup4((SEL)gaddTo3_s, cid, oid, oid, oid); IMP5 gaddTo4_p = cos_method_lookup5((SEL)gaddTo4_s, cid, oid, oid, oid, oid); STEST( "multimethod pointer (rank 2)", N, gaddTo1_p((SEL)gaddTo1_s,cnt,one,0,&ret) ); STEST( "multimethod pointer (rank 3)", N, gaddTo2_p((SEL)gaddTo2_s,cnt,one,one,0,&ret) ); STEST( "multimethod pointer (rank 4)", N, gaddTo3_p((SEL)gaddTo3_s,cnt,one,one,one,0,&ret) ); STEST( "multimethod pointer (rank 5)", N, gaddTo4_p((SEL)gaddTo4_s,cnt,one,one,one,one,0,&ret) ); test_assert( gint(cnt) == N+2*N+3*N+4*N ); grelease(cnt); grelease(one); }
void ut_methods(void) { useclass(Object, Class, MetaClass, PropMetaClass); usegeneric((gunderstandMessage1)gum1); usegeneric((ginstancesUnderstandMessage1)gium1); usegeneric(gclass , gclassName); usegeneric(gretain, grelease); usegeneric(galloc , gdealloc ); usegeneric(gisKindOf); UTEST_START("method invocation & knowledge") // Object UTEST( gunderstandMessage1(Object, (SEL)gum1) == True ); UTEST( ginstancesUnderstandMessage1(Object, (SEL)gum1) == True ); UTEST( gunderstandMessage1(Object, (SEL)gium1) == True ); UTEST( ginstancesUnderstandMessage1(Object, (SEL)gium1) == False ); UTEST( gunderstandMessage1(Object, (SEL)galloc) == True ); UTEST( ginstancesUnderstandMessage1(Object, (SEL)galloc) == False ); UTEST( gunderstandMessage1(Object, (SEL)gdealloc) == True ); UTEST( ginstancesUnderstandMessage1(Object, (SEL)gdealloc) == True ); UTEST( gunderstandMessage1(Object, (SEL)gclass) == True ); UTEST( ginstancesUnderstandMessage1(Object, (SEL)gclass) == True ); UTEST( gunderstandMessage1(Object, (SEL)gclassName) == True ); UTEST( ginstancesUnderstandMessage1(Object, (SEL)gclassName) == True ); UTEST( gunderstandMessage1(Object, (SEL)gretain) == True ); UTEST( ginstancesUnderstandMessage1(Object, (SEL)gretain) == True ); UTEST( gunderstandMessage1(Object, (SEL)grelease) == True ); UTEST( ginstancesUnderstandMessage1(Object, (SEL)grelease) == True ); UTEST( gunderstandMessage1(Object, (SEL)grelease) == True ); UTEST( ginstancesUnderstandMessage1(Object, (SEL)grelease) == True ); UTEST( gunderstandMessage2(Object, Object, (SEL)gisKindOf) == True ); UTEST( ginstancesUnderstandMessage2(Object, Object, (SEL)gisKindOf) == False ); UTEST( gunderstandMessage2(Object, Class, (SEL)gisKindOf) == True ); UTEST( ginstancesUnderstandMessage2(Object, Class, (SEL)gisKindOf) == True ); // Class UTEST( gunderstandMessage1(Class, (SEL)galloc) == True ); UTEST( ginstancesUnderstandMessage1(Class, (SEL)gdealloc) == True ); UTEST( gunderstandMessage1(Class, (SEL)gclass) == True ); UTEST( ginstancesUnderstandMessage1(Class, (SEL)gclassName) == True ); UTEST( gunderstandMessage1(Class, (SEL)gretain) == True ); UTEST( ginstancesUnderstandMessage1(Class, (SEL)grelease) == True ); UTEST( ginstancesUnderstandMessage1(Class, (SEL)grelease) == True ); // MetaClass UTEST( gunderstandMessage1(MetaClass, (SEL)galloc) == True ); UTEST( ginstancesUnderstandMessage1(MetaClass, (SEL)gdealloc) == True ); UTEST( gunderstandMessage1(MetaClass, (SEL)gclass) == True ); UTEST( ginstancesUnderstandMessage1(MetaClass, (SEL)gclassName) == True ); UTEST( gunderstandMessage1(MetaClass, (SEL)gretain) == True ); UTEST( ginstancesUnderstandMessage1(MetaClass, (SEL)grelease) == True ); UTEST( ginstancesUnderstandMessage1(MetaClass, (SEL)grelease) == True ); // PropMetaClass UTEST( gunderstandMessage1(PropMetaClass, (SEL)galloc) == True ); UTEST( ginstancesUnderstandMessage1(PropMetaClass, (SEL)gdealloc) == True ); UTEST( gunderstandMessage1(PropMetaClass, (SEL)gclass) == True ); UTEST( ginstancesUnderstandMessage1(PropMetaClass, (SEL)gclassName) == True ); UTEST( gunderstandMessage1(PropMetaClass, (SEL)gretain) == True ); UTEST( ginstancesUnderstandMessage1(PropMetaClass, (SEL)grelease) == True ); UTEST( ginstancesUnderstandMessage1(PropMetaClass, (SEL)grelease) == True ); UTEST_END }