2016-03-30 21:43:14 -04:00
|
|
|
USING: assocs classes classes.private compiler.units definitions
|
|
|
|
eval generic io.streams.string kernel math multiline namespaces
|
|
|
|
parser sequences sets sorting tools.test vocabs words ;
|
2008-03-01 17:00:45 -05:00
|
|
|
IN: classes.tests
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2015-07-02 20:28:17 -04:00
|
|
|
{ t } [ 3 object instance? ] unit-test
|
|
|
|
{ t } [ 3 fixnum instance? ] unit-test
|
|
|
|
{ f } [ 3 float instance? ] unit-test
|
|
|
|
{ t } [ 3 number instance? ] unit-test
|
|
|
|
{ f } [ 3 null instance? ] unit-test
|
2008-05-23 18:33:57 -04:00
|
|
|
|
|
|
|
! Regression
|
2008-06-08 16:32:55 -04:00
|
|
|
GENERIC: method-forget-test ( obj -- obj )
|
2008-05-23 18:33:57 -04:00
|
|
|
TUPLE: method-forget-class ;
|
|
|
|
M: method-forget-class method-forget-test ;
|
|
|
|
|
2015-07-02 20:28:17 -04:00
|
|
|
{ f } [ \ method-forget-test "methods" word-prop assoc-empty? ] unit-test
|
|
|
|
{ } [ [ \ method-forget-class forget ] with-compilation-unit ] unit-test
|
|
|
|
{ t } [ \ method-forget-test "methods" word-prop assoc-empty? ] unit-test
|
2008-06-12 06:49:46 -04:00
|
|
|
|
2015-07-02 20:28:17 -04:00
|
|
|
{ { } { } } [
|
2008-06-12 06:49:46 -04:00
|
|
|
all-words [ class? ] filter
|
|
|
|
implementors-map get keys
|
2009-04-21 17:23:54 -04:00
|
|
|
[ natural-sort ] bi@
|
|
|
|
[ diff ] [ swap diff ] 2bi
|
2008-06-12 06:49:46 -04:00
|
|
|
] unit-test
|
2008-11-04 03:17:37 -05:00
|
|
|
|
2008-11-04 04:38:44 -05:00
|
|
|
! Long-standing problem
|
|
|
|
USE: multiline
|
|
|
|
|
|
|
|
! So the user has some code...
|
2015-07-02 20:28:17 -04:00
|
|
|
{ } [
|
2015-07-26 01:59:56 -04:00
|
|
|
"IN: classes.test.a
|
2008-11-04 04:38:44 -05:00
|
|
|
GENERIC: g ( a -- b )
|
|
|
|
TUPLE: x ;
|
|
|
|
M: x g ;
|
2015-07-26 01:59:56 -04:00
|
|
|
TUPLE: z < x ;" <string-reader>
|
2008-11-04 04:38:44 -05:00
|
|
|
"class-intersect-no-method-a" parse-stream drop
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
! Note that q inlines M: x g ;
|
2015-07-02 20:28:17 -04:00
|
|
|
{ } [
|
2015-07-26 01:59:56 -04:00
|
|
|
"IN: classes.test.b
|
2008-11-04 04:38:44 -05:00
|
|
|
USE: classes.test.a
|
|
|
|
USE: kernel
|
2015-07-26 01:59:56 -04:00
|
|
|
: q ( -- b ) z new g ;" <string-reader>
|
2008-11-04 04:38:44 -05:00
|
|
|
"class-intersect-no-method-b" parse-stream drop
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
! Now, the user removes the z class and adds a method,
|
2015-07-02 20:28:17 -04:00
|
|
|
{ } [
|
2015-07-26 01:59:56 -04:00
|
|
|
"IN: classes.test.a
|
2008-11-04 04:38:44 -05:00
|
|
|
GENERIC: g ( a -- b )
|
|
|
|
TUPLE: x ;
|
|
|
|
M: x g ;
|
|
|
|
TUPLE: j ;
|
2015-07-26 01:59:56 -04:00
|
|
|
M: j g ;" <string-reader>
|
2008-11-04 04:38:44 -05:00
|
|
|
"class-intersect-no-method-a" parse-stream drop
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
! And changes the definition of q
|
2015-07-02 20:28:17 -04:00
|
|
|
{ } [
|
2015-07-26 01:59:56 -04:00
|
|
|
"IN: classes.test.b
|
2008-11-04 04:38:44 -05:00
|
|
|
USE: classes.test.a
|
|
|
|
USE: kernel
|
2015-07-26 01:59:56 -04:00
|
|
|
: q ( -- b ) j new g ;" <string-reader>
|
2008-11-04 04:38:44 -05:00
|
|
|
"class-intersect-no-method-b" parse-stream drop
|
|
|
|
] unit-test
|
2008-11-05 19:32:02 -05:00
|
|
|
|
|
|
|
! Similar problem, but with anonymous classes
|
2015-07-02 20:28:17 -04:00
|
|
|
{ } [
|
2015-07-26 01:59:56 -04:00
|
|
|
"IN: classes.test.c
|
2008-11-05 19:32:02 -05:00
|
|
|
USE: kernel
|
|
|
|
GENERIC: g ( a -- b )
|
|
|
|
M: object g ;
|
2015-07-26 01:59:56 -04:00
|
|
|
TUPLE: z ;" <string-reader>
|
2008-11-05 19:32:02 -05:00
|
|
|
"class-intersect-no-method-c" parse-stream drop
|
|
|
|
] unit-test
|
|
|
|
|
2015-07-02 20:28:17 -04:00
|
|
|
{ } [
|
2015-07-26 01:59:56 -04:00
|
|
|
"IN: classes.test.d
|
2008-11-05 19:32:02 -05:00
|
|
|
USE: classes.test.c
|
|
|
|
USE: kernel
|
2015-07-26 01:59:56 -04:00
|
|
|
: q ( a -- b ) dup z? [ g ] unless ;" <string-reader>
|
2008-11-05 19:32:02 -05:00
|
|
|
"class-intersect-no-method-d" parse-stream drop
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
! Now, the user removes the z class and adds a method,
|
2015-07-02 20:28:17 -04:00
|
|
|
{ } [
|
2015-07-26 01:59:56 -04:00
|
|
|
"IN: classes.test.c
|
2008-11-05 19:32:02 -05:00
|
|
|
USE: kernel
|
|
|
|
GENERIC: g ( a -- b )
|
|
|
|
M: object g ;
|
|
|
|
TUPLE: j ;
|
2015-07-26 01:59:56 -04:00
|
|
|
M: j g ;" <string-reader>
|
2008-11-05 19:32:02 -05:00
|
|
|
"class-intersect-no-method-c" parse-stream drop
|
|
|
|
] unit-test
|
|
|
|
|
2009-08-18 18:20:17 -04:00
|
|
|
! Forget the above crap
|
|
|
|
[
|
|
|
|
{ "classes.test.a" "classes.test.b" "classes.test.c" "classes.test.d" }
|
|
|
|
[ forget-vocab ] each
|
|
|
|
] with-compilation-unit
|
|
|
|
|
2008-11-05 19:32:02 -05:00
|
|
|
TUPLE: forgotten-predicate-test ;
|
|
|
|
|
2015-07-02 20:28:17 -04:00
|
|
|
{ } [ [ \ forgotten-predicate-test forget ] with-compilation-unit ] unit-test
|
|
|
|
{ f } [ \ forgotten-predicate-test? predicate? ] unit-test
|
2010-02-15 00:34:45 -05:00
|
|
|
|
|
|
|
GENERIC: generic-predicate? ( a -- b )
|
|
|
|
|
2015-07-02 20:28:17 -04:00
|
|
|
{ } [ "IN: classes.tests TUPLE: generic-predicate ;" eval( -- ) ] unit-test
|
2010-02-15 00:34:45 -05:00
|
|
|
|
2015-07-02 20:28:17 -04:00
|
|
|
{ f } [ \ generic-predicate? generic? ] unit-test
|
2016-12-05 11:01:39 -05:00
|
|
|
|
|
|
|
! all-contained-classes
|
|
|
|
{
|
|
|
|
{ maybe{ integer } integer fixnum bignum }
|
|
|
|
} [
|
|
|
|
{ maybe{ integer } } all-contained-classes
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
! contained-classes
|
|
|
|
{
|
|
|
|
{ fixnum bignum }
|
|
|
|
{ integer }
|
|
|
|
} [
|
|
|
|
integer contained-classes
|
|
|
|
maybe{ integer } contained-classes
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
! make-class-props
|
|
|
|
{
|
|
|
|
H{
|
|
|
|
{ "superclass" f }
|
|
|
|
{ "members" { fixnum } }
|
|
|
|
{ "metaclass" f }
|
|
|
|
{ "participants" { } }
|
|
|
|
}
|
|
|
|
} [
|
|
|
|
f { fixnum } { } f make-class-props
|
|
|
|
] unit-test
|
2020-01-15 13:29:06 -05:00
|
|
|
|
|
|
|
{ "test" } [ "test" sequence check-instance ] unit-test
|
|
|
|
[ "test" fixnum check-instance ] [ not-an-instance? ] must-fail-with
|