factor/basis/compiler/tree/propagation/info/info-tests.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