Mercurial > hg > audiodb
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bindings/sb-alien/tests.lisp Wed Jan 21 21:48:25 2009 +0000 @@ -0,0 +1,136 @@ +(in-package "SB-ADB") + +(define-symbol-macro %default-query-args nil) +(defmacro with-default-query-args (args &body body &environment env) + (let ((current-args (macroexpand '%default-query-args env))) + `(symbol-macrolet ((%default-query-args ,(append args current-args))) + ,@body))) + +(defmacro with-query-result-assertions + ((query db &rest query-args) &body body &environment env) + (let ((results (gensym "RESULTS")) + (default-args (macroexpand '%default-query-args env))) + `(let* ((,results (query ,query ,db ,@query-args ,@default-args)) + (length (length ,results))) + (flet ((%present (list) + (find-if (lambda (r) + (and + (string= (first list) (result-key r)) + (< (abs (- (second list) (result-distance r))) 1e-4) + (= (third list) (result-qpos r)) + (= (fourth list) (result-ipos r)))) + ,results))) + (declare (ignorable #'%present)) + (macrolet ((present (&rest forms) + `(and ,@(loop for f in forms collect `(%present ',f))))) + ,@(loop for b in body collect `(assert ,b))))))) + +(defmacro with-asserted-query-results ((query db &rest query-args) &body body) + `(with-query-result-assertions (,query ,db ,@query-args) + (= length ,(length body)) + (present ,@body))) + +(declaim (optimize debug)) + +(defun test-0003 () + (let ((datum (make-datum "testfeature" '((1d0))))) + (with-adb (db "testdb.0003" :direction :output :if-exists :supersede) + (l2norm db) + (insert datum db) + (with-asserted-query-results + (datum db :npoints 10 :accumulation :db :distance :dot-product) + ("testfeature" 1 0 0))))) + +(defun test-0004 () + (let ((feature (make-datum "testfeature" '((0d0 1d0) (1d0 0d0)))) + (query05 (make-datum "testquery" '((0d0 0.5d0)))) + (query50 (make-datum "testquery" '((0.5d0 0d0))))) + (with-adb (db "testdb.0004" :direction :output :if-exists :supersede) + (l2norm db) + (insert feature db) + (with-default-query-args (:accumulation :db :distance :dot-product) + (with-asserted-query-results (query05 db :npoints 10) + ("testfeature" 0.5 0 0) ("testfeature" 0 0 1)) + (with-asserted-query-results (query05 db :npoints 1) + ("testfeature" 0.5 0 0)) + (with-asserted-query-results (query50 db :npoints 10) + ("testfeature" 0.5 0 1) ("testfeature" 0 0 0)) + (with-asserted-query-results (query50 db :npoints 1) + ("testfeature" 0.5 0 1)))))) + +(defun test-0010 () + (let ((feature01 (make-datum "testfeature01" '((0d0 1d0)))) + (feature10 (make-datum "testfeature10" '((1d0 0d0)))) + (query05 (make-datum "testquery" '((0d0 0.5d0)))) + (query50 (make-datum "testquery" '((0.5d0 0d0))))) + (with-adb (db "testdb.0010" :direction :output :if-exists :supersede) + (insert feature01 db) + (insert feature10 db) + (l2norm db) + (with-default-query-args + (:accumulation :per-track :ntracks 10 :npoints 10 :distance :euclidean-normed) + (with-asserted-query-results (query05 db) + ("testfeature01" 0 0 0) ("testfeature10" 2 0 0)) + (with-asserted-query-results (query05 db :radius 5) + ("testfeature01" 0 0 0) ("testfeature10" 2 0 0)) + (with-asserted-query-results (query05 db :radius 1) + ("testfeature01" 0 0 0)) + (with-asserted-query-results (query50 db) + ("testfeature01" 2 0 0) ("testfeature10" 0 0 0)) + (with-asserted-query-results (query50 db :radius 5) + ("testfeature01" 2 0 0) ("testfeature10" 0 0 0)) + (with-asserted-query-results (query50 db :radius 1) + ("testfeature10" 0 0 0)))))) + +(defun test-0031 () + (let ((feature01 (make-datum "testfeature01" '((0d0 1d0)))) + (feature10 (make-datum "testfeature10" '((1d0 0d0)))) + (query05 (make-datum "testquery" '((0d0 0.5d0))))) + (with-adb (db "testdb.0031" :direction :output :if-exists :supersede) + (insert feature01 db) + (insert feature10 db) + (l2norm db) + (with-default-query-args + (:accumulation :per-track :ntracks 10 :npoints 10 :distance :euclidean-normed) + (with-asserted-query-results (query05 db) + ("testfeature01" 0 0 0) ("testfeature10" 2 0 0)) + (with-asserted-query-results (query05 db :include-keys ())) + (with-asserted-query-results (query05 db :include-keys '("testfeature01")) + ("testfeature01" 0 0 0)) + (with-asserted-query-results (query05 db :include-keys '("testfeature10")) + ("testfeature10" 2 0 0)) + (with-asserted-query-results (query05 db :include-keys '("testfeature10" "testfeature01")) + ("testfeature01" 0 0 0) ("testfeature10" 2 0 0)) + + (with-asserted-query-results (query05 db :exclude-keys '("testfeature10" "testfeature01"))) + + (with-asserted-query-results (query05 db :exclude-keys '("testfeature01")) + ("testfeature10" 2 0 0)) + (with-asserted-query-results (query05 db :exclude-keys '("testfeature10")) + ("testfeature01" 0 0 0)) + (with-asserted-query-results (query05 db :exclude-keys ()) + ("testfeature01" 0 0 0) ("testfeature10" 2 0 0)))))) + +(defun test-0036 () + (let ((feature01 (make-datum "testfeature01" '((0d0 1d0) (1d0 0d0)))) + (feature10 (make-datum "testfeature10" '((1d0 0d0) (0d0 1d0)))) + (query05 (make-datum "testquery" '((0d0 0.5d0)))) + (query50 (make-datum "testquery" '((0.5d0 0d0))))) + (with-adb (db "testdb.0036" :direction :output :if-exists :supersede) + (insert feature01 db) + (insert feature10 db) + (l2norm db) + (with-default-query-args + (:accumulation :per-track :ntracks 10 :distance :euclidean-normed) + (dolist (npoints '(10 2 5)) + (with-asserted-query-results (query05 db :npoints npoints) + ("testfeature01" 0 0 0) ("testfeature01" 2 0 1) + ("testfeature10" 0 0 1) ("testfeature10" 2 0 0))) + (with-asserted-query-results (query05 db :npoints 1) + ("testfeature01" 0 0 0) ("testfeature10" 0 0 1)) + (dolist (npoints '(10 2 5)) + (with-asserted-query-results (query50 db :npoints npoints) + ("testfeature01" 0 0 1) ("testfeature01" 2 0 0) + ("testfeature10" 0 0 0) ("testfeature10" 2 0 1))) + (with-asserted-query-results (query50 db :npoints 1) + ("testfeature01" 0 0 1) ("testfeature10" 0 0 0))))))