X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fmop.pure.lisp;h=c443ceffcefee5345ea1879bdfba28b396686a9b;hb=99df968112602d07a4b91492ab45367df27ee8ac;hp=f7a5e33e97d36000c37ed4161a971ef21be5b6f1;hpb=acc978383105b5a2bfd970f8a34214fd5774bb2a;p=sbcl.git diff --git a/tests/mop.pure.lisp b/tests/mop.pure.lisp index f7a5e33..c443cef 100644 --- a/tests/mop.pure.lisp +++ b/tests/mop.pure.lisp @@ -30,3 +30,52 @@ (assert (find (find-class 'sb-mop:metaobject) (sb-mop:class-direct-superclasses (find-class name)))) (assert (subtypep name 'sb-mop:metaobject))) + +;;; No portable class Cp may inherit, by virtue of being a direct or +;;; indirect subclass of a specified class, any slot for which the +;;; name is a symbol accessible in the common-lisp-user package or +;;; exported by any package defined in the ANSI Common Lisp standard. +(let ((specified-class-names + '(sb-mop:built-in-class + sb-mop:class + sb-mop:direct-slot-definition + sb-mop:effective-slot-definition + sb-mop:eql-specializer + sb-mop:forward-referenced-class + sb-mop:funcallable-standard-class + sb-mop:funcallable-standard-object + sb-mop:generic-function + sb-mop:metaobject + sb-mop:method + sb-mop:method-combination + sb-mop:slot-definition + sb-mop:specializer + sb-mop:standard-accessor-method + sb-mop:standard-class + sb-mop:standard-direct-slot-definition + sb-mop:standard-effective-slot-definition + sb-mop:standard-generic-function + sb-mop:standard-method + sb-mop:standard-object + sb-mop:standard-reader-method + sb-mop:standard-slot-definition + sb-mop:standard-writer-method))) + (labels ((slot-name-ok (name) + (dolist (package (mapcar #'find-package + '("CL" "CL-USER" "KEYWORD" "SB-MOP")) + t) + (when (multiple-value-bind (symbol status) + (find-symbol (symbol-name name) package) + (and (eq symbol name) + (or (eq package (find-package "CL-USER")) + (eq status :external)))) + (return nil)))) + (test-class-slots (class) + (loop for slot in (sb-mop:class-slots class) + for slot-name = (sb-mop:slot-definition-name slot) + unless (slot-name-ok slot-name) + collect (cons class slot-name)))) + (loop for class-name in specified-class-names + for class = (find-class class-name) + for results = (test-class-slots class) + when results do (cerror "continue" "~A" results))))