annotate bindings/sb-alien/tests.lisp @ 511:3141e51cb077

Initial checkin of WIP sb-alien bindings. Includes some analogues to libtests/ test files in tests.lisp Coverage of the C API is not complete, but I think there's enough to implement all the same functionality tests as there are in the libtests/ suite.
author mas01cr
date Wed, 21 Jan 2009 21:48:25 +0000
parents
children 37fc7411e1ef
rev   line source
mas01cr@511 1 (in-package "SB-ADB")
mas01cr@511 2
mas01cr@511 3 (define-symbol-macro %default-query-args nil)
mas01cr@511 4 (defmacro with-default-query-args (args &body body &environment env)
mas01cr@511 5 (let ((current-args (macroexpand '%default-query-args env)))
mas01cr@511 6 `(symbol-macrolet ((%default-query-args ,(append args current-args)))
mas01cr@511 7 ,@body)))
mas01cr@511 8
mas01cr@511 9 (defmacro with-query-result-assertions
mas01cr@511 10 ((query db &rest query-args) &body body &environment env)
mas01cr@511 11 (let ((results (gensym "RESULTS"))
mas01cr@511 12 (default-args (macroexpand '%default-query-args env)))
mas01cr@511 13 `(let* ((,results (query ,query ,db ,@query-args ,@default-args))
mas01cr@511 14 (length (length ,results)))
mas01cr@511 15 (flet ((%present (list)
mas01cr@511 16 (find-if (lambda (r)
mas01cr@511 17 (and
mas01cr@511 18 (string= (first list) (result-key r))
mas01cr@511 19 (< (abs (- (second list) (result-distance r))) 1e-4)
mas01cr@511 20 (= (third list) (result-qpos r))
mas01cr@511 21 (= (fourth list) (result-ipos r))))
mas01cr@511 22 ,results)))
mas01cr@511 23 (declare (ignorable #'%present))
mas01cr@511 24 (macrolet ((present (&rest forms)
mas01cr@511 25 `(and ,@(loop for f in forms collect `(%present ',f)))))
mas01cr@511 26 ,@(loop for b in body collect `(assert ,b)))))))
mas01cr@511 27
mas01cr@511 28 (defmacro with-asserted-query-results ((query db &rest query-args) &body body)
mas01cr@511 29 `(with-query-result-assertions (,query ,db ,@query-args)
mas01cr@511 30 (= length ,(length body))
mas01cr@511 31 (present ,@body)))
mas01cr@511 32
mas01cr@511 33 (declaim (optimize debug))
mas01cr@511 34
mas01cr@511 35 (defun test-0003 ()
mas01cr@511 36 (let ((datum (make-datum "testfeature" '((1d0)))))
mas01cr@511 37 (with-adb (db "testdb.0003" :direction :output :if-exists :supersede)
mas01cr@511 38 (l2norm db)
mas01cr@511 39 (insert datum db)
mas01cr@511 40 (with-asserted-query-results
mas01cr@511 41 (datum db :npoints 10 :accumulation :db :distance :dot-product)
mas01cr@511 42 ("testfeature" 1 0 0)))))
mas01cr@511 43
mas01cr@511 44 (defun test-0004 ()
mas01cr@511 45 (let ((feature (make-datum "testfeature" '((0d0 1d0) (1d0 0d0))))
mas01cr@511 46 (query05 (make-datum "testquery" '((0d0 0.5d0))))
mas01cr@511 47 (query50 (make-datum "testquery" '((0.5d0 0d0)))))
mas01cr@511 48 (with-adb (db "testdb.0004" :direction :output :if-exists :supersede)
mas01cr@511 49 (l2norm db)
mas01cr@511 50 (insert feature db)
mas01cr@511 51 (with-default-query-args (:accumulation :db :distance :dot-product)
mas01cr@511 52 (with-asserted-query-results (query05 db :npoints 10)
mas01cr@511 53 ("testfeature" 0.5 0 0) ("testfeature" 0 0 1))
mas01cr@511 54 (with-asserted-query-results (query05 db :npoints 1)
mas01cr@511 55 ("testfeature" 0.5 0 0))
mas01cr@511 56 (with-asserted-query-results (query50 db :npoints 10)
mas01cr@511 57 ("testfeature" 0.5 0 1) ("testfeature" 0 0 0))
mas01cr@511 58 (with-asserted-query-results (query50 db :npoints 1)
mas01cr@511 59 ("testfeature" 0.5 0 1))))))
mas01cr@511 60
mas01cr@511 61 (defun test-0010 ()
mas01cr@511 62 (let ((feature01 (make-datum "testfeature01" '((0d0 1d0))))
mas01cr@511 63 (feature10 (make-datum "testfeature10" '((1d0 0d0))))
mas01cr@511 64 (query05 (make-datum "testquery" '((0d0 0.5d0))))
mas01cr@511 65 (query50 (make-datum "testquery" '((0.5d0 0d0)))))
mas01cr@511 66 (with-adb (db "testdb.0010" :direction :output :if-exists :supersede)
mas01cr@511 67 (insert feature01 db)
mas01cr@511 68 (insert feature10 db)
mas01cr@511 69 (l2norm db)
mas01cr@511 70 (with-default-query-args
mas01cr@511 71 (:accumulation :per-track :ntracks 10 :npoints 10 :distance :euclidean-normed)
mas01cr@511 72 (with-asserted-query-results (query05 db)
mas01cr@511 73 ("testfeature01" 0 0 0) ("testfeature10" 2 0 0))
mas01cr@511 74 (with-asserted-query-results (query05 db :radius 5)
mas01cr@511 75 ("testfeature01" 0 0 0) ("testfeature10" 2 0 0))
mas01cr@511 76 (with-asserted-query-results (query05 db :radius 1)
mas01cr@511 77 ("testfeature01" 0 0 0))
mas01cr@511 78 (with-asserted-query-results (query50 db)
mas01cr@511 79 ("testfeature01" 2 0 0) ("testfeature10" 0 0 0))
mas01cr@511 80 (with-asserted-query-results (query50 db :radius 5)
mas01cr@511 81 ("testfeature01" 2 0 0) ("testfeature10" 0 0 0))
mas01cr@511 82 (with-asserted-query-results (query50 db :radius 1)
mas01cr@511 83 ("testfeature10" 0 0 0))))))
mas01cr@511 84
mas01cr@511 85 (defun test-0031 ()
mas01cr@511 86 (let ((feature01 (make-datum "testfeature01" '((0d0 1d0))))
mas01cr@511 87 (feature10 (make-datum "testfeature10" '((1d0 0d0))))
mas01cr@511 88 (query05 (make-datum "testquery" '((0d0 0.5d0)))))
mas01cr@511 89 (with-adb (db "testdb.0031" :direction :output :if-exists :supersede)
mas01cr@511 90 (insert feature01 db)
mas01cr@511 91 (insert feature10 db)
mas01cr@511 92 (l2norm db)
mas01cr@511 93 (with-default-query-args
mas01cr@511 94 (:accumulation :per-track :ntracks 10 :npoints 10 :distance :euclidean-normed)
mas01cr@511 95 (with-asserted-query-results (query05 db)
mas01cr@511 96 ("testfeature01" 0 0 0) ("testfeature10" 2 0 0))
mas01cr@511 97 (with-asserted-query-results (query05 db :include-keys ()))
mas01cr@511 98 (with-asserted-query-results (query05 db :include-keys '("testfeature01"))
mas01cr@511 99 ("testfeature01" 0 0 0))
mas01cr@511 100 (with-asserted-query-results (query05 db :include-keys '("testfeature10"))
mas01cr@511 101 ("testfeature10" 2 0 0))
mas01cr@511 102 (with-asserted-query-results (query05 db :include-keys '("testfeature10" "testfeature01"))
mas01cr@511 103 ("testfeature01" 0 0 0) ("testfeature10" 2 0 0))
mas01cr@511 104
mas01cr@511 105 (with-asserted-query-results (query05 db :exclude-keys '("testfeature10" "testfeature01")))
mas01cr@511 106
mas01cr@511 107 (with-asserted-query-results (query05 db :exclude-keys '("testfeature01"))
mas01cr@511 108 ("testfeature10" 2 0 0))
mas01cr@511 109 (with-asserted-query-results (query05 db :exclude-keys '("testfeature10"))
mas01cr@511 110 ("testfeature01" 0 0 0))
mas01cr@511 111 (with-asserted-query-results (query05 db :exclude-keys ())
mas01cr@511 112 ("testfeature01" 0 0 0) ("testfeature10" 2 0 0))))))
mas01cr@511 113
mas01cr@511 114 (defun test-0036 ()
mas01cr@511 115 (let ((feature01 (make-datum "testfeature01" '((0d0 1d0) (1d0 0d0))))
mas01cr@511 116 (feature10 (make-datum "testfeature10" '((1d0 0d0) (0d0 1d0))))
mas01cr@511 117 (query05 (make-datum "testquery" '((0d0 0.5d0))))
mas01cr@511 118 (query50 (make-datum "testquery" '((0.5d0 0d0)))))
mas01cr@511 119 (with-adb (db "testdb.0036" :direction :output :if-exists :supersede)
mas01cr@511 120 (insert feature01 db)
mas01cr@511 121 (insert feature10 db)
mas01cr@511 122 (l2norm db)
mas01cr@511 123 (with-default-query-args
mas01cr@511 124 (:accumulation :per-track :ntracks 10 :distance :euclidean-normed)
mas01cr@511 125 (dolist (npoints '(10 2 5))
mas01cr@511 126 (with-asserted-query-results (query05 db :npoints npoints)
mas01cr@511 127 ("testfeature01" 0 0 0) ("testfeature01" 2 0 1)
mas01cr@511 128 ("testfeature10" 0 0 1) ("testfeature10" 2 0 0)))
mas01cr@511 129 (with-asserted-query-results (query05 db :npoints 1)
mas01cr@511 130 ("testfeature01" 0 0 0) ("testfeature10" 0 0 1))
mas01cr@511 131 (dolist (npoints '(10 2 5))
mas01cr@511 132 (with-asserted-query-results (query50 db :npoints npoints)
mas01cr@511 133 ("testfeature01" 0 0 1) ("testfeature01" 2 0 0)
mas01cr@511 134 ("testfeature10" 0 0 0) ("testfeature10" 2 0 1)))
mas01cr@511 135 (with-asserted-query-results (query50 db :npoints 1)
mas01cr@511 136 ("testfeature01" 0 0 1) ("testfeature10" 0 0 0))))))