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

768 lines
21 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 ;
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
[
2009-04-17 16:49:21 -04:00
"IN: classes.tuple.tests TUPLE: bad-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 ;
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
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
[ ] [
[
2008-07-13 22:06:50 -04:00
\ vocab tuple { "xxx" } "slots" get append
2008-03-26 18:07:50 -04:00
define-tuple-class
] with-compilation-unit
all-words drop
[
2008-07-13 22:06:50 -04:00
\ vocab 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
2008-05-28 20:34:18 -04:00
! Class forget messyness
2008-05-06 10:01:28 -04:00
TUPLE: subclass-forget-test ;
TUPLE: subclass-forget-test-1 < subclass-forget-test ;
TUPLE: subclass-forget-test-2 < subclass-forget-test ;
TUPLE: subclass-forget-test-3 < subclass-forget-test-2 ;
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests FORGET: subclass-forget-test" eval( -- ) ] unit-test
2008-05-06 10:01:28 -04:00
2008-06-11 18:40:33 -04:00
[ { subclass-forget-test-2 } ]
2008-05-28 20:34:18 -04:00
[ subclass-forget-test-2 class-usages ]
unit-test
2008-06-11 18:40:33 -04:00
[ { subclass-forget-test-3 } ]
2008-05-28 20:34:18 -04:00
[ subclass-forget-test-3 class-usages ]
unit-test
2008-05-06 10:01:28 -04:00
[ f ] [ subclass-forget-test-1 tuple-class? ] unit-test
[ f ] [ subclass-forget-test-2 tuple-class? ] unit-test
[ subclass-forget-test-3 new ] must-fail
2008-05-10 17:28:02 -04:00
2009-04-17 16:49:21 -04:00
[ "IN: classes.tuple.tests TUPLE: subclass-forget-test-4 < subclass-forget-test-2 ;" eval( -- ) ] must-fail
2008-06-11 18:40:33 -04:00
! More
DEFER: subclass-reset-test
DEFER: subclass-reset-test-1
DEFER: subclass-reset-test-2
DEFER: subclass-reset-test-3
GENERIC: break-me ( obj -- )
2009-04-06 06:22:28 -04:00
[ ] [ [ M\ integer break-me forget ] with-compilation-unit ] unit-test
2008-06-11 18:40:33 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: subclass-reset-test ;" <string-reader> "subclass-reset-test" parse-stream drop ] unit-test
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests TUPLE: subclass-reset-test-1 < subclass-reset-test ;" eval( -- ) ] unit-test
[ ] [ "IN: classes.tuple.tests TUPLE: subclass-reset-test-2 < subclass-reset-test ;" eval( -- ) ] unit-test
[ ] [ "IN: classes.tuple.tests TUPLE: subclass-reset-test-3 < subclass-reset-test-2 ;" eval( -- ) ] unit-test
2008-06-11 18:40:33 -04:00
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests USE: kernel M: subclass-reset-test-1 break-me drop ;" eval( -- ) ] unit-test
2008-06-11 18:40:33 -04:00
2009-03-22 21:16:31 -04:00
[ ] [ "IN: classes.tuple.tests : subclass-reset-test ( -- ) ;" <string-reader> "subclass-reset-test" parse-stream drop ] unit-test
2008-06-11 18:40:33 -04:00
[ f ] [ subclass-reset-test-1 tuple-class? ] unit-test
[ f ] [ subclass-reset-test-2 tuple-class? ] unit-test
[ subclass-forget-test-3 new ] must-fail
[ t ] [ \ break-me "methods" word-prop assoc-empty? ] unit-test
2009-04-17 16:49:21 -04:00
[ ] [ "IN: classes.tuple.tests USE: math USE: kernel M: integer break-me drop ;" eval( -- ) ] unit-test
2008-06-11 18:40:33 -04:00
[ f ] [ \ break-me "methods" word-prop assoc-empty? ] unit-test
! 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
USE: classes.struct
[ { } ] [
classes
[ "prototype" word-prop ] map
[ '[ _ hashcode drop f ] [ drop t ] recover ] filter
] unit-test