USING: arrays assocs classes classes.algebra classes.mixin
-compiler.units definitions eval hashtables io.streams.string
-kernel math parser sequences source-files strings tools.test
-vectors words ;
+classes.mixin.private compiler.units continuations definitions eval
+hashtables kernel math parser sequences source-files strings
+tools.test vectors words ;
IN: classes.mixin.tests
! Test mixins
{ { string } } [ move-instance-declaration-mixin class-members ] unit-test
MIXIN: silly-mixin
-SYMBOL: not-a-class
+SYMBOL: a-symbol
-[ [ \ not-a-class \ silly-mixin add-mixin-instance ] with-compilation-unit ] must-fail
+[
+ [
+ \ a-symbol \ silly-mixin add-mixin-instance
+ ] with-compilation-unit
+] [ not-a-class? ] must-fail-with
SYMBOL: not-a-mixin
TUPLE: a-class ;
-[ [ \ a-class \ not-a-mixin add-mixin-instance ] with-compilation-unit ] must-fail
+[
+ [
+ \ a-class \ not-a-mixin add-mixin-instance
+ ] with-compilation-unit
+] [ not-a-mixin-class? ] must-fail-with
! Changing a mixin member's metaclass should not remove it from the mixin
MIXIN: metaclass-change-mixin
{ } [ [ metaclass-change forget-class ] with-compilation-unit ] unit-test
{ t } [ metaclass-change-mixin class-members empty? ] unit-test
+
+! redefine-mixin-class
+{ t } [
+ [
+ SYMBOL: foo1
+ foo1 { foo1 } redefine-mixin-class
+ foo1 "mixin" word-prop
+ ] with-compilation-unit
+] unit-test
M: mixin-class rank-class drop 8 ;
-ERROR: not-a-mixin-class class ;
-
-: check-mixin-class ( mixin -- mixin )
- dup mixin-class? [ not-a-mixin-class ] unless ;
-
<PRIVATE
: redefine-mixin-class ( class members -- )
2tri ;
: if-mixin-member? ( class mixin true false -- )
- [ check-mixin-class 2dup class-members member-eq? ] 2dip if ; inline
+ [ 2dup class-members member-eq? ] 2dip if ; inline
: change-mixin-class ( class mixin quot -- )
[ [ class-members swap bootstrap-word ] dip call ] [ drop ] 2bi
PRIVATE>
+ERROR: not-a-class object ;
+
+ERROR: not-a-mixin-class object ;
+
+: check-types ( class mixin -- class mixin )
+ [ dup class? [ not-a-class ] unless ]
+ [ dup mixin-class? [ not-a-mixin-class ] unless ] bi* ;
+
: add-mixin-instance ( class mixin -- )
- [ 2drop ] [ (add-mixin-instance) ] if-mixin-member? ;
+ check-types [ 2drop ] [ (add-mixin-instance) ] if-mixin-member? ;
: remove-mixin-instance ( class mixin -- )
[ (remove-mixin-instance) ] [ 2drop ] if-mixin-member? ;