- (let ((spec (db-type-spec db-type specs)))
- (when spec
- (format t
-"~&
-*******************************************************************
-*** Running CLSQL tests with ~A backend.
-*******************************************************************
-" db-type)
- (db-type-ensure-system db-type)
- (regression-test:rem-all-tests)
- (ignore-errors (destroy-database spec :database-type db-type))
- (ignore-errors (create-database spec :database-type db-type))
- (dolist (test (append *rt-connection* *rt-fddl* *rt-fdml*
- *rt-ooddl* *rt-oodml* *rt-syntax*))
- (eval test))
- (test-connect-to-database db-type spec)
- (test-initialise-database)
- (rtest:do-tests))))))
+ (dolist (spec (db-type-spec db-type specs))
+ (do-tests-for-backend db-type spec))))
+ (zerop *error-count*))
+
+(defun load-necessary-systems (specs)
+ (dolist (db-type +all-db-types+)
+ (when (db-type-spec db-type specs)
+ (db-type-ensure-system db-type))))
+
+(defun do-tests-for-backend (db-type spec)
+ (test-connect-to-database db-type spec)
+
+ (unwind-protect
+ (multiple-value-bind (test-forms skip-tests)
+ (compute-tests-for-backend db-type *test-database-underlying-type*)
+
+ (format *report-stream*
+ "~&
+******************************************************************************
+*** CLSQL Test Suite begun at ~A
+*** ~A
+*** ~A on ~A
+*** Database ~A backend~A.
+******************************************************************************
+"
+ (clsql-base:format-time
+ nil
+ (clsql-base:utime->time (get-universal-time)))
+ (lisp-implementation-type)
+ (lisp-implementation-version)
+ (machine-type)
+ db-type
+ (if (not (eq db-type *test-database-underlying-type*))
+ (format nil " with underlying type ~A"
+ *test-database-underlying-type*)
+ "")
+ )
+
+ (test-initialise-database)
+
+ (regression-test:rem-all-tests)
+ (dolist (test-form test-forms)
+ (eval test-form))
+
+ (let ((remaining (rtest:do-tests *report-stream*)))
+ (when (rt:pending-tests)
+ (incf *error-count* (length remaining))))
+
+ (let ((sexp-error (list db-type
+ *test-database-underlying-type*
+ (get-universal-time)
+ (length test-forms)
+ (rt:pending-tests)
+ (lisp-implementation-type)
+ (lisp-implementation-version)
+ (machine-type))))
+ (when *sexp-report-stream*
+ (write sexp-error :stream *sexp-report-stream*))
+ (push sexp-error *error-list*))
+
+ (format *report-stream* "~&Tests skipped:")
+ (if skip-tests
+ (dolist (skipped skip-tests)
+ (format *report-stream*
+ "~& ~20A ~A~%" (car skipped) (cdr skipped)))
+ (format *report-stream* " None~%")))
+ (disconnect)))
+
+
+(defun compute-tests-for-backend (db-type db-underlying-type)
+ (let ((test-forms '())
+ (skip-tests '()))
+ (dolist (test-form (append
+ (if (eq db-type :sqlite)
+ (test-basic-forms-untyped)
+ (test-basic-forms))
+ *rt-connection* *rt-fddl* *rt-fdml*
+ *rt-ooddl* *rt-oodml* *rt-syntax*))
+ (let ((test (second test-form)))
+ (cond
+ ((and (null (db-type-has-views? db-underlying-type))
+ (clsql-base-sys::in test :fddl/view/1 :fddl/view/2 :fddl/view/3 :fddl/view/4))
+ (push (cons test "views not supported") skip-tests))
+ ((and (null (db-type-has-boolean-where? db-underlying-type))
+ (clsql-base-sys::in test :fdml/select/11 :oodml/select/5))
+ (push (cons test "boolean where not supported") skip-tests))
+ ((and (null (db-type-has-subqueries? db-underlying-type))
+ (clsql-base-sys::in test :fdml/select/5 :fdml/select/10))
+ (push (cons test "subqueries not supported") skip-tests))
+ ((and (null (db-type-transaction-capable? db-underlying-type
+ *default-database*))
+ (clsql-base-sys::in test :fdml/transaction/1 :fdml/transaction/2 :fdml/transaction/3 :fdml/transaction/4))
+ (push (cons test "transactions not supported") skip-tests))
+ ((and (null (db-type-has-fancy-math? db-underlying-type))
+ (clsql-base-sys::in test :fdml/select/1))
+ (push (cons test "fancy math not supported") skip-tests))
+ ((and (eql *test-database-type* :sqlite)
+ (clsql-base-sys::in test :fddl/view/4 :fdml/select/10))
+ (push (cons test "not supported by sqlite") skip-tests))
+ (t
+ (push test-form test-forms)))))
+ (values (nreverse test-forms) (nreverse skip-tests))))