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 ;; sqlite fails this because it is typeless
58 (deftest :oodml/select/5
59 (length (clsql:select 'employee :where [married] :flatp t))
62 ;; tests update-records-from-instance
63 (deftest :oodml/update-records/1
66 (let ((lenin (car (clsql:select 'employee
67 :where [= [slot-value 'employee 'emplid]
75 (employee-email lenin))))
77 (setf (slot-value employee1 'first-name) "Dimitriy"
78 (slot-value employee1 'last-name) "Ivanovich"
79 (slot-value employee1 'email) "ivanovich@soviet.org")
80 (clsql:update-records-from-instance employee1)
81 (let ((lenin (car (clsql:select 'employee
82 :where [= [slot-value 'employee 'emplid]
90 (employee-email lenin))))
92 (setf (slot-value employee1 'first-name) "Vladamir"
93 (slot-value employee1 'last-name) "Lenin"
94 (slot-value employee1 'email) "lenin@soviet.org")
95 (clsql:update-records-from-instance employee1)
96 (let ((lenin (car (clsql:select 'employee
97 :where [= [slot-value 'employee 'emplid]
105 (employee-email lenin)))))
106 "Vladamir Lenin: lenin@soviet.org"
107 "Dimitriy Ivanovich: ivanovich@soviet.org"
108 "Vladamir Lenin: lenin@soviet.org")
110 ;; tests update-record-from-slot
111 (deftest :oodml/update-records/2
114 (car (clsql:select 'employee
115 :where [= [slot-value 'employee 'emplid] 1]
118 (setf (slot-value employee1 'email) "lenin-nospam@soviet.org")
119 (clsql:update-record-from-slot employee1 'email)
121 (car (clsql:select 'employee
122 :where [= [slot-value 'employee 'emplid] 1]
125 (setf (slot-value employee1 'email) "lenin@soviet.org")
126 (clsql:update-record-from-slot employee1 'email)
128 (car (clsql:select 'employee
129 :where [= [slot-value 'employee 'emplid] 1]
131 "lenin@soviet.org" "lenin-nospam@soviet.org" "lenin@soviet.org")
133 ;; tests update-record-from-slots
134 (deftest :oodml/update-records/3
136 (let ((lenin (car (clsql:select 'employee
137 :where [= [slot-value 'employee 'emplid]
145 (employee-email lenin)))
147 (setf (slot-value employee1 'first-name) "Dimitriy"
148 (slot-value employee1 'last-name) "Ivanovich"
149 (slot-value employee1 'email) "ivanovich@soviet.org")
150 (clsql:update-record-from-slots employee1 '(first-name last-name email))
151 (let ((lenin (car (clsql:select 'employee
152 :where [= [slot-value 'employee 'emplid]
160 (employee-email lenin))))
162 (setf (slot-value employee1 'first-name) "Vladamir"
163 (slot-value employee1 'last-name) "Lenin"
164 (slot-value employee1 'email) "lenin@soviet.org")
165 (clsql:update-record-from-slots employee1 '(first-name last-name email))
166 (let ((lenin (car (clsql:select 'employee
167 :where [= [slot-value 'employee 'emplid]
175 (employee-email lenin)))))
176 "Vladamir Lenin: lenin@soviet.org"
177 "Dimitriy Ivanovich: ivanovich@soviet.org"
178 "Vladamir Lenin: lenin@soviet.org")
180 ;; tests update-instance-from-records
181 (deftest :oodml/update-instance/1
184 (slot-value employee1 'first-name)
186 (slot-value employee1 'last-name)
188 (slot-value employee1 'email))
190 (clsql:update-records [employee]
191 :av-pairs '(([first-name] "Ivan")
192 ([last-name] "Petrov")
193 ([email] "petrov@soviet.org"))
194 :where [= [emplid] 1])
195 (clsql:update-instance-from-records employee1)
197 (slot-value employee1 'first-name)
199 (slot-value employee1 'last-name)
201 (slot-value employee1 'email)))
203 (clsql:update-records [employee]
204 :av-pairs '(([first-name] "Vladamir")
205 ([last-name] "Lenin")
206 ([email] "lenin@soviet.org"))
207 :where [= [emplid] 1])
208 (clsql:update-instance-from-records employee1)
210 (slot-value employee1 'first-name)
212 (slot-value employee1 'last-name)
214 (slot-value employee1 'email))))
215 "Vladamir Lenin: lenin@soviet.org"
216 "Ivan Petrov: petrov@soviet.org"
217 "Vladamir Lenin: lenin@soviet.org")
219 ;; tests update-slot-from-record
220 (deftest :oodml/update-instance/2
222 (slot-value employee1 'email)
224 (clsql:update-records [employee]
225 :av-pairs '(([email] "lenin-nospam@soviet.org"))
226 :where [= [emplid] 1])
227 (clsql:update-slot-from-record employee1 'email)
228 (slot-value employee1 'email))
230 (clsql:update-records [employee]
231 :av-pairs '(([email] "lenin@soviet.org"))
232 :where [= [emplid] 1])
233 (clsql:update-slot-from-record employee1 'email)
234 (slot-value employee1 'email)))
235 "lenin@soviet.org" "lenin-nospam@soviet.org" "lenin@soviet.org")
238 (deftest :oodml/do-query/1
240 (clsql:do-query ((e) [select 'employee :order-by [emplid]])
241 (push (slot-value e 'last-name) result))
243 ("Putin" "Yeltsin" "Gorbachev" "Chernenko" "Andropov" "Brezhnev" "Kruschev"
244 "Trotsky" "Stalin" "Lenin"))
246 (deftest :oodml/do-query/2
248 (clsql:do-query ((e c) [select 'employee 'company
249 :where [= [slot-value 'employee 'last-name]
251 (push (list (slot-value e 'last-name) (slot-value c 'name))
254 (("Lenin" "Widgets Inc.")))
256 (deftest :oodml/map-query/1
257 (clsql:map-query 'list #'last-name [select 'employee :order-by [emplid]])
258 ("Lenin" "Stalin" "Trotsky" "Kruschev" "Brezhnev" "Andropov" "Chernenko"
259 "Gorbachev" "Yeltsin" "Putin"))
261 (deftest :oodml/map-query/2
262 (clsql:map-query 'list #'(lambda (e c) (list (slot-value e 'last-name)
263 (slot-value c 'name)))
264 [select 'employee 'company :where [= [slot-value 'employee 'last-name]
266 (("Lenin" "Widgets Inc.")))
268 ;(deftest :oodml/iteration/3
269 ; (loop for (e) being the tuples in
270 ; [select 'employee :where [married] :order-by [emplid]]
271 ; collect (slot-value e 'last-name))
272 ; ("Lenin" "Stalin" "Trotsky"))
276 #.(clsql:restore-sql-reader-syntax-state)