r9212: Automated commit for Debian build of clsql upstream-version-2.10.8
[clsql.git] / tests / test-oodml.lisp
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
6 ;;;; Updated: $Id$
7 ;;;;
8 ;;;; Tests for the CLSQL Object Oriented Data Definition Language
9 ;;;; (OODML).
10 ;;;;
11 ;;;; This file is part of CLSQL.
12 ;;;;
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 ;;;; ======================================================================
17
18 (in-package #:clsql-tests)
19
20 #.(clsql:locally-enable-sql-reader-syntax)
21
22 (setq *rt-oodml*
23       '(
24         
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"))
30
31 (deftest :oodml/select/2
32     (mapcar #'(lambda (e) (slot-value e 'name))
33             (clsql:select 'company :flatp t))
34   ("Widgets Inc."))
35
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]
42                                          "Widgets Inc."]]
43                           :flatp t))
44   (1 1 1 1 1 1 1 1 1 1))
45
46 (deftest :oodml/select/4
47     (mapcar #'(lambda (e)
48                 (concatenate 'string (slot-value e 'first-name)
49                              " "
50                              (slot-value e 'last-name)))
51             (clsql:select 'employee :where [= [slot-value 'employee 'first-name]
52                                              "Vladamir"]
53                          :flatp t                    
54                          :order-by [last-name]))
55   ("Vladamir Lenin" "Vladamir Putin"))
56
57 (deftest :oodml/select/5
58     (length (clsql:select 'employee :where [married] :flatp t))
59   3)
60
61 (deftest :oodml/select/6
62     (slot-value (caar (clsql:select 'employee :where [= 1 [emplid]])) 'married)
63   t)
64
65 (deftest :oodml/select/7
66     (slot-value (caar (clsql:select 'employee :where [= 4 [emplid]])) 'married)
67   nil)
68
69 (deftest :oodml/select/8
70     (let ((a (caar (clsql:select 'address :where [= 1 [emplid]]))))
71       (values
72        (slot-value a 'street-number)
73        (slot-value a 'street-name)
74        (slot-value a 'city)
75        (slot-value a 'postal-code)))
76   10 "Park Place" "Leningrad" 123)
77
78 (deftest :oodml/select/9
79     (let ((a (caar (clsql:select 'address :where [= 2 [emplid]]))))
80       (values
81        (slot-value a 'street-number)
82        (slot-value a 'street-name)
83        (slot-value a 'city)
84        (slot-value a 'postal-code)))
85   nil "" "no city" 0)
86
87 ;; tests update-records-from-instance 
88 (deftest :oodml/update-records/1
89     (values
90      (progn
91        (let ((lenin (car (clsql:select 'employee
92                                       :where [= [slot-value 'employee 'emplid]
93                                                 1]
94                                       :flatp t))))
95          (concatenate 'string
96                       (first-name lenin)
97                       " "
98                       (last-name lenin)
99                       ": "
100                       (employee-email lenin))))
101        (progn
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]
108                                                 1]
109                                       :flatp t))))
110            (concatenate 'string
111                         (first-name lenin)
112                         " "
113                         (last-name lenin)
114                         ": "
115                         (employee-email lenin))))
116        (progn 
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]
123                                                 1]
124                                       :flatp t))))
125            (concatenate 'string
126                         (first-name lenin)
127                         " "
128                         (last-name lenin)
129                         ": "
130                         (employee-email lenin)))))
131   "Vladamir Lenin: lenin@soviet.org"
132   "Dimitriy Ivanovich: ivanovich@soviet.org"
133   "Vladamir Lenin: lenin@soviet.org")
134
135 ;; tests update-record-from-slot 
136 (deftest :oodml/update-records/2
137     (values
138      (employee-email
139       (car (clsql:select 'employee
140                         :where [= [slot-value 'employee 'emplid] 1]
141                         :flatp t)))
142      (progn
143        (setf (slot-value employee1 'email) "lenin-nospam@soviet.org")
144        (clsql:update-record-from-slot employee1 'email)
145        (employee-email
146         (car (clsql:select 'employee
147                           :where [= [slot-value 'employee 'emplid] 1]
148                           :flatp t))))
149      (progn 
150        (setf (slot-value employee1 'email) "lenin@soviet.org")
151        (clsql:update-record-from-slot employee1 'email)
152        (employee-email
153         (car (clsql:select 'employee
154                           :where [= [slot-value 'employee 'emplid] 1]
155                           :flatp t)))))
156   "lenin@soviet.org" "lenin-nospam@soviet.org" "lenin@soviet.org")
157
158 ;; tests update-record-from-slots
159 (deftest :oodml/update-records/3
160     (values
161      (let ((lenin (car (clsql:select 'employee
162                                     :where [= [slot-value 'employee 'emplid]
163                                               1]
164                                     :flatp t))))
165        (concatenate 'string
166                     (first-name lenin)
167                     " "
168                     (last-name lenin)
169                     ": "
170                     (employee-email lenin)))
171      (progn
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]
178                                                 1]
179                                       :flatp t))))
180          (concatenate 'string
181                       (first-name lenin)
182                       " "
183                       (last-name lenin)
184                       ": "
185                       (employee-email lenin))))
186      (progn 
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]
193                                                 1]
194                                       :flatp t))))
195          (concatenate 'string
196                       (first-name lenin)
197                       " "
198                       (last-name lenin)
199                       ": "
200                       (employee-email lenin)))))
201   "Vladamir Lenin: lenin@soviet.org"
202   "Dimitriy Ivanovich: ivanovich@soviet.org"
203   "Vladamir Lenin: lenin@soviet.org")
204
205 ;; tests update-instance-from-records 
206 (deftest :oodml/update-instance/1
207     (values
208      (concatenate 'string
209                   (slot-value employee1 'first-name)
210                   " "
211                   (slot-value employee1 'last-name)
212                   ": "
213                   (slot-value employee1 'email))
214      (progn
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)
221        (concatenate 'string
222                     (slot-value employee1 'first-name)
223                     " "
224                     (slot-value employee1 'last-name)
225                     ": "
226                     (slot-value employee1 'email)))
227      (progn 
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)
234        (concatenate 'string
235                     (slot-value employee1 'first-name)
236                     " "
237                     (slot-value employee1 'last-name)
238                     ": "
239                     (slot-value employee1 'email))))
240   "Vladamir Lenin: lenin@soviet.org"
241   "Ivan Petrov: petrov@soviet.org"
242   "Vladamir Lenin: lenin@soviet.org")
243
244 ;; tests update-slot-from-record 
245 (deftest :oodml/update-instance/2
246     (values
247      (slot-value employee1 'email)
248      (progn
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))
254      (progn 
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")
261
262
263 (deftest :oodml/do-query/1
264      (let ((result '()))
265        (clsql:do-query ((e) [select 'employee :order-by [emplid]])
266          (push (slot-value e 'last-name) result))
267        result)
268    ("Putin" "Yeltsin" "Gorbachev" "Chernenko" "Andropov" "Brezhnev" "Kruschev"
269  "Trotsky" "Stalin" "Lenin"))
270
271 (deftest :oodml/do-query/2
272      (let ((result '()))
273        (clsql:do-query ((e c) [select 'employee 'company 
274                                   :where [= [slot-value 'employee 'last-name] 
275                                   "Lenin"]])
276          (push (list (slot-value e 'last-name) (slot-value c 'name))
277                result))
278        result)
279  (("Lenin" "Widgets Inc.")))
280
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"))
285
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] 
290                                            "Lenin"]])
291  (("Lenin" "Widgets Inc.")))
292
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"))
298
299 ))
300
301 #.(clsql:restore-sql-reader-syntax-state)