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 ;; tests update-records-from-instance
70 (deftest :oodml/update-records/1
73 (let ((lenin (car (clsql:select 'employee
74 :where [= [slot-value 'employee 'emplid]
82 (employee-email lenin))))
84 (setf (slot-value employee1 'first-name) "Dimitriy"
85 (slot-value employee1 'last-name) "Ivanovich"
86 (slot-value employee1 'email) "ivanovich@soviet.org")
87 (clsql:update-records-from-instance employee1)
88 (let ((lenin (car (clsql:select 'employee
89 :where [= [slot-value 'employee 'emplid]
97 (employee-email lenin))))
99 (setf (slot-value employee1 'first-name) "Vladamir"
100 (slot-value employee1 'last-name) "Lenin"
101 (slot-value employee1 'email) "lenin@soviet.org")
102 (clsql:update-records-from-instance employee1)
103 (let ((lenin (car (clsql:select 'employee
104 :where [= [slot-value 'employee 'emplid]
112 (employee-email lenin)))))
113 "Vladamir Lenin: lenin@soviet.org"
114 "Dimitriy Ivanovich: ivanovich@soviet.org"
115 "Vladamir Lenin: lenin@soviet.org")
117 ;; tests update-record-from-slot
118 (deftest :oodml/update-records/2
121 (car (clsql:select 'employee
122 :where [= [slot-value 'employee 'emplid] 1]
125 (setf (slot-value employee1 'email) "lenin-nospam@soviet.org")
126 (clsql:update-record-from-slot employee1 'email)
128 (car (clsql:select 'employee
129 :where [= [slot-value 'employee 'emplid] 1]
132 (setf (slot-value employee1 'email) "lenin@soviet.org")
133 (clsql:update-record-from-slot employee1 'email)
135 (car (clsql:select 'employee
136 :where [= [slot-value 'employee 'emplid] 1]
138 "lenin@soviet.org" "lenin-nospam@soviet.org" "lenin@soviet.org")
140 ;; tests update-record-from-slots
141 (deftest :oodml/update-records/3
143 (let ((lenin (car (clsql:select 'employee
144 :where [= [slot-value 'employee 'emplid]
152 (employee-email lenin)))
154 (setf (slot-value employee1 'first-name) "Dimitriy"
155 (slot-value employee1 'last-name) "Ivanovich"
156 (slot-value employee1 'email) "ivanovich@soviet.org")
157 (clsql:update-record-from-slots employee1 '(first-name last-name email))
158 (let ((lenin (car (clsql:select 'employee
159 :where [= [slot-value 'employee 'emplid]
167 (employee-email lenin))))
169 (setf (slot-value employee1 'first-name) "Vladamir"
170 (slot-value employee1 'last-name) "Lenin"
171 (slot-value employee1 'email) "lenin@soviet.org")
172 (clsql:update-record-from-slots employee1 '(first-name last-name email))
173 (let ((lenin (car (clsql:select 'employee
174 :where [= [slot-value 'employee 'emplid]
182 (employee-email lenin)))))
183 "Vladamir Lenin: lenin@soviet.org"
184 "Dimitriy Ivanovich: ivanovich@soviet.org"
185 "Vladamir Lenin: lenin@soviet.org")
187 ;; tests update-instance-from-records
188 (deftest :oodml/update-instance/1
191 (slot-value employee1 'first-name)
193 (slot-value employee1 'last-name)
195 (slot-value employee1 'email))
197 (clsql:update-records [employee]
198 :av-pairs '(([first-name] "Ivan")
199 ([last-name] "Petrov")
200 ([email] "petrov@soviet.org"))
201 :where [= [emplid] 1])
202 (clsql:update-instance-from-records employee1)
204 (slot-value employee1 'first-name)
206 (slot-value employee1 'last-name)
208 (slot-value employee1 'email)))
210 (clsql:update-records [employee]
211 :av-pairs '(([first-name] "Vladamir")
212 ([last-name] "Lenin")
213 ([email] "lenin@soviet.org"))
214 :where [= [emplid] 1])
215 (clsql:update-instance-from-records employee1)
217 (slot-value employee1 'first-name)
219 (slot-value employee1 'last-name)
221 (slot-value employee1 'email))))
222 "Vladamir Lenin: lenin@soviet.org"
223 "Ivan Petrov: petrov@soviet.org"
224 "Vladamir Lenin: lenin@soviet.org")
226 ;; tests update-slot-from-record
227 (deftest :oodml/update-instance/2
229 (slot-value employee1 'email)
231 (clsql:update-records [employee]
232 :av-pairs '(([email] "lenin-nospam@soviet.org"))
233 :where [= [emplid] 1])
234 (clsql:update-slot-from-record employee1 'email)
235 (slot-value employee1 'email))
237 (clsql:update-records [employee]
238 :av-pairs '(([email] "lenin@soviet.org"))
239 :where [= [emplid] 1])
240 (clsql:update-slot-from-record employee1 'email)
241 (slot-value employee1 'email)))
242 "lenin@soviet.org" "lenin-nospam@soviet.org" "lenin@soviet.org")
245 (deftest :oodml/do-query/1
247 (clsql:do-query ((e) [select 'employee :order-by [emplid]])
248 (push (slot-value e 'last-name) result))
250 ("Putin" "Yeltsin" "Gorbachev" "Chernenko" "Andropov" "Brezhnev" "Kruschev"
251 "Trotsky" "Stalin" "Lenin"))
253 (deftest :oodml/do-query/2
255 (clsql:do-query ((e c) [select 'employee 'company
256 :where [= [slot-value 'employee 'last-name]
258 (push (list (slot-value e 'last-name) (slot-value c 'name))
261 (("Lenin" "Widgets Inc.")))
263 (deftest :oodml/map-query/1
264 (clsql:map-query 'list #'last-name [select 'employee :order-by [emplid]])
265 ("Lenin" "Stalin" "Trotsky" "Kruschev" "Brezhnev" "Andropov" "Chernenko"
266 "Gorbachev" "Yeltsin" "Putin"))
268 (deftest :oodml/map-query/2
269 (clsql:map-query 'list #'(lambda (e c) (list (slot-value e 'last-name)
270 (slot-value c 'name)))
271 [select 'employee 'company :where [= [slot-value 'employee 'last-name]
273 (("Lenin" "Widgets Inc.")))
275 ;(deftest :oodml/iteration/3
276 ; (loop for (e) being the tuples in
277 ; [select 'employee :where [married] :order-by [emplid]]
278 ; collect (slot-value e 'last-name))
279 ; ("Lenin" "Stalin" "Trotsky"))
283 #.(clsql:restore-sql-reader-syntax-state)