factor/core/classes/tuple/tuple-tests.factor

806 lines
22 KiB
Factor
Raw Normal View History

USING: accessors arrays assocs calendar classes classes.algebra
classes.private classes.tuple classes.tuple.private columns
compiler.errors compiler.units continuations definitions
effects eval generic generic.single generic.standard grouping
io.streams.string kernel kernel.private math math.constants
math.order namespaces parser parser.notes prettyprint
quotations random see sequences sequences.private slots
slots.private splitting strings summary threads tools.test
vectors vocabs words words.symbol fry literals memory ;
IN: classes.tuple.tests
2007-09-20 18:09:08 -04:00
TUPLE: rect x y w h ;
2008-06-08 16:32:55 -04:00
: <rect> ( x y w h -- rect ) rect boa ;
2007-09-20 18:09:08 -04:00
2008-03-26 17:38:31 -04:00
: move ( x rect -- rect )
[ + ] change-x ;
2007-09-20 18:09:08 -04:00
2008-03-26 17:38:31 -04:00
[ f ] [ 10 20 30 40 <rect> dup clone 5 swap move = ] unit-test
2007-09-20 18:09:08 -04:00
2008-03-26 17:38:31 -04:00
[ t ] [ 10 20 30 40 <rect> dup clone 0 swap move = ] unit-test
2007-09-20 18:09:08 -04:00
2008-03-26 17:38:31 -04:00
! Make sure we handle tuple class redefinition
TUPLE: redefinition-test ;
C: <redefinition-test> redefinition-test
<redefinition-test> "redefinition-test" set
[ t ] [ "redefinition-test" get redefinition-test? ] unit-test
2009-04-17 16:49:21 -04:00
"IN: classes.tuple.tests TUPLE: redefinition-test ;" eval( -- )
2008-03-26 17:38:31 -04:00
[ t ] [ "redefinition-test" get redefinition-test? ] unit-test
2007-09-20 18:09:08 -04:00
! Make sure we handle changing shapes!
TUPLE: point x y ;
2009-04-21 17:09:53 -04:00
[ ] [ 100 200 point boa "p" set ] unit-test
2007-09-20 18:09:08 -04:00
! Use eval to sequence parsing explicitly
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: point x y z ;" eval( -- ) ] unit-test
2008-03-26 17:38:31 -04:00
[ 100 ] [ "p" get x>> ] unit-test
[ 200 ] [ "p" get y>> ] unit-test
[ f ] [ "p" get "z>>" "accessors" lookup execute ] unit-test
2007-09-20 18:09:08 -04:00
2008-04-02 03:44:10 -04:00
[ ] [ "p" get 300 ">>z" "accessors" lookup execute drop ] unit-test
2007-09-20 18:09:08 -04:00
[ 3 ] [ "p" get tuple-size ] unit-test
2008-03-26 17:38:31 -04:00
[ 300 ] [ "p" get "z>>" "accessors" lookup execute ] unit-test
2007-09-20 18:09:08 -04:00
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: point z y ;" eval( -- ) ] unit-test
2007-09-20 18:09:08 -04:00
[ 2 ] [ "p" get tuple-size ] unit-test
2008-03-26 17:38:31 -04:00
[ "p" get x>> ] must-fail
[ 200 ] [ "p" get y>> ] unit-test
[ 300 ] [ "p" get "z>>" "accessors" lookup execute ] unit-test
2007-09-20 18:09:08 -04:00
TUPLE: predicate-test ;
C: <predicate-test> predicate-test
2009-03-22 21:16:31 -04:00
: predicate-test ( a -- ? ) drop f ;
2007-09-20 18:09:08 -04:00
[ t ] [ <predicate-test> predicate-test? ] unit-test
2008-03-26 19:23:19 -04:00
PREDICATE: silly-pred < tuple
2007-09-20 18:09:08 -04:00
class \ rect = ;
2008-06-08 16:32:55 -04:00
GENERIC: area ( obj -- n )
2008-03-26 17:38:31 -04:00
M: silly-pred area dup w>> swap h>> * ;
2007-09-20 18:09:08 -04:00
TUPLE: circle radius ;
2008-03-26 17:38:31 -04:00
M: circle area radius>> sq pi * ;
2007-09-20 18:09:08 -04:00
[ 200 ] [ T{ rect f 0 0 10 20 } area ] unit-test
! Hashcode breakage
TUPLE: empty ;
C: <empty> empty
[ t ] [ <empty> hashcode fixnum? ] unit-test
! Compiler regression
2008-03-26 17:38:31 -04:00
[ t length ] [ object>> t eq? ] must-fail-with
2007-09-20 18:09:08 -04:00
[ "<constructor-test>" ]
2009-04-17 16:49:21 -04:00
[ "IN: classes.tuple.test TUPLE: constructor-test ; C: <constructor-test> constructor-test" eval( -- ) word name>> ] unit-test
2007-09-20 18:09:08 -04:00
TUPLE: size-test a b c d ;
[ t ] [
2008-03-26 17:38:31 -04:00
T{ size-test } tuple-size
size-test tuple-layout second =
2007-09-20 18:09:08 -04:00
] unit-test
2009-03-22 21:16:31 -04:00
GENERIC: <yo-momma> ( a -- b )
2007-09-20 18:09:08 -04:00
TUPLE: yo-momma ;
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests C: <yo-momma> yo-momma" eval( -- ) ] unit-test
2007-09-20 18:09:08 -04:00
[ f ] [ \ <yo-momma> generic? ] unit-test
! Test forget
[
[ t ] [ \ yo-momma class? ] unit-test
[ ] [ \ yo-momma forget ] unit-test
2008-06-11 18:40:33 -04:00
[ ] [ \ <yo-momma> forget ] unit-test
[ f ] [ \ yo-momma update-map get values member-eq? ] unit-test
] with-compilation-unit
2007-09-20 18:09:08 -04:00
TUPLE: loc-recording ;
[ f ] [ \ loc-recording where not ] unit-test
! 'forget' wasn't robust enough
TUPLE: forget-robustness ;
2009-03-22 21:16:31 -04:00
GENERIC: forget-robustness-generic ( a -- b )
2007-09-20 18:09:08 -04:00
M: forget-robustness forget-robustness-generic ;
M: integer forget-robustness-generic ;
[
[ ] [ \ forget-robustness-generic forget ] unit-test
[ ] [ \ forget-robustness forget ] unit-test
2009-04-06 05:16:39 -04:00
[ ] [ M\ forget-robustness forget-robustness-generic forget ] unit-test
] with-compilation-unit
2007-09-20 18:09:08 -04:00
! rapido found this one
GENERIC# m1 0 ( s n -- n )
GENERIC# m2 1 ( s n -- v )
TUPLE: t1 ;
M: t1 m1 drop ;
M: t1 m2 nip ;
TUPLE: t2 ;
M: t2 m1 drop ;
M: t2 m2 nip ;
TUPLE: t3 ;
M: t3 m1 drop ;
M: t3 m2 nip ;
TUPLE: t4 ;
M: t4 m1 drop ;
M: t4 m2 nip ;
C: <t4> t4
[ 1 ] [ 1 <t4> m1 ] unit-test
[ 1 ] [ <t4> 1 m2 ] unit-test
! another combination issue
2008-06-08 16:32:55 -04:00
GENERIC: silly ( obj -- obj obj )
2007-09-20 18:09:08 -04:00
UNION: my-union slice repetition column array vector reversed ;
M: my-union silly "x" ;
M: array silly "y" ;
M: column silly "fdsfds" ;
M: repetition silly "zzz" ;
M: reversed silly "zz" ;
M: slice silly "tt" ;
M: string silly "t" ;
M: vector silly "z" ;
[ "zz" ] [ 123 <reversed> silly nip ] unit-test
! Typo
SYMBOL: not-a-tuple-class
! Missing check
[ not-a-tuple-class boa ] must-fail
[ not-a-tuple-class new ] must-fail
2007-09-20 18:09:08 -04:00
2007-12-26 20:02:41 -05:00
TUPLE: erg's-reshape-problem a b c d ;
2007-09-20 18:09:08 -04:00
2007-12-24 19:40:09 -05:00
C: <erg's-reshape-problem> erg's-reshape-problem
2007-09-20 18:09:08 -04:00
2008-03-26 19:23:19 -04:00
! Inheritance
TUPLE: computer cpu ram ;
2008-03-27 02:42:13 -04:00
C: <computer> computer
2008-03-26 19:23:19 -04:00
2008-03-26 19:37:28 -04:00
[ "TUPLE: computer cpu ram ;" ] [
[ \ computer see ] with-string-writer string-lines second
2008-03-26 19:23:19 -04:00
] unit-test
TUPLE: laptop < computer battery ;
C: <laptop> laptop
[ t ] [ laptop tuple-class? ] unit-test
2008-05-02 03:51:38 -04:00
[ t ] [ laptop tuple class<= ] unit-test
[ t ] [ laptop computer class<= ] unit-test
2008-03-26 19:23:19 -04:00
[ t ] [ laptop computer classes-intersect? ] unit-test
[ ] [ "Pentium" 128 3 hours <laptop> "laptop" set ] unit-test
[ t ] [ "laptop" get laptop? ] unit-test
[ t ] [ "laptop" get computer? ] unit-test
[ t ] [ "laptop" get tuple? ] unit-test
2008-06-08 16:32:55 -04:00
: test-laptop-slot-values ( -- )
[ laptop ] [ "laptop" get class ] unit-test
[ "Pentium" ] [ "laptop" get cpu>> ] unit-test
[ 128 ] [ "laptop" get ram>> ] unit-test
[ t ] [ "laptop" get battery>> 3 hours = ] unit-test ;
test-laptop-slot-values
2008-03-27 02:42:13 -04:00
2008-03-26 19:37:28 -04:00
[ "TUPLE: laptop < computer battery ;" ] [
[ \ laptop see ] with-string-writer string-lines second
2008-03-26 19:23:19 -04:00
] unit-test
2008-03-27 02:42:13 -04:00
[ { tuple computer laptop } ] [ laptop superclasses ] unit-test
TUPLE: server < computer rackmount ;
2008-03-26 19:23:19 -04:00
C: <server> server
[ t ] [ server tuple-class? ] unit-test
2008-05-02 03:51:38 -04:00
[ t ] [ server tuple class<= ] unit-test
[ t ] [ server computer class<= ] unit-test
2008-03-26 19:23:19 -04:00
[ t ] [ server computer classes-intersect? ] unit-test
2008-03-27 02:42:13 -04:00
[ ] [ "PowerPC" 64 "1U" <server> "server" set ] unit-test
2008-03-26 19:23:19 -04:00
[ t ] [ "server" get server? ] unit-test
[ t ] [ "server" get computer? ] unit-test
[ t ] [ "server" get tuple? ] unit-test
2008-06-08 16:32:55 -04:00
: test-server-slot-values ( -- )
[ server ] [ "server" get class ] unit-test
[ "PowerPC" ] [ "server" get cpu>> ] unit-test
[ 64 ] [ "server" get ram>> ] unit-test
[ "1U" ] [ "server" get rackmount>> ] unit-test ;
test-server-slot-values
2008-03-27 02:42:13 -04:00
2008-03-26 19:23:19 -04:00
[ f ] [ "server" get laptop? ] unit-test
[ f ] [ "laptop" get server? ] unit-test
2008-05-02 03:51:38 -04:00
[ f ] [ server laptop class<= ] unit-test
[ f ] [ laptop server class<= ] unit-test
2008-03-26 19:23:19 -04:00
[ f ] [ laptop server classes-intersect? ] unit-test
2008-03-27 02:42:13 -04:00
[ f ] [ 1 2 <computer> laptop? ] unit-test
[ f ] [ \ + server? ] unit-test
[ "TUPLE: server < computer rackmount ;" ] [
2008-03-26 19:37:28 -04:00
[ \ server see ] with-string-writer string-lines second
2008-03-26 19:23:19 -04:00
] unit-test
[
"IN: classes.tuple.tests TUPLE: invalid-superclass < word ;" eval( -- )
2008-03-26 19:23:19 -04:00
] must-fail
! Dynamically changing inheritance hierarchy
2008-03-28 21:28:17 -04:00
TUPLE: electronic-device ;
: computer?' ( a -- b ) computer? ;
[ t ] [ laptop new computer?' ] unit-test
2009-04-21 17:09:53 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: computer < electronic-device cpu ram ; C: <computer> computer C: <laptop> laptop C: <server> server" eval( -- ) ] unit-test
2008-03-28 21:28:17 -04:00
[ t ] [ laptop new computer?' ] unit-test
2008-05-02 03:51:38 -04:00
[ f ] [ electronic-device laptop class<= ] unit-test
[ t ] [ server electronic-device class<= ] unit-test
[ t ] [ laptop server class-or electronic-device class<= ] unit-test
2008-03-28 21:28:17 -04:00
[ t ] [ "laptop" get electronic-device? ] unit-test
[ t ] [ "laptop" get computer? ] unit-test
[ t ] [ "laptop" get laptop? ] unit-test
[ f ] [ "laptop" get server? ] unit-test
[ t ] [ "server" get electronic-device? ] unit-test
[ t ] [ "server" get computer? ] unit-test
[ f ] [ "server" get laptop? ] unit-test
[ t ] [ "server" get server? ] unit-test
2009-04-21 17:09:53 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: computer cpu ram ; C: <computer> computer C: <laptop> laptop C: <server> server" eval( -- ) ] unit-test
2008-03-28 21:28:17 -04:00
[ f ] [ "laptop" get electronic-device? ] unit-test
[ t ] [ "laptop" get computer? ] unit-test
2009-04-21 17:09:53 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: computer < electronic-device cpu ram disk ; C: <computer> computer C: <laptop> laptop C: <server> server" eval( -- ) ] unit-test
test-laptop-slot-values
test-server-slot-values
2009-04-21 17:09:53 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: electronic-device voltage ; C: <computer> computer C: <laptop> laptop C: <server> server" eval( -- ) ] unit-test
test-laptop-slot-values
test-server-slot-values
TUPLE: make-me-some-accessors voltage grounded? ;
[ f ] [ "laptop" get voltage>> ] unit-test
[ f ] [ "server" get voltage>> ] unit-test
[ ] [ "laptop" get 220 >>voltage drop ] unit-test
[ ] [ "server" get 110 >>voltage drop ] unit-test
2009-04-21 17:09:53 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: electronic-device voltage grounded? ; C: <computer> computer" eval( -- ) ] unit-test
test-laptop-slot-values
test-server-slot-values
[ 220 ] [ "laptop" get voltage>> ] unit-test
[ 110 ] [ "server" get voltage>> ] unit-test
2009-04-21 17:09:53 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: electronic-device grounded? voltage ; C: <computer> computer C: <laptop> laptop C: <server> server" eval( -- ) ] unit-test
test-laptop-slot-values
test-server-slot-values
[ 220 ] [ "laptop" get voltage>> ] unit-test
[ 110 ] [ "server" get voltage>> ] unit-test
! Reshaping superclass and subclass simultaneously
2009-04-21 17:09:53 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: electronic-device voltage ; TUPLE: computer < electronic-device cpu ram ; C: <computer> computer C: <laptop> laptop C: <server> server" eval( -- ) ] unit-test
test-laptop-slot-values
test-server-slot-values
[ 220 ] [ "laptop" get voltage>> ] unit-test
[ 110 ] [ "server" get voltage>> ] unit-test
! Reshape crash
TUPLE: test1 a ; TUPLE: test2 < test1 b ;
2009-04-21 17:09:53 -04:00
"a" "b" test2 boa "test" set
2008-06-08 16:32:55 -04:00
: test-a/b ( -- )
[ "a" ] [ "test" get a>> ] unit-test
[ "b" ] [ "test" get b>> ] unit-test ;
test-a/b
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: test1 a x ; TUPLE: test2 < test1 b y ;" eval( -- ) ] unit-test
test-a/b
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: test1 a ; TUPLE: test2 < test1 b ;" eval( -- ) ] unit-test
test-a/b
2008-03-31 02:26:09 -04:00
! Twice in the same compilation unit
[
test1 tuple { "a" "x" "y" } define-tuple-class
test1 tuple { "a" "y" } define-tuple-class
] with-compilation-unit
test-a/b
2008-03-31 04:40:27 -04:00
! Moving slots up and down
TUPLE: move-up-1 a b ;
TUPLE: move-up-2 < move-up-1 c ;
T{ move-up-2 f "a" "b" "c" } "move-up" set
2008-06-08 16:32:55 -04:00
: test-move-up ( -- )
2008-03-31 04:40:27 -04:00
[ "a" ] [ "move-up" get a>> ] unit-test
[ "b" ] [ "move-up" get b>> ] unit-test
[ "c" ] [ "move-up" get c>> ] unit-test ;
test-move-up
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: move-up-1 a b c ; TUPLE: move-up-2 < move-up-1 ;" eval( -- ) ] unit-test
2008-03-31 04:40:27 -04:00
test-move-up
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: move-up-1 a c ; TUPLE: move-up-2 < move-up-1 b ;" eval( -- ) ] unit-test
2008-03-31 04:40:27 -04:00
test-move-up
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: move-up-1 c ; TUPLE: move-up-2 < move-up-1 b a ;" eval( -- ) ] unit-test
2008-03-31 04:40:27 -04:00
test-move-up
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: move-up-1 ; TUPLE: move-up-2 < move-up-1 a b c ;" eval( -- ) ] unit-test
2008-03-31 04:40:27 -04:00
! Constructors must be recompiled when changing superclass
TUPLE: constructor-update-1 xxx ;
TUPLE: constructor-update-2 < constructor-update-1 yyy zzz ;
2009-04-21 17:09:53 -04:00
: <constructor-update-2> ( a b c -- tuple ) constructor-update-2 boa ;
2008-03-31 04:40:27 -04:00
{ 3 1 } [ <constructor-update-2> ] must-infer-as
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: constructor-update-1 xxx ttt www ;" eval( -- ) ] unit-test
2008-03-31 04:40:27 -04:00
2009-04-21 17:09:53 -04:00
{ 3 1 } [ <constructor-update-2> ] must-infer-as
[ 1 2 3 4 5 <constructor-update-2> ] [ not-compiled? ] must-fail-with
2008-03-31 04:40:27 -04:00
2009-04-21 17:09:53 -04:00
[ ] [ [ \ <constructor-update-2> forget ] with-compilation-unit ] unit-test
2008-03-31 04:40:27 -04:00
2008-03-29 06:03:04 -04:00
! Redefinition problem
TUPLE: redefinition-problem ;
UNION: redefinition-problem' redefinition-problem integer ;
[ t ] [ 3 redefinition-problem'? ] unit-test
TUPLE: redefinition-problem-2 ;
2009-04-17 16:49:21 -04:00
"IN: classes.tuple.tests TUPLE: redefinition-problem < redefinition-problem-2 ;" eval( -- )
2008-03-29 06:03:04 -04:00
[ t ] [ 3 redefinition-problem'? ] unit-test
2008-03-26 18:07:50 -04:00
! Hardcore unit tests
2008-07-13 22:06:50 -04:00
\ thread "slots" word-prop "slots" set
2008-03-26 18:07:50 -04:00
[ ] [
[
2008-07-13 22:06:50 -04:00
\ thread tuple { "xxx" } "slots" get append
2008-03-26 18:07:50 -04:00
define-tuple-class
] with-compilation-unit
[ 1337 sleep ] "Test" spawn drop
[
2008-07-13 22:06:50 -04:00
\ thread tuple "slots" get
2008-03-26 18:07:50 -04:00
define-tuple-class
] with-compilation-unit
] unit-test
2008-07-13 22:06:50 -04:00
\ vocab "slots" word-prop "slots" set
2008-03-26 18:07:50 -04:00
[ ] [
[
\ vocab identity-tuple { "xxx" } "slots" get append
2008-03-26 18:07:50 -04:00
define-tuple-class
] with-compilation-unit
all-words drop
[
\ vocab identity-tuple "slots" get
2008-03-26 18:07:50 -04:00
define-tuple-class
] with-compilation-unit
] unit-test
2009-04-17 16:49:21 -04:00
[ "USE: words T{ word }" eval( -- ) ]
[ error>> T{ no-method f word new } = ]
2008-06-30 04:10:43 -04:00
must-fail-with
! Accessors not being forgotten...
[ [ ] ] [
"IN: classes.tuple.tests TUPLE: forget-accessors-test x y z ;"
<string-reader>
"forget-accessors-test" parse-stream
] unit-test
[ t ] [ "forget-accessors-test" "classes.tuple.tests" lookup class? ] unit-test
2009-04-17 13:45:57 -04:00
: accessor-exists? ( name -- ? )
[ "forget-accessors-test" "classes.tuple.tests" lookup ] dip
">>" append "accessors" lookup method >boolean ;
[ t ] [ "x" accessor-exists? ] unit-test
[ t ] [ "y" accessor-exists? ] unit-test
[ t ] [ "z" accessor-exists? ] unit-test
[ [ ] ] [
2009-03-22 21:16:31 -04:00
"IN: classes.tuple.tests GENERIC: forget-accessors-test ( a -- b )"
<string-reader>
"forget-accessors-test" parse-stream
] unit-test
[ f ] [ "forget-accessors-test" "classes.tuple.tests" lookup class? ] unit-test
[ f ] [ "x" accessor-exists? ] unit-test
[ f ] [ "y" accessor-exists? ] unit-test
[ f ] [ "z" accessor-exists? ] unit-test
2008-04-03 05:58:37 -04:00
TUPLE: another-forget-accessors-test ;
[ [ ] ] [
2009-03-22 21:16:31 -04:00
"IN: classes.tuple.tests GENERIC: another-forget-accessors-test ( a -- b )"
2008-04-03 05:58:37 -04:00
<string-reader>
"another-forget-accessors-test" parse-stream
] unit-test
[ t ] [ \ another-forget-accessors-test class? ] unit-test
2008-04-07 21:44:43 -04:00
! Shadowing test
[ f ] [
t parser-notes? [
[
2009-04-17 16:49:21 -04:00
"IN: classes.tuple.tests TUPLE: shadow-1 a b ; TUPLE: shadow-2 < shadow-1 a b ;" eval( -- )
2008-04-07 21:44:43 -04:00
] with-string-writer empty?
] with-variable
] unit-test
! Missing error check
2009-04-17 16:49:21 -04:00
[ "IN: classes.tuple.tests USE: words TUPLE: wrong-superclass < word ;" eval( -- ) ] must-fail
2008-05-06 10:01:28 -04:00
! Insufficient type checking
[ \ vocab tuple>array drop ] must-fail
2008-06-30 02:44:58 -04:00
! Check type declarations
TUPLE: declared-types { n fixnum } { m string } ;
[ T{ declared-types f 0 "hi" } ]
[ { declared-types 0 "hi" } >tuple ]
2008-06-30 02:44:58 -04:00
unit-test
[ { declared-types "hi" 0 } >tuple ]
2008-06-30 02:44:58 -04:00
[ T{ bad-slot-value f "hi" fixnum } = ]
must-fail-with
! Check fixnum coercer
[ 0 ] [ 0.0 "hi" declared-types boa n>> ] unit-test
[ 0 ] [ declared-types new 0.0 >>n n>> ] unit-test
! Check bignum coercer
TUPLE: bignum-coercer { n bignum initial: $[ 0 >bignum ] } ;
[ 13 bignum ] [ 13.5 bignum-coercer boa n>> dup class ] unit-test
[ 13 bignum ] [ bignum-coercer new 13.5 >>n n>> dup class ] unit-test
! Check float coercer
TUPLE: float-coercer { n float } ;
[ 13.0 float ] [ 13 float-coercer boa n>> dup class ] unit-test
[ 13.0 float ] [ float-coercer new 13 >>n n>> dup class ] unit-test
! Check integer coercer
TUPLE: integer-coercer { n integer } ;
[ 13 fixnum ] [ 13.5 integer-coercer boa n>> dup class ] unit-test
[ 13 fixnum ] [ integer-coercer new 13.5 >>n n>> dup class ] unit-test
2008-06-30 02:44:58 -04:00
: foo ( a b -- c ) declared-types boa ;
\ foo def>> must-infer
2008-06-30 02:44:58 -04:00
[ T{ declared-types f 0 "hi" } ] [ 0.0 "hi" foo ] unit-test
[ "hi" 0.0 declared-types boa ]
[ T{ no-method f "hi" >fixnum } = ]
must-fail-with
[ 0 { } declared-types boa ]
[ T{ bad-slot-value f { } string } = ]
must-fail-with
[ "hi" 0.0 foo ]
[ T{ no-method f "hi" >fixnum } = ]
must-fail-with
[ 0 { } foo ]
[ T{ bad-slot-value f { } string } = ]
must-fail-with
2008-06-30 04:10:43 -04:00
[ T{ declared-types f 0 "" } ] [ declared-types new ] unit-test
: blah ( -- vec ) vector new ;
2009-04-21 17:09:53 -04:00
[ vector new ] must-infer
2008-06-30 04:10:43 -04:00
[ V{ } ] [ blah ] unit-test
! Test reshaping with type declarations and slot attributes
TUPLE: reshape-test x ;
T{ reshape-test f "hi" } "tuple" set
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: reshape-test { x read-only } ;" eval( -- ) ] unit-test
[ f ] [ \ reshape-test \ x<< method ] unit-test
[ "tuple" get 5 >>x ] must-fail
[ "hi" ] [ "tuple" get x>> ] unit-test
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests USE: math TUPLE: reshape-test { x integer read-only } ;" eval( -- ) ] unit-test
[ 0 ] [ "tuple" get x>> ] unit-test
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests USE: math TUPLE: reshape-test { x fixnum initial: 4 read-only } ;" eval( -- ) ] unit-test
[ 0 ] [ "tuple" get x>> ] unit-test
TUPLE: boa-coercer-test { x array-capacity } ;
2008-07-02 16:57:38 -04:00
[ fixnum ] [ 0 >bignum boa-coercer-test boa x>> class ] unit-test
2008-07-03 03:47:29 -04:00
2008-07-05 21:37:28 -04:00
[ T{ boa-coercer-test f 0 } ] [ T{ boa-coercer-test } ] unit-test
2008-07-03 03:47:29 -04:00
! Test error classes
ERROR: error-class-test a b c ;
[ "( a b c -- * )" ] [ \ error-class-test stack-effect effect>string ] unit-test
[ f ] [ \ error-class-test "inline" word-prop ] unit-test
2009-04-17 16:49:21 -04:00
[ "IN: classes.tuple.tests ERROR: error-x ; : error-x 3 ;" eval( -- ) ]
2008-07-03 03:47:29 -04:00
[ error>> error>> redefine-error? ] must-fail-with
DEFER: error-y
2008-07-03 03:50:45 -04:00
[ ] [ [ \ error-y dup class? [ forget-class ] [ drop ] if ] with-compilation-unit ] unit-test
2008-07-03 03:47:29 -04:00
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests GENERIC: error-y ( a -- b )" eval( -- ) ] unit-test
2008-07-03 03:47:29 -04:00
[ f ] [ \ error-y tuple-class? ] unit-test
[ t ] [ \ error-y generic? ] unit-test
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests ERROR: error-y ;" eval( -- ) ] unit-test
2008-07-03 03:47:29 -04:00
[ t ] [ \ error-y tuple-class? ] unit-test
[ f ] [ \ error-y generic? ] unit-test
2008-07-10 03:11:49 -04:00
[ ] [
"IN: classes.tuple.tests TUPLE: forget-subclass-test ; TUPLE: forget-subclass-test' < forget-subclass-test ;"
<string-reader> "forget-subclass-test" parse-stream
drop
] unit-test
[ ] [ "forget-subclass-test'" "classes.tuple.tests" lookup new "bad-object" set ] unit-test
[ ] [
"IN: classes.tuple.tests TUPLE: forget-subclass-test a ;"
<string-reader> "forget-subclass-test" parse-stream
drop
] unit-test
[ ] [
2009-04-17 16:49:21 -04:00
"IN: sequences TUPLE: reversed { seq read-only } ;" eval( -- )
] unit-test
2008-09-02 03:02:05 -04:00
TUPLE: bogus-hashcode-1 x ;
TUPLE: bogus-hashcode-2 x ;
M: bogus-hashcode-1 hashcode* 2drop 0 >bignum ;
[ ] [ T{ bogus-hashcode-2 f T{ bogus-hashcode-1 } } hashcode drop ] unit-test
DEFER: change-slot-test
SLOT: kex
[ ] [
"IN: classes.tuple.tests USING: kernel accessors ; TUPLE: change-slot-test ; SLOT: kex M: change-slot-test kex>> drop 3 ;"
<string-reader> "change-slot-test" parse-stream
drop
] unit-test
[ t ] [ \ change-slot-test \ kex>> method >boolean ] unit-test
[ ] [
"IN: classes.tuple.tests USING: kernel accessors ; TUPLE: change-slot-test kex ;"
<string-reader> "change-slot-test" parse-stream
drop
] unit-test
[ t ] [ \ change-slot-test \ kex>> method >boolean ] unit-test
[ ] [
"IN: classes.tuple.tests USING: kernel accessors ; TUPLE: change-slot-test ; SLOT: kex M: change-slot-test kex>> drop 3 ;"
<string-reader> "change-slot-test" parse-stream
drop
] unit-test
[ t ] [ \ change-slot-test \ kex>> method >boolean ] unit-test
2009-03-22 21:16:31 -04:00
[ f ] [ \ change-slot-test \ kex>> method "reading" word-prop ] unit-test
DEFER: redefine-tuple-twice
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: redefine-tuple-twice ;" eval( -- ) ] unit-test
2009-03-22 21:16:31 -04:00
[ t ] [ \ redefine-tuple-twice symbol? ] unit-test
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests DEFER: redefine-tuple-twice" eval( -- ) ] unit-test
2009-03-22 21:16:31 -04:00
[ t ] [ \ redefine-tuple-twice deferred? ] unit-test
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: redefine-tuple-twice ;" eval( -- ) ] unit-test
2009-03-22 21:16:31 -04:00
2009-04-17 13:45:57 -04:00
[ t ] [ \ redefine-tuple-twice symbol? ] unit-test
ERROR: base-error x y ;
ERROR: derived-error < base-error z ;
[ (( x y z -- * )) ] [ \ derived-error stack-effect ] unit-test
! Make sure that tuple reshaping updates code heap roots
TUPLE: code-heap-ref ;
: code-heap-ref' ( -- a ) T{ code-heap-ref } ;
! Push foo's literal to tenured space
[ ] [ gc ] unit-test
! Reshape!
[ ] [ "IN: classes.tuple.tests USE: math TUPLE: code-heap-ref { x integer initial: 5 } ;" eval( -- ) ] unit-test
! Code heap reference
[ t ] [ code-heap-ref' code-heap-ref? ] unit-test
[ 5 ] [ code-heap-ref' x>> ] unit-test
! Data heap reference
[ t ] [ \ code-heap-ref' def>> first code-heap-ref? ] unit-test
[ 5 ] [ \ code-heap-ref' def>> first x>> ] unit-test
! If the metaclass of a superclass changes into something other
! than a tuple class, the tuple needs to have its superclass reset
TUPLE: metaclass-change ;
TUPLE: metaclass-change-subclass < metaclass-change ;
[ metaclass-change ] [ metaclass-change-subclass superclass ] unit-test
[ ] [ "IN: classes.tuple.tests MIXIN: metaclass-change" eval( -- ) ] unit-test
[ t ] [ metaclass-change-subclass tuple-class? ] unit-test
[ tuple ] [ metaclass-change-subclass superclass ] unit-test
! Reshaping bug related to the above
TUPLE: a-g ;
TUPLE: g < a-g ;
[ ] [ g new "g" set ] unit-test
[ ] [ "IN: classes.tuple.tests MIXIN: a-g TUPLE: g ;" eval( -- ) ] unit-test
[ t ] [ g new layout-of "g" get layout-of eq? ] unit-test
! Joe Groff discovered this bug
DEFER: factor-crashes-anymore
[ ] [
"IN: classes.tuple.tests
TUPLE: unsafe-slot-access ;
CONSTANT: unsafe-slot-access' T{ unsafe-slot-access }" eval( -- )
] unit-test
[ ] [
"IN: classes.tuple.tests
USE: accessors
TUPLE: unsafe-slot-access { x read-only initial: 31337 } ;
: factor-crashes-anymore ( -- x ) unsafe-slot-access' x>> ;" eval( -- )
] unit-test
[ 31337 ] [ factor-crashes-anymore ] unit-test
TUPLE: tuple-predicate-redefine-test ;
[ ] [ "IN: classes.tuple.tests TUPLE: tuple-predicate-redefine-test ;" eval( -- ) ] unit-test
[ t ] [ \ tuple-predicate-redefine-test? predicate? ] unit-test
! Final classes
TUPLE: final-superclass ;
TUPLE: final-subclass < final-superclass ;
[ final-superclass ] [ final-subclass superclass ] unit-test
! Making the superclass final should change the superclass of the subclass
[ ] [ "IN: classes.tuple.tests TUPLE: final-superclass ; final" eval( -- ) ] unit-test
[ tuple ] [ final-subclass superclass ] unit-test
2010-02-17 10:58:30 -05:00
[ f ] [ \ final-subclass final-class? ] unit-test
! Subclassing a final class should fail
[ "IN: classes.tuple.tests TUPLE: final-subclass < final-superclass ;" eval( -- ) ]
[ error>> bad-superclass? ] must-fail-with
! Making a final class non-final should work
[ ] [ "IN: classes.tuple.tests TUPLE: final-superclass ;" eval( -- ) ] unit-test
[ ] [ "IN: classes.tuple.tests TUPLE: final-subclass < final-superclass ; final" eval( -- ) ] unit-test
! Changing a superclass should not change the final status of a subclass
[ ] [ "IN: classes.tuple.tests TUPLE: final-superclass x ;" eval( -- ) ] unit-test
2010-02-17 10:58:30 -05:00
[ t ] [ \ final-subclass final-class? ] unit-test