+;;; Bits of FUNCALLABLE-STANDARD-CLASS are easy to break; make sure
+;;; that it is at least possible to define classes with that as a
+;;; metaclass.
+(defclass gf-class (standard-generic-function) ()
+ (:metaclass funcallable-standard-class))
+(defgeneric g (a b c)
+ (:generic-function-class gf-class))
+\f
+;;; until sbcl-0.7.12.47, PCL wasn't aware of some direct class
+;;; relationships. These aren't necessarily true, but are probably
+;;; not going to change often.
+(dolist (x '(number array sequence character symbol))
+ (assert (eq (car (class-direct-superclasses (find-class x)))
+ (find-class t)))
+ (assert (member (find-class x)
+ (class-direct-subclasses (find-class t)))))
+\f
+;;; the class-prototype of the NULL class used to be some weird
+;;; standard-instance-like thing. Make sure it's actually NIL.
+;;;
+;;; (and FIXME: eventually turn this into asserting that the prototype
+;;; of all built-in-classes is of the relevant type)
+(assert (null (class-prototype (find-class 'null))))
+\f
+;;; simple consistency checks for the SB-MOP package: all of the
+;;; functionality specified in AMOP is in functions and classes:
+(assert (null (loop for x being each external-symbol in "SB-MOP"
+ unless (or (fboundp x) (find-class x)) collect x)))
+;;; and all generic functions in SB-MOP have at least one specified
+;;; method, except for UPDATE-DEPENDENT
+(assert (null (loop for x being each external-symbol in "SB-MOP"
+ unless (or (not (fboundp x))
+ (eq x 'update-dependent)
+ (not (typep (fdefinition x) 'generic-function))
+ (> (length (generic-function-methods
+ (fdefinition x)))
+ 0))
+ collect x)))
+\f
+;;; make sure that ENSURE-CLASS-USING-CLASS's arguments are the right
+;;; way round (!)
+(defvar *e-c-u-c-arg-order* nil)
+(defmethod ensure-class-using-class :after
+ (class (name (eql 'e-c-u-c-arg-order)) &key &allow-other-keys)
+ (setf *e-c-u-c-arg-order* t))
+(defclass e-c-u-c-arg-orderoid () ())
+(assert (null *e-c-u-c-arg-order*))
+(defclass e-c-u-c-arg-order () ())
+(assert (eq *e-c-u-c-arg-order* t))
+\f
+;;; verify that FIND-CLASS works after FINALIZE-INHERITANCE
+(defclass automethod-class (standard-class) ())
+(defmethod validate-superclass ((c1 automethod-class) (c2 standard-class))
+ t)
+(defmethod finalize-inheritance :after ((x automethod-class))
+ (format t "~&~S ~S~%" x (find-class (class-name x))))
+(defclass automethod-object () ()
+ (:metaclass automethod-class))
+(defvar *automethod-object* (make-instance 'automethod-object))
+(assert (typep *automethod-object* 'automethod-object))
+\f
+;;; COMPUTE-EFFECTIVE-SLOT-DEFINITION should take three arguments, one
+;;; of which is the name of the slot.
+(defvar *compute-effective-slot-definition-count* 0)
+(defmethod compute-effective-slot-definition :before
+ (class (name (eql 'foo)) dsds)
+ (incf *compute-effective-slot-definition-count*))
+(defclass cesd-test-class ()
+ ((foo :initarg :foo)))
+(make-instance 'cesd-test-class :foo 3)
+;;; FIXME: this assertion seems a little weak. I don't know why
+;;; COMPUTE-EFFECTIVE-SLOT-DEFINITION gets called twice in this
+;;; sequence, nor whether that's compliant with AMOP. -- CSR,
+;;; 2003-04-17
+(assert (> *compute-effective-slot-definition-count* 0))
+\f
+;;; this used to cause a nasty uncaught metacircularity in PCL.
+(defclass substandard-method (standard-method) ())
+(defgeneric substandard-defgeneric (x y)
+ (:method-class substandard-method)
+ (:method ((x number) (y number)) (+ x y))
+ (:method ((x string) (y string)) (concatenate 'string x y)))
+(assert (= (substandard-defgeneric 1 2) 3))
+(assert (string= (substandard-defgeneric "1" "2") "12"))
+\f