void st_pxymultimethods(void) { useclass(Counter, Proxy); OBJ cnt = gnew(Counter); OBJ pxy = gnewWith(Proxy,cnt); OBJ one = gincr(gnew(Counter)); grelease(cnt); STEST( "multimethod through proxy (rank 2)", N, gaddTo1(pxy,one) ); STEST( "multimethod through proxy (rank 3)", N, gaddTo2(pxy,one,one) ); STEST( "multimethod through proxy (rank 4)", N, gaddTo3(pxy,one,one,one) ); STEST( "multimethod through proxy (rank 5)", N, gaddTo4(pxy,one,one,one,one) ); test_assert( gint(pxy) == N+2*N+3*N+4*N ); grelease(pxy); grelease(one); }
void st_pxymethods(void) { useclass(Counter, Proxy); OBJ cnt = gnew(Counter); OBJ pxy = gnewWith(Proxy,cnt); grelease(cnt); STEST( "method through proxy (0 argument )", N, gincr(pxy) ); STEST( "method through proxy (1 argument )", N, gincrBy1(pxy,1) ); STEST( "method through proxy (2 arguments)", N, gincrBy2(pxy,1,1) ); STEST( "method through proxy (3 arguments)", N, gincrBy3(pxy,1,1,1) ); STEST( "method through proxy (4 arguments)", N, gincrBy4(pxy,1,1,1,1) ); STEST( "method through proxy (5 arguments)", N, gincrBy5(pxy,1,1,1,1,1) ); test_assert( gint(pxy) == N + N+2*N+3*N+4*N+5*N ); grelease(pxy); }
endmethod // ----- allocator struct String* String_alloc(U32 size) { useclass(StringN); if (size == U32_MAX) THROW(gnewWithStr(ExOverflow, "size is too large")); OBJ _str = gallocWithSize(StringN, size+1); struct StringN *strn = CAST(struct StringN*, _str); struct String *str = &strn->String; str->value = strn->_value; str->size = 0; return str; }
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 }
void ut_slice(void) { useclass(Slice); UTEST_START("Slice") // equality and default args UTEST( Slice_isEqual(atSlice(10) , atSlice(0,10, 1)) ); UTEST( Slice_isEqual(atSlice(0,10), atSlice(0,10, 1)) ); UTEST(!Slice_isEqual(atSlice(0,10), atSlice(0,10,-1)) ); UTEST( Slice_isEqual(atSlice(0,10), atSlice(0,10, 0)) ); UTEST( gisEqual(aSlice(10) , aSlice(0,10, 1)) == True ); UTEST( gisEqual(aSlice(0,10), aSlice(0,10, 1)) == True ); UTEST( gisEqual(aSlice(0,10), aSlice(0,10,-1)) == False ); // new vs auto UTEST( isEq(gnewSlc(Slice, 0, 10, 1), aSlice(0,10,1)) ); UTEST(!isEq(gnewSlc(Slice, 0, 10, 1), aSlice(0,10,-1)) ); // clone vs auto UTEST( isEq(gclone(aSlice(10)), aSlice(10)) ); UTEST( isEq(gclone(aSlice(0,10)), aSlice(0,10)) ); UTEST( isEq(gclone(aSlice(0,10,-1)), aSlice(0,10,-1)) ); // eval UTEST( Slice_eval(atSlice(10),0) == 0 ); UTEST( Slice_eval(atSlice(10),1) == 1 ); UTEST( Slice_eval(atSlice(10),10) == 10 ); UTEST( Slice_eval(atSlice(1,10),0) == 1 ); UTEST( Slice_eval(atSlice(1,10),1) == 2 ); UTEST( Slice_eval(atSlice(1,10),10) == 11 ); UTEST( Slice_eval(atSlice(1,10,2),0) == 1 ); UTEST( Slice_eval(atSlice(1,10,2),1) == 3 ); UTEST( Slice_eval(atSlice(1,10,2),10) == 21 ); UTEST( Slice_eval(atSlice(10,1,-2),0) == 10 ); UTEST( Slice_eval(atSlice(10,1,-2),1) == 8 ); UTEST( Slice_eval(atSlice(10,1,-2),10) == -10 ); // first UTEST( Slice_first(atSlice(10)) == 0 ); UTEST( Slice_first(atSlice(1,10)) == 1 ); UTEST( Slice_first(atSlice(-1,10)) == (U32)-1 ); UTEST( Slice_first(atSlice(-1,-10)) == (U32)-1 ); // last UTEST( Slice_last(atSlice(10)) == 9 ); UTEST( Slice_last(atSlice(1,10)) == 10 ); UTEST( Slice_last(atSlice(1,10,2)) == 19 ); UTEST( Slice_last(atSlice(0,-10)) == (U32)-11 ); UTEST( Slice_last(atSlice(-1,-10)) == (U32)-12 ); // size UTEST( Slice_size(atSlice(0,9,1)) == 9 ); UTEST( Slice_size(atSlice(1,10,1)) == 10 ); UTEST( Slice_size(atSlice(1,10,2)) == 10 ); UTEST( Slice_size(atSlice(1,10,3)) == 10 ); UTEST( Slice_size(atSlice(1,9,3)) == 9 ); UTEST( Slice_size(atSlice(9,0,-1)) == 0 ); UTEST( Slice_size(atSlice(10,1,-1)) == 1 ); UTEST( Slice_size(atSlice(10,1,-2)) == 1 ); UTEST( Slice_size(atSlice(10,1,-3)) == 1 ); UTEST( Slice_size(atSlice(9,1,-3)) == 1 ); // slice vs range UTEST( eq(Slice_fromRange(atSlice(0), atRange(-1,1,1), 0), atSlice(-1,3,1)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(-1,1,2), 0), atSlice(-1,2,2)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(-1,5,3), 0), atSlice(-1,3,3)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(-1,4,3), 0), atSlice(-1,2,3)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange( 1,5,3), 0), atSlice( 1,2,3)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(9,0,-1), 0), atSlice(9,10,-1)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(9,1,-2), 0), atSlice(9,5,-2)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(9,0,-3), 0), atSlice(9,4,-3)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(9,3,-3), 0), atSlice(9,3,-3)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(0,9,1) , 0), atSlice(0,10,1)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(1,10,1), 0), atSlice(1,10,1)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(1,9,2) , 0), atSlice(1,5,2)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(1,10,3), 0), atSlice(1,4,3)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(1,7,3) , 0), atSlice(1,3,3)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(9,0,-1) , 0), atSlice(9,10,-1)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(10,1,-1), 0), atSlice(10,10,-1)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(10,2,-2), 0), atSlice(10,5,-2)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(10,1,-3), 0), atSlice(10,4,-3)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(9,3,-3) , 0), atSlice(9,3,-3)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(-1,-10,-1), 0), atSlice(-1,10,-1)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(-1,-9,-2) , 0), atSlice(-1,5,-2)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(-1,-10,-3), 0), atSlice(-1,4,-3)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(-1,-7,-3) , 0), atSlice(-1,3,-3)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(-10,-1,1), 0), atSlice(-10,10,1)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(-10,-2,2), 0), atSlice(-10,5,2)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(-10,-1,3), 0), atSlice(-10,4,3)) ); UTEST( eq(Slice_fromRange(atSlice(0), atRange(-9,-3,3) , 0), atSlice(-9,3,3)) ); UTEST_END }
void ut_string(void) { // useclass(Array, String); useclass(Lesser,Equal,Greater); useclass(AutoRelease); OBJ buf[] = { aStr("toto","tutu","","titi") }; OBJ srt[] = { aStr("","titi","toto","tutu") }; OBJ arr; OBJ pool = gnew(AutoRelease); UTEST_START("String") UTEST(gisEqual(aStr(""),aStr("")) == True); UTEST(gisEqual(aStr(""),aStr("titi")) == False); UTEST(gisEqual(aStr("titi"),aStr("")) == False); UTEST(gisEqual(aStr("titi"),aStr("titi")) == True); UTEST(gisEqual(aStr("tutu"),aStr("titi")) == False); UTEST(gcompare(aStr(""),aStr("")) == Equal); UTEST(gcompare(aStr(""),aStr("titi")) == Lesser); UTEST(gcompare(aStr("titi"),aStr("")) == Greater); UTEST(gcompare(aStr("tata"),aStr("titi")) == Lesser); UTEST(gcompare(aStr("titi"),aStr("titi")) == Equal); UTEST(gcompare(aStr("tutu"),aStr("titi")) == Greater); UTEST(gcompare(aStr("titis"),aStr("tutu")) == Lesser); UTEST(gcompare(aStr("tutu"),aStr("titis")) == Greater); UTEST(gcompare(aStr("titis"),aStr("titi")) == Greater); UTEST(gcompare(aStr("titi"),aStr("titis")) == Lesser); arr = aArrayRef(buf, COS_ARRLEN(buf)); UTEST(gfind(arr, aStr("toto")) != Nil); UTEST(gfind(arr, aStr("tutu")) != Nil); UTEST(gfind(arr, aStr("titi")) != Nil); UTEST(gfind(arr, aStr("tata")) == Nil); UTEST(gfind(arr, aStr("titis")) == Nil); UTEST(gfind(arr, aStr("totos")) == Nil); UTEST(gfind(arr, aStr("tutus")) == Nil); UTEST(gfind(arr, aStr("")) != Nil); UTEST(gfind(arr, aFun(gisEqual, aStr("titi"), __1)) != Nil); UTEST(gfind(arr, aFun(gisEqual, aStr("toto"), __1)) != Nil); UTEST(gfind(arr, aFun(gisEqual, aStr("tutu"), __1)) != Nil); UTEST(gfind(arr, aFun(gisEqual, aStr("tata"), __1)) == Nil); UTEST(gfind(arr, aFun(gisEqual, aStr("titis"), __1)) == Nil); UTEST(gfind(arr, aFun(gisEqual, aStr("totos"), __1)) == Nil); UTEST(gfind(arr, aFun(gisEqual, aStr("tutus"), __1)) == Nil); UTEST(gfind(arr, aFun(gisEqual, aStr(""), __1)) != Nil); gsort(arr, aFun(gcompare,__1,__2)); UTEST(gisEqual(arr, aArrayRef(srt, COS_ARRLEN(srt))) == True); UTEST(gfind(arr, aFun(gcompare, aStr("titi"), __1)) != Nil); UTEST(gfind(arr, aFun(gcompare, aStr("toto"), __1)) != Nil); UTEST(gfind(arr, aFun(gcompare, aStr("tutu"), __1)) != Nil); UTEST(gfind(arr, aFun(gcompare, aStr("tata"), __1)) == Nil); UTEST(gfind(arr, aFun(gcompare, aStr("titis"), __1)) == Nil); UTEST(gfind(arr, aFun(gcompare, aStr("totos"), __1)) == Nil); UTEST(gfind(arr, aFun(gcompare, aStr("tutus"), __1)) == Nil); UTEST(gfind(arr, aFun(gcompare, aStr(""), __1)) != Nil); arr = aArrayRef(0, 0); UTEST(gfind(arr, aStr("tata")) == Nil); UTEST(gfind(arr, aStr("")) == Nil); UTEST(gfind(arr, aFun(gisEqual, aStr("tata"), __1)) == Nil); UTEST(gfind(arr, aFun(gisEqual, aStr(""), __1)) == Nil); UTEST(gfind(arr, aFun(gcompare, aStr("tata"), __1)) == Nil); UTEST(gfind(arr, aFun(gcompare, aStr(""), __1)) == Nil); UTEST_END grelease(pool); }