116 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Factor
		
	
	
| USING: alien arrays definitions generic assocs hashtables io
 | |
| io.streams.string kernel math namespaces parser prettyprint
 | |
| sequences strings tools.test vectors words quotations classes
 | |
| classes.private classes.union classes.mixin classes.predicate
 | |
| classes.algebra vectors definitions source-files compiler.units
 | |
| kernel.private sorting vocabs memory eval accessors ;
 | |
| IN: classes.tests
 | |
| 
 | |
| [ 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
 | |
| [ t ] [ "hi" \ hi-tag instance? ] unit-test
 | |
| 
 | |
| ! Regression
 | |
| GENERIC: method-forget-test ( obj -- obj )
 | |
| TUPLE: method-forget-class ;
 | |
| M: method-forget-class method-forget-test ;
 | |
| 
 | |
| [ 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
 | |
| 
 | |
| [ t ] [
 | |
|     all-words [ class? ] filter
 | |
|     implementors-map get keys
 | |
|     [ natural-sort ] bi@ =
 | |
| ] unit-test
 | |
| 
 | |
| ! Minor leak
 | |
| [ ] [ "IN: classes.tests TUPLE: forget-me ;" eval ] unit-test
 | |
| [ ] [ f \ word set-global ] unit-test
 | |
| [ ] [ "IN: classes.tests USE: kernel USE: classes.algebra forget-me tuple class<= drop" eval ] unit-test
 | |
| [ ] [ "IN: classes.tests FORGET: forget-me" eval ] unit-test
 | |
| [ 0 ] [
 | |
|     [ word? ] instances
 | |
|     [ [ name>> "forget-me" = ] [ vocabulary>> "classes.tests" = ] bi and ] count
 | |
| ] unit-test
 | |
| 
 | |
| ! Long-standing problem
 | |
| USE: multiline
 | |
| 
 | |
| ! So the user has some code...
 | |
| [ ] [
 | |
|     <" IN: classes.test.a
 | |
|     GENERIC: g ( a -- b )
 | |
|     TUPLE: x ;
 | |
|     M: x g ;
 | |
|     TUPLE: z < x ;"> <string-reader>
 | |
|     "class-intersect-no-method-a" parse-stream drop
 | |
| ] unit-test
 | |
| 
 | |
| ! Note that q inlines M: x g ;
 | |
| [ ] [
 | |
|     <" IN: classes.test.b
 | |
|     USE: classes.test.a
 | |
|     USE: kernel
 | |
|     : q ( -- b ) z new g ;"> <string-reader>
 | |
|     "class-intersect-no-method-b" parse-stream drop
 | |
| ] unit-test
 | |
| 
 | |
| ! Now, the user removes the z class and adds a method,
 | |
| [ ] [
 | |
|     <" IN: classes.test.a
 | |
|     GENERIC: g ( a -- b )
 | |
|     TUPLE: x ;
 | |
|     M: x g ;
 | |
|     TUPLE: j ;
 | |
|     M: j g ;"> <string-reader>
 | |
|     "class-intersect-no-method-a" parse-stream drop
 | |
| ] unit-test
 | |
| 
 | |
| ! And changes the definition of q
 | |
| [ ] [
 | |
|     <" IN: classes.test.b
 | |
|     USE: classes.test.a
 | |
|     USE: kernel
 | |
|     : q ( -- b ) j new g ;"> <string-reader>
 | |
|     "class-intersect-no-method-b" parse-stream drop
 | |
| ] unit-test
 | |
| 
 | |
| ! Similar problem, but with anonymous classes
 | |
| [ ] [
 | |
|     <" IN: classes.test.c
 | |
|     USE: kernel
 | |
|     GENERIC: g ( a -- b )
 | |
|     M: object g ;
 | |
|     TUPLE: z ;"> <string-reader>
 | |
|     "class-intersect-no-method-c" parse-stream drop
 | |
| ] unit-test
 | |
| 
 | |
| [ ] [
 | |
|     <" IN: classes.test.d
 | |
|     USE: classes.test.c
 | |
|     USE: kernel
 | |
|     : q ( a -- b ) dup z? [ g ] unless ;"> <string-reader>
 | |
|     "class-intersect-no-method-d" parse-stream drop
 | |
| ] unit-test
 | |
| 
 | |
| ! Now, the user removes the z class and adds a method,
 | |
| [ ] [
 | |
|     <" IN: classes.test.c
 | |
|     USE: kernel
 | |
|     GENERIC: g ( a -- b )
 | |
|     M: object g ;
 | |
|     TUPLE: j ;
 | |
|     M: j g ;"> <string-reader>
 | |
|     "class-intersect-no-method-c" parse-stream drop
 | |
| ] unit-test
 | |
| 
 | |
| TUPLE: forgotten-predicate-test ;
 | |
| 
 | |
| [ ] [ [ \ forgotten-predicate-test forget ] with-compilation-unit ] unit-test
 | |
| [ f ] [ \ forgotten-predicate-test? predicate? ] unit-test
 |