245 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			245 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Factor
		
	
	
| USING: accessors alien arrays byte-arrays classes.algebra
 | |
| classes.struct compiler.tree.propagation.copy
 | |
| compiler.tree.propagation.info io.encodings.utf8 kernel literals math
 | |
| math.intervals namespaces sequences sequences.private tools.test ;
 | |
| IN: compiler.tree.propagation.info.tests
 | |
| 
 | |
| { f } [ 0.0 -0.0 eql? ] unit-test
 | |
| 
 | |
| ! value-info-intersect
 | |
| { t t } [
 | |
|     0 10 [a,b] <interval-info>
 | |
|     5 20 [a,b] <interval-info>
 | |
|     value-info-intersect
 | |
|     [ class>> real class= ]
 | |
|     [ interval>> 5 10 [a,b] = ]
 | |
|     bi
 | |
| ] unit-test
 | |
| 
 | |
| { float 10.0 t } [
 | |
|     10.0 <literal-info>
 | |
|     10.0 <literal-info>
 | |
|     value-info-intersect
 | |
|     [ class>> ] [ >literal< ] bi
 | |
| ] unit-test
 | |
| 
 | |
| { null } [
 | |
|     10 <literal-info>
 | |
|     10.0 <literal-info>
 | |
|     value-info-intersect
 | |
|     class>>
 | |
| ] unit-test
 | |
| 
 | |
| { fixnum 10 t } [
 | |
|     10 <literal-info>
 | |
|     10 <literal-info>
 | |
|     value-info-union
 | |
|     [ class>> ] [ >literal< ] bi
 | |
| ] unit-test
 | |
| 
 | |
| { 3.0 t } [
 | |
|     3 3 [a,b] <interval-info> float <class-info>
 | |
|     value-info-intersect >literal<
 | |
| ] unit-test
 | |
| 
 | |
| { 3 t } [
 | |
|     2 3 (a,b] <interval-info> fixnum <class-info>
 | |
|     value-info-intersect >literal<
 | |
| ] unit-test
 | |
| 
 | |
| { T{ value-info-state f null empty-interval f f } } [
 | |
|     fixnum -10 0 [a,b] <class/interval-info>
 | |
|     fixnum 19 29 [a,b] <class/interval-info>
 | |
|     value-info-intersect
 | |
| ] unit-test
 | |
| 
 | |
| TUPLE: test-tuple { x read-only } ;
 | |
| 
 | |
| { t } [
 | |
|     f f 3 <literal-info> 3array test-tuple <tuple-info> dup
 | |
|     object-info value-info-intersect =
 | |
| ] unit-test
 | |
| 
 | |
| { t t } [
 | |
|     f <literal-info>
 | |
|     fixnum 0 40 [a,b] <class/interval-info>
 | |
|     value-info-union
 | |
|     \ f class-not <class-info>
 | |
|     value-info-intersect
 | |
|     [ class>> fixnum class= ]
 | |
|     [ interval>> 0 40 [a,b] = ] bi
 | |
| ] unit-test
 | |
| 
 | |
| ! refine-value-info
 | |
| {
 | |
|     $[ fixnum array-capacity-interval <class/interval-info> ]
 | |
| } [
 | |
|     H{ { 1234 1234 } } copies set
 | |
|     {
 | |
|         H{
 | |
|             { 1234 $[ fixnum <class-info> ] }
 | |
|         }
 | |
|     } value-infos set
 | |
|     integer array-capacity-interval <class/interval-info> 1234
 | |
|     refine-value-info
 | |
|     1234 value-info
 | |
| ] unit-test
 | |
| 
 | |
| ! value-info-union
 | |
| 
 | |
| { 3 t } [
 | |
|     3 <literal-info>
 | |
|     null-info value-info-union >literal<
 | |
| ] unit-test
 | |
| 
 | |
| { } [ { } value-infos-union drop ] unit-test
 | |
| 
 | |
| ! interval>literal
 | |
| { 10 t } [
 | |
|     fixnum 10 10 [a,b]  interval>literal
 | |
| ] unit-test
 | |
| 
 | |
| STRUCT: self { s self* } ;
 | |
| 
 | |
| TUPLE: tup1 foo ;
 | |
| 
 | |
| TUPLE: tup2 < tup1 bar ;
 | |
| 
 | |
| : make-slotted-info ( slot-classes class -- info )
 | |
|     [ [ dup [ <class-info> ] when ] map ] dip <tuple-info> ;
 | |
| 
 | |
| ! slots<=
 | |
| { t t f } [
 | |
|     null-info null-info slots<=
 | |
|     { byte-array } self make-slotted-info self <class-info> slots<=
 | |
|     self <class-info> { byte-array } self make-slotted-info slots<=
 | |
| ] unit-test
 | |
| 
 | |
| ! value-info<=
 | |
| ! ------------
 | |
| 
 | |
| ! Comparing classes
 | |
| { t t } [
 | |
|     byte-array c-ptr [ <class-info> ] bi@ value-info<=
 | |
|     alien c-ptr [ <class-info> ] bi@ value-info<=
 | |
| ] unit-test
 | |
| 
 | |
| ! Literals vs. classes
 | |
| { t f } [
 | |
|     20 <literal-info> fixnum <class-info> value-info<=
 | |
|     fixnum <class-info> 20 <literal-info> value-info<=
 | |
| ] unit-test
 | |
| 
 | |
| ! Nulls vs. literals
 | |
| { t f } [
 | |
|     null-info 3 <literal-info> value-info<=
 | |
|     3 <literal-info> null-info value-info<=
 | |
| ] unit-test
 | |
| 
 | |
| ! Fulls vs. literal
 | |
| { t } [
 | |
|     10 <literal-info> f value-info<=
 | |
| ] unit-test
 | |
| 
 | |
| ! Same class, different slots
 | |
| { t t f } [
 | |
|     { byte-array } self make-slotted-info
 | |
|     { c-ptr } self make-slotted-info
 | |
|     value-info<=
 | |
| 
 | |
|     { byte-array byte-array } self make-slotted-info
 | |
|     { } self make-slotted-info
 | |
|     value-info<=
 | |
| 
 | |
|     { } self make-slotted-info
 | |
|     { byte-array byte-array } self make-slotted-info
 | |
|     value-info<=
 | |
| ] unit-test
 | |
| 
 | |
| ! Slots with literals
 | |
| { f } [
 | |
|     10 <literal-info> 1array array <tuple-info>
 | |
|     20 <literal-info> 1array array <tuple-info>
 | |
|     value-info<=
 | |
| ] unit-test
 | |
| 
 | |
| ! Slots, but different classes
 | |
| { t } [
 | |
|     null-info { f c-ptr } self make-slotted-info value-info<=
 | |
| ] unit-test
 | |
| 
 | |
| ! Null vs. null vs. full
 | |
| { t t f } [
 | |
|     null-info null-info value-info<=
 | |
|     null-info f value-info<=
 | |
|     f null-info value-info<=
 | |
| ] unit-test
 | |
| 
 | |
| ! Same class, intervals
 | |
| { t f } [
 | |
|     fixnum 20 30 [a,b] <class/interval-info>
 | |
|     fixnum 0 100 [a,b] <class/interval-info>
 | |
|     value-info<=
 | |
|     fixnum 0 100 [a,b] <class/interval-info>
 | |
|     fixnum 20 30 [a,b] <class/interval-info>
 | |
|     value-info<=
 | |
| ] unit-test
 | |
| 
 | |
| ! Different classes, intervals
 | |
| { t f f } [
 | |
|     fixnum 20 30 [a,b] <class/interval-info>
 | |
|     real 0 100 [a,b] <class/interval-info>
 | |
|     value-info<=
 | |
| 
 | |
|     real 5 10 [a,b] <class/interval-info>
 | |
|     integer 0 20 [a,b] <class/interval-info>
 | |
|     value-info<=
 | |
| 
 | |
|     integer 0 20 [a,b] <class/interval-info>
 | |
|     real 5 10 [a,b] <class/interval-info>
 | |
|     value-info<=
 | |
| ] unit-test
 | |
| 
 | |
| ! Mutable literals
 | |
| { f f } [
 | |
|     [ "foo" ] <literal-info> [ "foo" ] <literal-info> value-info<=
 | |
|     "hey" <literal-info> "hey" <literal-info> value-info<=
 | |
| ] unit-test
 | |
| 
 | |
| ! Tuples
 | |
| { t f } [
 | |
|     tup2 <class-info> tup1 <class-info> value-info<=
 | |
|     tup1 <class-info> tup2 <class-info> value-info<=
 | |
| ] unit-test
 | |
| 
 | |
| ! <class-info>
 | |
| { utf8 } [ utf8 <class-info> class>> ] unit-test
 | |
| 
 | |
| ! init-interval
 | |
| {
 | |
|     T{ value-info-state
 | |
|        { class array-capacity }
 | |
|        { interval $[ array-capacity-interval ] }
 | |
|     }
 | |
| } [
 | |
|     <value-info> -100 100 [a,b] >>interval array-capacity >>class
 | |
|     init-interval
 | |
| ] unit-test
 | |
| 
 | |
| ! wrap-interval
 | |
| ${
 | |
|     full-interval
 | |
|     empty-interval
 | |
|     fixnum-interval
 | |
|     array-capacity-interval
 | |
|     array-capacity-interval
 | |
|     -100 100 [a,b]
 | |
| } [
 | |
|     full-interval integer wrap-interval
 | |
|     empty-interval integer wrap-interval
 | |
|     full-interval fixnum wrap-interval
 | |
|     fixnum-interval array-capacity wrap-interval
 | |
|     -100 100 [a,b] array-capacity wrap-interval
 | |
|     -100 100 [a,b] integer wrap-interval
 | |
| ] unit-test
 |