USING: classes.struct classes.tuple functors tools.test math words kernel multiline parser io.streams.string generic ; QUALIFIED-WITH: alien.c-types c IN: functors.tests << DEFINES <${B}> WHERE TUPLE: B { value T } ; C: B ;FUNCTOR> \ float define-box >> { 1 0 } [ define-box ] must-infer-as [ T{ float-box f 5.0 } ] [ 5.0 ] unit-test : twice ( word -- ) [ execute ] [ execute ] bi ; inline << \ sq wrapper-test >> [ 16 ] [ 2 sqsq ] unit-test << "blah" wrapper-test-2 >> [ 4 ] [ 1 3 blah ] unit-test << "blorgh" symbol-test >> [ blorgh ] [ blorgh ] unit-test << "snurv" generic-test >> [ 2 ] [ 1 snurv ] unit-test [ 3.0 ] [ 3.0 snurv ] unit-test ! Does replacing an ordinary word with a functor-generated one work? [ [ ] ] [ "IN: functors.tests TUPLE: some-tuple ; : some-word ( -- ) ; GENERIC: some-generic ( a -- b ) M: some-tuple some-generic ; SYMBOL: some-symbol" "functors-test" parse-stream ] unit-test : test-redefinition ( -- ) [ t ] [ "some-word" "functors.tests" lookup-word >boolean ] unit-test [ t ] [ "some-tuple" "functors.tests" lookup-word >boolean ] unit-test [ t ] [ "some-generic" "functors.tests" lookup-word >boolean ] unit-test [ t ] [ "some-tuple" "functors.tests" lookup-word "some-generic" "functors.tests" lookup-word lookup-method >boolean ] unit-test ; [ t ] [ "some-symbol" "functors.tests" lookup-word >boolean ] unit-test test-redefinition [ [ ] ] [ "IN: functors.tests << \"some\" redefine-test >>" "functors-test" parse-stream ] unit-test test-redefinition << "a-struct" "nemo" c:char 2 define-a-struct >> [ { T{ struct-slot-spec { name "nemo" } { offset 0 } { class integer } { initial 0 } { type c:longlong } } T{ struct-slot-spec { name "x" } { offset 8 } { class object } { initial f } { type { c:char 4 } } } T{ struct-slot-spec { name "y" } { offset 12 } { class object } { initial f } { type { c:short 2 } } } T{ struct-slot-spec { name "z" } { offset 16 } { class fixnum } { initial 5 } { type c:char } } T{ struct-slot-spec { name "float" } { offset 20 } { class object } { initial f } { type { c:float 2 } } } } ] [ a-struct struct-slots ] unit-test << "an-inline-word" define-an-inline-word >> [ t ] [ \ an-inline-word inline? ] unit-test [ f ] [ \ an-inline-word-an-inline-word inline? ] unit-test << "a-final-tuple" "a-word" define-a-final-class >> [ t ] [ a-final-tuple final-class? ] unit-test