annotate bindings/sb-alien/tests.lisp @ 634:37fc7411e1ef

Actually test for retrieve behaviour in sb-alien bindings Motivated by Jamie's bug report that it doesn't in fact work at all on 32-bit platforms. (Ticket #32 in audioDB trac)
author mas01cr
date Tue, 29 Sep 2009 16:23:39 +0000
parents 3141e51cb077
children 72810ed81817
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@634 33 (defmacro assert-erroneous (form)
mas01cr@634 34 `(handler-case ,form
mas01cr@634 35 (error ())
mas01cr@634 36 (:no-error (&rest values)
mas01cr@634 37 (error "No error: returned ~S" values))))
mas01cr@634 38
mas01cr@511 39 (declaim (optimize debug))
mas01cr@511 40
mas01cr@511 41 (defun test-0003 ()
mas01cr@511 42 (let ((datum (make-datum "testfeature" '((1d0)))))
mas01cr@511 43 (with-adb (db "testdb.0003" :direction :output :if-exists :supersede)
mas01cr@511 44 (l2norm db)
mas01cr@511 45 (insert datum db)
mas01cr@511 46 (with-asserted-query-results
mas01cr@511 47 (datum db :npoints 10 :accumulation :db :distance :dot-product)
mas01cr@511 48 ("testfeature" 1 0 0)))))
mas01cr@511 49
mas01cr@511 50 (defun test-0004 ()
mas01cr@511 51 (let ((feature (make-datum "testfeature" '((0d0 1d0) (1d0 0d0))))
mas01cr@511 52 (query05 (make-datum "testquery" '((0d0 0.5d0))))
mas01cr@511 53 (query50 (make-datum "testquery" '((0.5d0 0d0)))))
mas01cr@511 54 (with-adb (db "testdb.0004" :direction :output :if-exists :supersede)
mas01cr@511 55 (l2norm db)
mas01cr@511 56 (insert feature db)
mas01cr@511 57 (with-default-query-args (:accumulation :db :distance :dot-product)
mas01cr@511 58 (with-asserted-query-results (query05 db :npoints 10)
mas01cr@511 59 ("testfeature" 0.5 0 0) ("testfeature" 0 0 1))
mas01cr@511 60 (with-asserted-query-results (query05 db :npoints 1)
mas01cr@511 61 ("testfeature" 0.5 0 0))
mas01cr@511 62 (with-asserted-query-results (query50 db :npoints 10)
mas01cr@511 63 ("testfeature" 0.5 0 1) ("testfeature" 0 0 0))
mas01cr@511 64 (with-asserted-query-results (query50 db :npoints 1)
mas01cr@511 65 ("testfeature" 0.5 0 1))))))
mas01cr@511 66
mas01cr@511 67 (defun test-0010 ()
mas01cr@511 68 (let ((feature01 (make-datum "testfeature01" '((0d0 1d0))))
mas01cr@511 69 (feature10 (make-datum "testfeature10" '((1d0 0d0))))
mas01cr@511 70 (query05 (make-datum "testquery" '((0d0 0.5d0))))
mas01cr@511 71 (query50 (make-datum "testquery" '((0.5d0 0d0)))))
mas01cr@511 72 (with-adb (db "testdb.0010" :direction :output :if-exists :supersede)
mas01cr@511 73 (insert feature01 db)
mas01cr@511 74 (insert feature10 db)
mas01cr@511 75 (l2norm db)
mas01cr@511 76 (with-default-query-args
mas01cr@511 77 (:accumulation :per-track :ntracks 10 :npoints 10 :distance :euclidean-normed)
mas01cr@511 78 (with-asserted-query-results (query05 db)
mas01cr@511 79 ("testfeature01" 0 0 0) ("testfeature10" 2 0 0))
mas01cr@511 80 (with-asserted-query-results (query05 db :radius 5)
mas01cr@511 81 ("testfeature01" 0 0 0) ("testfeature10" 2 0 0))
mas01cr@511 82 (with-asserted-query-results (query05 db :radius 1)
mas01cr@511 83 ("testfeature01" 0 0 0))
mas01cr@511 84 (with-asserted-query-results (query50 db)
mas01cr@511 85 ("testfeature01" 2 0 0) ("testfeature10" 0 0 0))
mas01cr@511 86 (with-asserted-query-results (query50 db :radius 5)
mas01cr@511 87 ("testfeature01" 2 0 0) ("testfeature10" 0 0 0))
mas01cr@511 88 (with-asserted-query-results (query50 db :radius 1)
mas01cr@511 89 ("testfeature10" 0 0 0))))))
mas01cr@511 90
mas01cr@511 91 (defun test-0031 ()
mas01cr@511 92 (let ((feature01 (make-datum "testfeature01" '((0d0 1d0))))
mas01cr@511 93 (feature10 (make-datum "testfeature10" '((1d0 0d0))))
mas01cr@511 94 (query05 (make-datum "testquery" '((0d0 0.5d0)))))
mas01cr@511 95 (with-adb (db "testdb.0031" :direction :output :if-exists :supersede)
mas01cr@511 96 (insert feature01 db)
mas01cr@511 97 (insert feature10 db)
mas01cr@511 98 (l2norm db)
mas01cr@511 99 (with-default-query-args
mas01cr@511 100 (:accumulation :per-track :ntracks 10 :npoints 10 :distance :euclidean-normed)
mas01cr@511 101 (with-asserted-query-results (query05 db)
mas01cr@511 102 ("testfeature01" 0 0 0) ("testfeature10" 2 0 0))
mas01cr@511 103 (with-asserted-query-results (query05 db :include-keys ()))
mas01cr@511 104 (with-asserted-query-results (query05 db :include-keys '("testfeature01"))
mas01cr@511 105 ("testfeature01" 0 0 0))
mas01cr@511 106 (with-asserted-query-results (query05 db :include-keys '("testfeature10"))
mas01cr@511 107 ("testfeature10" 2 0 0))
mas01cr@511 108 (with-asserted-query-results (query05 db :include-keys '("testfeature10" "testfeature01"))
mas01cr@511 109 ("testfeature01" 0 0 0) ("testfeature10" 2 0 0))
mas01cr@511 110
mas01cr@511 111 (with-asserted-query-results (query05 db :exclude-keys '("testfeature10" "testfeature01")))
mas01cr@511 112
mas01cr@511 113 (with-asserted-query-results (query05 db :exclude-keys '("testfeature01"))
mas01cr@511 114 ("testfeature10" 2 0 0))
mas01cr@511 115 (with-asserted-query-results (query05 db :exclude-keys '("testfeature10"))
mas01cr@511 116 ("testfeature01" 0 0 0))
mas01cr@511 117 (with-asserted-query-results (query05 db :exclude-keys ())
mas01cr@511 118 ("testfeature01" 0 0 0) ("testfeature10" 2 0 0))))))
mas01cr@511 119
mas01cr@511 120 (defun test-0036 ()
mas01cr@511 121 (let ((feature01 (make-datum "testfeature01" '((0d0 1d0) (1d0 0d0))))
mas01cr@511 122 (feature10 (make-datum "testfeature10" '((1d0 0d0) (0d0 1d0))))
mas01cr@511 123 (query05 (make-datum "testquery" '((0d0 0.5d0))))
mas01cr@511 124 (query50 (make-datum "testquery" '((0.5d0 0d0)))))
mas01cr@511 125 (with-adb (db "testdb.0036" :direction :output :if-exists :supersede)
mas01cr@511 126 (insert feature01 db)
mas01cr@511 127 (insert feature10 db)
mas01cr@511 128 (l2norm db)
mas01cr@511 129 (with-default-query-args
mas01cr@511 130 (:accumulation :per-track :ntracks 10 :distance :euclidean-normed)
mas01cr@511 131 (dolist (npoints '(10 2 5))
mas01cr@511 132 (with-asserted-query-results (query05 db :npoints npoints)
mas01cr@511 133 ("testfeature01" 0 0 0) ("testfeature01" 2 0 1)
mas01cr@511 134 ("testfeature10" 0 0 1) ("testfeature10" 2 0 0)))
mas01cr@511 135 (with-asserted-query-results (query05 db :npoints 1)
mas01cr@511 136 ("testfeature01" 0 0 0) ("testfeature10" 0 0 1))
mas01cr@511 137 (dolist (npoints '(10 2 5))
mas01cr@511 138 (with-asserted-query-results (query50 db :npoints npoints)
mas01cr@511 139 ("testfeature01" 0 0 1) ("testfeature01" 2 0 0)
mas01cr@511 140 ("testfeature10" 0 0 0) ("testfeature10" 2 0 1)))
mas01cr@511 141 (with-asserted-query-results (query50 db :npoints 1)
mas01cr@511 142 ("testfeature01" 0 0 1) ("testfeature10" 0 0 0))))))
mas01cr@634 143
mas01cr@634 144 (defun test-0048 ()
mas01cr@634 145 (let ((datum1 (make-datum "testfeature01" '((0d0 0.5d0) (0.5d0 0d0))
mas01cr@634 146 :times (coerce '(0d0 1d0 1d0 2d0) '(vector double-float))))
mas01cr@634 147 (datum2 (make-datum "testfeature10" '((0.5d0 0d0) (0d0 0.5d0) (0.5d0 0d0))
mas01cr@634 148 :times (coerce '(0d0 2d0 2d0 3d0 3d0 4d0) '(vector double-float)))))
mas01cr@634 149 (with-adb (db "testdb.0048" :direction :output :if-exists :supersede)
mas01cr@634 150 (insert datum1 db)
mas01cr@634 151 (insert datum2 db)
mas01cr@634 152 (l2norm db)
mas01cr@634 153 (assert-erroneous (retrieve "testfeature" db))
mas01cr@634 154 (assert (equalp (retrieve "testfeature01" db) datum1))
mas01cr@634 155 (assert (equalp (retrieve "testfeature10" db) datum2)))))