mas01cr@511
|
1 (in-package "SB-ADB")
|
mas01cr@511
|
2
|
mas01cr@661
|
3 (load-shared-object "../../libaudioDB.so.0.0")
|
mas01cr@661
|
4
|
mas01cr@511
|
5 (define-symbol-macro %default-query-args nil)
|
mas01cr@511
|
6 (defmacro with-default-query-args (args &body body &environment env)
|
mas01cr@511
|
7 (let ((current-args (macroexpand '%default-query-args env)))
|
mas01cr@511
|
8 `(symbol-macrolet ((%default-query-args ,(append args current-args)))
|
mas01cr@511
|
9 ,@body)))
|
mas01cr@511
|
10
|
mas01cr@511
|
11 (defmacro with-query-result-assertions
|
mas01cr@511
|
12 ((query db &rest query-args) &body body &environment env)
|
mas01cr@511
|
13 (let ((results (gensym "RESULTS"))
|
mas01cr@511
|
14 (default-args (macroexpand '%default-query-args env)))
|
mas01cr@511
|
15 `(let* ((,results (query ,query ,db ,@query-args ,@default-args))
|
mas01cr@511
|
16 (length (length ,results)))
|
mas01cr@511
|
17 (flet ((%present (list)
|
mas01cr@511
|
18 (find-if (lambda (r)
|
mas01cr@511
|
19 (and
|
mas01cr@674
|
20 (string= (first list) (result-ikey r))
|
mas01cr@511
|
21 (< (abs (- (second list) (result-distance r))) 1e-4)
|
mas01cr@511
|
22 (= (third list) (result-qpos r))
|
mas01cr@511
|
23 (= (fourth list) (result-ipos r))))
|
mas01cr@511
|
24 ,results)))
|
mas01cr@511
|
25 (declare (ignorable #'%present))
|
mas01cr@511
|
26 (macrolet ((present (&rest forms)
|
mas01cr@511
|
27 `(and ,@(loop for f in forms collect `(%present ',f)))))
|
mas01cr@511
|
28 ,@(loop for b in body collect `(assert ,b)))))))
|
mas01cr@511
|
29
|
mas01cr@511
|
30 (defmacro with-asserted-query-results ((query db &rest query-args) &body body)
|
mas01cr@511
|
31 `(with-query-result-assertions (,query ,db ,@query-args)
|
mas01cr@511
|
32 (= length ,(length body))
|
mas01cr@511
|
33 (present ,@body)))
|
mas01cr@511
|
34
|
mas01cr@634
|
35 (defmacro assert-erroneous (form)
|
mas01cr@634
|
36 `(handler-case ,form
|
mas01cr@634
|
37 (error ())
|
mas01cr@634
|
38 (:no-error (&rest values)
|
mas01cr@634
|
39 (error "No error: returned ~S" values))))
|
mas01cr@634
|
40
|
mas01cr@511
|
41 (declaim (optimize debug))
|
mas01cr@511
|
42
|
mas01cr@511
|
43 (defun test-0003 ()
|
mas01cr@511
|
44 (let ((datum (make-datum "testfeature" '((1d0)))))
|
mas01cr@511
|
45 (with-adb (db "testdb.0003" :direction :output :if-exists :supersede)
|
mas01cr@511
|
46 (l2norm db)
|
mas01cr@511
|
47 (insert datum db)
|
mas01cr@511
|
48 (with-asserted-query-results
|
mas01cr@511
|
49 (datum db :npoints 10 :accumulation :db :distance :dot-product)
|
mas01cr@511
|
50 ("testfeature" 1 0 0)))))
|
mas01cr@511
|
51
|
mas01cr@511
|
52 (defun test-0004 ()
|
mas01cr@511
|
53 (let ((feature (make-datum "testfeature" '((0d0 1d0) (1d0 0d0))))
|
mas01cr@511
|
54 (query05 (make-datum "testquery" '((0d0 0.5d0))))
|
mas01cr@511
|
55 (query50 (make-datum "testquery" '((0.5d0 0d0)))))
|
mas01cr@511
|
56 (with-adb (db "testdb.0004" :direction :output :if-exists :supersede)
|
mas01cr@511
|
57 (l2norm db)
|
mas01cr@511
|
58 (insert feature db)
|
mas01cr@511
|
59 (with-default-query-args (:accumulation :db :distance :dot-product)
|
mas01cr@511
|
60 (with-asserted-query-results (query05 db :npoints 10)
|
mas01cr@511
|
61 ("testfeature" 0.5 0 0) ("testfeature" 0 0 1))
|
mas01cr@511
|
62 (with-asserted-query-results (query05 db :npoints 1)
|
mas01cr@511
|
63 ("testfeature" 0.5 0 0))
|
mas01cr@511
|
64 (with-asserted-query-results (query50 db :npoints 10)
|
mas01cr@511
|
65 ("testfeature" 0.5 0 1) ("testfeature" 0 0 0))
|
mas01cr@511
|
66 (with-asserted-query-results (query50 db :npoints 1)
|
mas01cr@511
|
67 ("testfeature" 0.5 0 1))))))
|
mas01cr@511
|
68
|
mas01cr@511
|
69 (defun test-0010 ()
|
mas01cr@511
|
70 (let ((feature01 (make-datum "testfeature01" '((0d0 1d0))))
|
mas01cr@511
|
71 (feature10 (make-datum "testfeature10" '((1d0 0d0))))
|
mas01cr@511
|
72 (query05 (make-datum "testquery" '((0d0 0.5d0))))
|
mas01cr@511
|
73 (query50 (make-datum "testquery" '((0.5d0 0d0)))))
|
mas01cr@511
|
74 (with-adb (db "testdb.0010" :direction :output :if-exists :supersede)
|
mas01cr@511
|
75 (insert feature01 db)
|
mas01cr@511
|
76 (insert feature10 db)
|
mas01cr@511
|
77 (l2norm db)
|
mas01cr@511
|
78 (with-default-query-args
|
mas01cr@511
|
79 (:accumulation :per-track :ntracks 10 :npoints 10 :distance :euclidean-normed)
|
mas01cr@511
|
80 (with-asserted-query-results (query05 db)
|
mas01cr@511
|
81 ("testfeature01" 0 0 0) ("testfeature10" 2 0 0))
|
mas01cr@511
|
82 (with-asserted-query-results (query05 db :radius 5)
|
mas01cr@511
|
83 ("testfeature01" 0 0 0) ("testfeature10" 2 0 0))
|
mas01cr@511
|
84 (with-asserted-query-results (query05 db :radius 1)
|
mas01cr@511
|
85 ("testfeature01" 0 0 0))
|
mas01cr@511
|
86 (with-asserted-query-results (query50 db)
|
mas01cr@511
|
87 ("testfeature01" 2 0 0) ("testfeature10" 0 0 0))
|
mas01cr@511
|
88 (with-asserted-query-results (query50 db :radius 5)
|
mas01cr@511
|
89 ("testfeature01" 2 0 0) ("testfeature10" 0 0 0))
|
mas01cr@511
|
90 (with-asserted-query-results (query50 db :radius 1)
|
mas01cr@511
|
91 ("testfeature10" 0 0 0))))))
|
mas01cr@511
|
92
|
mas01cr@511
|
93 (defun test-0031 ()
|
mas01cr@511
|
94 (let ((feature01 (make-datum "testfeature01" '((0d0 1d0))))
|
mas01cr@511
|
95 (feature10 (make-datum "testfeature10" '((1d0 0d0))))
|
mas01cr@511
|
96 (query05 (make-datum "testquery" '((0d0 0.5d0)))))
|
mas01cr@511
|
97 (with-adb (db "testdb.0031" :direction :output :if-exists :supersede)
|
mas01cr@511
|
98 (insert feature01 db)
|
mas01cr@511
|
99 (insert feature10 db)
|
mas01cr@511
|
100 (l2norm db)
|
mas01cr@511
|
101 (with-default-query-args
|
mas01cr@511
|
102 (:accumulation :per-track :ntracks 10 :npoints 10 :distance :euclidean-normed)
|
mas01cr@511
|
103 (with-asserted-query-results (query05 db)
|
mas01cr@511
|
104 ("testfeature01" 0 0 0) ("testfeature10" 2 0 0))
|
mas01cr@511
|
105 (with-asserted-query-results (query05 db :include-keys ()))
|
mas01cr@511
|
106 (with-asserted-query-results (query05 db :include-keys '("testfeature01"))
|
mas01cr@511
|
107 ("testfeature01" 0 0 0))
|
mas01cr@511
|
108 (with-asserted-query-results (query05 db :include-keys '("testfeature10"))
|
mas01cr@511
|
109 ("testfeature10" 2 0 0))
|
mas01cr@511
|
110 (with-asserted-query-results (query05 db :include-keys '("testfeature10" "testfeature01"))
|
mas01cr@511
|
111 ("testfeature01" 0 0 0) ("testfeature10" 2 0 0))
|
mas01cr@511
|
112
|
mas01cr@511
|
113 (with-asserted-query-results (query05 db :exclude-keys '("testfeature10" "testfeature01")))
|
mas01cr@511
|
114
|
mas01cr@511
|
115 (with-asserted-query-results (query05 db :exclude-keys '("testfeature01"))
|
mas01cr@511
|
116 ("testfeature10" 2 0 0))
|
mas01cr@511
|
117 (with-asserted-query-results (query05 db :exclude-keys '("testfeature10"))
|
mas01cr@511
|
118 ("testfeature01" 0 0 0))
|
mas01cr@511
|
119 (with-asserted-query-results (query05 db :exclude-keys ())
|
mas01cr@511
|
120 ("testfeature01" 0 0 0) ("testfeature10" 2 0 0))))))
|
mas01cr@511
|
121
|
mas01cr@511
|
122 (defun test-0036 ()
|
mas01cr@511
|
123 (let ((feature01 (make-datum "testfeature01" '((0d0 1d0) (1d0 0d0))))
|
mas01cr@511
|
124 (feature10 (make-datum "testfeature10" '((1d0 0d0) (0d0 1d0))))
|
mas01cr@511
|
125 (query05 (make-datum "testquery" '((0d0 0.5d0))))
|
mas01cr@511
|
126 (query50 (make-datum "testquery" '((0.5d0 0d0)))))
|
mas01cr@511
|
127 (with-adb (db "testdb.0036" :direction :output :if-exists :supersede)
|
mas01cr@511
|
128 (insert feature01 db)
|
mas01cr@511
|
129 (insert feature10 db)
|
mas01cr@511
|
130 (l2norm db)
|
mas01cr@511
|
131 (with-default-query-args
|
mas01cr@511
|
132 (:accumulation :per-track :ntracks 10 :distance :euclidean-normed)
|
mas01cr@511
|
133 (dolist (npoints '(10 2 5))
|
mas01cr@511
|
134 (with-asserted-query-results (query05 db :npoints npoints)
|
mas01cr@511
|
135 ("testfeature01" 0 0 0) ("testfeature01" 2 0 1)
|
mas01cr@511
|
136 ("testfeature10" 0 0 1) ("testfeature10" 2 0 0)))
|
mas01cr@511
|
137 (with-asserted-query-results (query05 db :npoints 1)
|
mas01cr@511
|
138 ("testfeature01" 0 0 0) ("testfeature10" 0 0 1))
|
mas01cr@511
|
139 (dolist (npoints '(10 2 5))
|
mas01cr@511
|
140 (with-asserted-query-results (query50 db :npoints npoints)
|
mas01cr@511
|
141 ("testfeature01" 0 0 1) ("testfeature01" 2 0 0)
|
mas01cr@511
|
142 ("testfeature10" 0 0 0) ("testfeature10" 2 0 1)))
|
mas01cr@511
|
143 (with-asserted-query-results (query50 db :npoints 1)
|
mas01cr@511
|
144 ("testfeature01" 0 0 1) ("testfeature10" 0 0 0))))))
|
mas01cr@634
|
145
|
mas01cr@634
|
146 (defun test-0048 ()
|
mas01cr@634
|
147 (let ((datum1 (make-datum "testfeature01" '((0d0 0.5d0) (0.5d0 0d0))
|
mas01cr@634
|
148 :times (coerce '(0d0 1d0 1d0 2d0) '(vector double-float))))
|
mas01cr@634
|
149 (datum2 (make-datum "testfeature10" '((0.5d0 0d0) (0d0 0.5d0) (0.5d0 0d0))
|
mas01cr@634
|
150 :times (coerce '(0d0 2d0 2d0 3d0 3d0 4d0) '(vector double-float)))))
|
mas01cr@634
|
151 (with-adb (db "testdb.0048" :direction :output :if-exists :supersede)
|
mas01cr@634
|
152 (insert datum1 db)
|
mas01cr@634
|
153 (insert datum2 db)
|
mas01cr@634
|
154 (l2norm db)
|
mas01cr@634
|
155 (assert-erroneous (retrieve "testfeature" db))
|
mas01cr@634
|
156 (assert (equalp (retrieve "testfeature01" db) datum1))
|
mas01cr@634
|
157 (assert (equalp (retrieve "testfeature10" db) datum2)))))
|
mas01cr@661
|
158
|
mas01cr@661
|
159 (defun run-tests ()
|
mas01cr@661
|
160 (test-0003)
|
mas01cr@661
|
161 (test-0004)
|
mas01cr@661
|
162 (test-0010)
|
mas01cr@661
|
163 (test-0031)
|
mas01cr@661
|
164 (test-0036)
|
mas01cr@661
|
165 (test-0048))
|