1 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
2 ;;;; ======================================================================
3 ;;;; File: test-oodml.lisp
4 ;;;; Author: Marcus Pearce <m.t.pearce@city.ac.uk>
5 ;;;; Created: 01/04/2004
8 ;;;; Tests for the CLSQL Object Oriented Data Definition Language
11 ;;;; This file is part of CLSQL.
13 ;;;; CLSQL users are granted the rights to distribute and use this software
14 ;;;; as governed by the terms of the Lisp Lesser GNU Public License
15 ;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
16 ;;;; ======================================================================
18 (in-package #:clsql-tests)
20 #.(clsql:locally-enable-sql-reader-syntax)
25 (deftest :oodml/select/1
26 (mapcar #'(lambda (e) (slot-value e 'last-name))
27 (clsql:select 'employee :order-by [last-name] :flatp t))
28 ("Andropov" "Brezhnev" "Chernenko" "Gorbachev" "Kruschev" "Lenin" "Putin"
29 "Stalin" "Trotsky" "Yeltsin"))
31 (deftest :oodml/select/2
32 (mapcar #'(lambda (e) (slot-value e 'name))
33 (clsql:select 'company :flatp t))
36 (deftest :oodml/select/3
37 (mapcar #'(lambda (e) (slot-value e 'companyid))
38 (clsql:select 'employee
39 :where [and [= [slot-value 'employee 'companyid]
40 [slot-value 'company 'companyid]]
41 [= [slot-value 'company 'name]
44 (1 1 1 1 1 1 1 1 1 1))
46 (deftest :oodml/select/4
48 (concatenate 'string (slot-value e 'first-name)
50 (slot-value e 'last-name)))
51 (clsql:select 'employee :where [= [slot-value 'employee 'first-name]
54 :order-by [last-name]))
55 ("Vladamir Lenin" "Vladamir Putin"))
57 (deftest :oodml/select/5
58 (length (clsql:select 'employee :where [married] :flatp t))
61 (deftest :oodml/select/6
62 (slot-value (caar (clsql:select 'employee :where [= 1 [emplid]])) 'married)
65 (deftest :oodml/select/7
66 (slot-value (caar (clsql:select 'employee :where [= 4 [emplid]])) 'married)
69 (deftest :oodml/select/8
70 (let ((a (caar (clsql:select 'address :where [= 1 [emplid]]))))
72 (slot-value a 'street-number)
73 (slot-value a 'street-name)
75 (slot-value a 'postal-code)))
76 10 "Park Place" "Leningrad" 123)
78 (deftest :oodml/select/9
79 (let ((a (caar (clsql:select 'address :where [= 2 [emplid]]))))
81 (slot-value a 'street-number)
82 (slot-value a 'street-name)
84 (slot-value a 'postal-code)))
87 ;; tests update-records-from-instance
88 (deftest :oodml/update-records/1
91 (let ((lenin (car (clsql:select 'employee
92 :where [= [slot-value 'employee 'emplid]
100 (employee-email lenin))))
102 (setf (slot-value employee1 'first-name) "Dimitriy"
103 (slot-value employee1 'last-name) "Ivanovich"
104 (slot-value employee1 'email) "ivanovich@soviet.org")
105 (clsql:update-records-from-instance employee1)
106 (let ((lenin (car (clsql:select 'employee
107 :where [= [slot-value 'employee 'emplid]
115 (employee-email lenin))))
117 (setf (slot-value employee1 'first-name) "Vladamir"
118 (slot-value employee1 'last-name) "Lenin"
119 (slot-value employee1 'email) "lenin@soviet.org")
120 (clsql:update-records-from-instance employee1)
121 (let ((lenin (car (clsql:select 'employee
122 :where [= [slot-value 'employee 'emplid]
130 (employee-email lenin)))))
131 "Vladamir Lenin: lenin@soviet.org"
132 "Dimitriy Ivanovich: ivanovich@soviet.org"
133 "Vladamir Lenin: lenin@soviet.org")
135 ;; tests update-record-from-slot
136 (deftest :oodml/update-records/2
139 (car (clsql:select 'employee
140 :where [= [slot-value 'employee 'emplid] 1]
143 (setf (slot-value employee1 'email) "lenin-nospam@soviet.org")
144 (clsql:update-record-from-slot employee1 'email)
146 (car (clsql:select 'employee
147 :where [= [slot-value 'employee 'emplid] 1]
150 (setf (slot-value employee1 'email) "lenin@soviet.org")
151 (clsql:update-record-from-slot employee1 'email)
153 (car (clsql:select 'employee
154 :where [= [slot-value 'employee 'emplid] 1]
156 "lenin@soviet.org" "lenin-nospam@soviet.org" "lenin@soviet.org")
158 ;; tests update-record-from-slots
159 (deftest :oodml/update-records/3
161 (let ((lenin (car (clsql:select 'employee
162 :where [= [slot-value 'employee 'emplid]
170 (employee-email lenin)))
172 (setf (slot-value employee1 'first-name) "Dimitriy"
173 (slot-value employee1 'last-name) "Ivanovich"
174 (slot-value employee1 'email) "ivanovich@soviet.org")
175 (clsql:update-record-from-slots employee1 '(first-name last-name email))
176 (let ((lenin (car (clsql:select 'employee
177 :where [= [slot-value 'employee 'emplid]
185 (employee-email lenin))))
187 (setf (slot-value employee1 'first-name) "Vladamir"
188 (slot-value employee1 'last-name) "Lenin"
189 (slot-value employee1 'email) "lenin@soviet.org")
190 (clsql:update-record-from-slots employee1 '(first-name last-name email))
191 (let ((lenin (car (clsql:select 'employee
192 :where [= [slot-value 'employee 'emplid]
200 (employee-email lenin)))))
201 "Vladamir Lenin: lenin@soviet.org"
202 "Dimitriy Ivanovich: ivanovich@soviet.org"
203 "Vladamir Lenin: lenin@soviet.org")
205 ;; tests update-instance-from-records
206 (deftest :oodml/update-instance/1
209 (slot-value employee1 'first-name)
211 (slot-value employee1 'last-name)
213 (slot-value employee1 'email))
215 (clsql:update-records [employee]
216 :av-pairs '(([first-name] "Ivan")
217 ([last-name] "Petrov")
218 ([email] "petrov@soviet.org"))
219 :where [= [emplid] 1])
220 (clsql:update-instance-from-records employee1)
222 (slot-value employee1 'first-name)
224 (slot-value employee1 'last-name)
226 (slot-value employee1 'email)))
228 (clsql:update-records [employee]
229 :av-pairs '(([first-name] "Vladamir")
230 ([last-name] "Lenin")
231 ([email] "lenin@soviet.org"))
232 :where [= [emplid] 1])
233 (clsql:update-instance-from-records employee1)
235 (slot-value employee1 'first-name)
237 (slot-value employee1 'last-name)
239 (slot-value employee1 'email))))
240 "Vladamir Lenin: lenin@soviet.org"
241 "Ivan Petrov: petrov@soviet.org"
242 "Vladamir Lenin: lenin@soviet.org")
244 ;; tests update-slot-from-record
245 (deftest :oodml/update-instance/2
247 (slot-value employee1 'email)
249 (clsql:update-records [employee]
250 :av-pairs '(([email] "lenin-nospam@soviet.org"))
251 :where [= [emplid] 1])
252 (clsql:update-slot-from-record employee1 'email)
253 (slot-value employee1 'email))
255 (clsql:update-records [employee]
256 :av-pairs '(([email] "lenin@soviet.org"))
257 :where [= [emplid] 1])
258 (clsql:update-slot-from-record employee1 'email)
259 (slot-value employee1 'email)))
260 "lenin@soviet.org" "lenin-nospam@soviet.org" "lenin@soviet.org")
263 (deftest :oodml/do-query/1
265 (clsql:do-query ((e) [select 'employee :order-by [emplid]])
266 (push (slot-value e 'last-name) result))
268 ("Putin" "Yeltsin" "Gorbachev" "Chernenko" "Andropov" "Brezhnev" "Kruschev"
269 "Trotsky" "Stalin" "Lenin"))
271 (deftest :oodml/do-query/2
273 (clsql:do-query ((e c) [select 'employee 'company
274 :where [= [slot-value 'employee 'last-name]
276 (push (list (slot-value e 'last-name) (slot-value c 'name))
279 (("Lenin" "Widgets Inc.")))
281 (deftest :oodml/map-query/1
282 (clsql:map-query 'list #'last-name [select 'employee :order-by [emplid]])
283 ("Lenin" "Stalin" "Trotsky" "Kruschev" "Brezhnev" "Andropov" "Chernenko"
284 "Gorbachev" "Yeltsin" "Putin"))
286 (deftest :oodml/map-query/2
287 (clsql:map-query 'list #'(lambda (e c) (list (slot-value e 'last-name)
288 (slot-value c 'name)))
289 [select 'employee 'company :where [= [slot-value 'employee 'last-name]
291 (("Lenin" "Widgets Inc.")))
293 ;(deftest :oodml/iteration/3
294 ; (loop for (e) being the tuples in
295 ; [select 'employee :where [married] :order-by [emplid]]
296 ; collect (slot-value e 'last-name))
297 ; ("Lenin" "Stalin" "Trotsky"))
301 #.(clsql:restore-sql-reader-syntax-state)