r9222: new debian package
[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     (let ((a (caar (clsql:select 'address :where [= 1 [emplid]]))))
63       (values
64        (slot-value a 'street-number)
65        (slot-value a 'street-name)
66        (slot-value a 'city)
67        (slot-value a 'postal-code)))
68   10 "Park Place" "Leningrad" 123)
69
70 (deftest :oodml/select/7
71     (let ((a (caar (clsql:select 'address :where [= 2 [emplid]]))))
72       (values
73        (slot-value a 'street-number)
74        (slot-value a 'street-name)
75        (slot-value a 'city)
76        (slot-value a 'postal-code)))
77   nil "" "no city" 0)
78
79 (deftest :oodml/select/8 
80     (mapcar #'(lambda (e) (slot-value e 'married)) 
81               (clsql:select 'employee :flatp t :order-by [emplid]))
82   (t t t nil nil nil nil nil nil nil))
83
84 ;; tests update-records-from-instance 
85 (deftest :oodml/update-records/1
86     (values
87      (progn
88        (let ((lenin (car (clsql:select 'employee
89                                       :where [= [slot-value 'employee 'emplid]
90                                                 1]
91                                       :flatp t))))
92          (concatenate 'string
93                       (first-name lenin)
94                       " "
95                       (last-name lenin)
96                       ": "
97                       (employee-email lenin))))
98        (progn
99          (setf (slot-value employee1 'first-name) "Dimitriy" 
100                (slot-value employee1 'last-name) "Ivanovich"
101                (slot-value employee1 'email) "ivanovich@soviet.org")
102          (clsql:update-records-from-instance employee1)
103          (let ((lenin (car (clsql:select 'employee
104                                       :where [= [slot-value 'employee 'emplid]
105                                                 1]
106                                       :flatp t))))
107            (concatenate 'string
108                         (first-name lenin)
109                         " "
110                         (last-name lenin)
111                         ": "
112                         (employee-email lenin))))
113        (progn 
114          (setf (slot-value employee1 'first-name) "Vladamir" 
115                (slot-value employee1 'last-name) "Lenin"
116                (slot-value employee1 'email) "lenin@soviet.org")
117          (clsql:update-records-from-instance employee1)
118          (let ((lenin (car (clsql:select 'employee
119                                       :where [= [slot-value 'employee 'emplid]
120                                                 1]
121                                       :flatp t))))
122            (concatenate 'string
123                         (first-name lenin)
124                         " "
125                         (last-name lenin)
126                         ": "
127                         (employee-email lenin)))))
128   "Vladamir Lenin: lenin@soviet.org"
129   "Dimitriy Ivanovich: ivanovich@soviet.org"
130   "Vladamir Lenin: lenin@soviet.org")
131
132 ;; tests update-record-from-slot 
133 (deftest :oodml/update-records/2
134     (values
135      (employee-email
136       (car (clsql:select 'employee
137                         :where [= [slot-value 'employee 'emplid] 1]
138                         :flatp t)))
139      (progn
140        (setf (slot-value employee1 'email) "lenin-nospam@soviet.org")
141        (clsql:update-record-from-slot employee1 'email)
142        (employee-email
143         (car (clsql:select 'employee
144                           :where [= [slot-value 'employee 'emplid] 1]
145                           :flatp t))))
146      (progn 
147        (setf (slot-value employee1 'email) "lenin@soviet.org")
148        (clsql:update-record-from-slot employee1 'email)
149        (employee-email
150         (car (clsql:select 'employee
151                           :where [= [slot-value 'employee 'emplid] 1]
152                           :flatp t)))))
153   "lenin@soviet.org" "lenin-nospam@soviet.org" "lenin@soviet.org")
154
155 ;; tests update-record-from-slots
156 (deftest :oodml/update-records/3
157     (values
158      (let ((lenin (car (clsql:select 'employee
159                                     :where [= [slot-value 'employee 'emplid]
160                                               1]
161                                     :flatp t))))
162        (concatenate 'string
163                     (first-name lenin)
164                     " "
165                     (last-name lenin)
166                     ": "
167                     (employee-email lenin)))
168      (progn
169        (setf (slot-value employee1 'first-name) "Dimitriy" 
170              (slot-value employee1 'last-name) "Ivanovich"
171              (slot-value employee1 'email) "ivanovich@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]
175                                                 1]
176                                       :flatp t))))
177          (concatenate 'string
178                       (first-name lenin)
179                       " "
180                       (last-name lenin)
181                       ": "
182                       (employee-email lenin))))
183      (progn 
184        (setf (slot-value employee1 'first-name) "Vladamir" 
185              (slot-value employee1 'last-name) "Lenin"
186              (slot-value employee1 'email) "lenin@soviet.org")
187        (clsql:update-record-from-slots employee1 '(first-name last-name email))
188        (let ((lenin (car (clsql:select 'employee
189                                       :where [= [slot-value 'employee 'emplid]
190                                                 1]
191                                       :flatp t))))
192          (concatenate 'string
193                       (first-name lenin)
194                       " "
195                       (last-name lenin)
196                       ": "
197                       (employee-email lenin)))))
198   "Vladamir Lenin: lenin@soviet.org"
199   "Dimitriy Ivanovich: ivanovich@soviet.org"
200   "Vladamir Lenin: lenin@soviet.org")
201
202 ;; tests update-instance-from-records 
203 (deftest :oodml/update-instance/1
204     (values
205      (concatenate 'string
206                   (slot-value employee1 'first-name)
207                   " "
208                   (slot-value employee1 'last-name)
209                   ": "
210                   (slot-value employee1 'email))
211      (progn
212        (clsql:update-records [employee] 
213                             :av-pairs '(([first-name] "Ivan")
214                                         ([last-name] "Petrov")
215                                         ([email] "petrov@soviet.org"))
216                             :where [= [emplid] 1])
217        (clsql:update-instance-from-records employee1)
218        (concatenate 'string
219                     (slot-value employee1 'first-name)
220                     " "
221                     (slot-value employee1 'last-name)
222                     ": "
223                     (slot-value employee1 'email)))
224      (progn 
225        (clsql:update-records [employee] 
226                             :av-pairs '(([first-name] "Vladamir")
227                                         ([last-name] "Lenin")
228                                         ([email] "lenin@soviet.org"))
229                             :where [= [emplid] 1])
230        (clsql:update-instance-from-records employee1)
231        (concatenate 'string
232                     (slot-value employee1 'first-name)
233                     " "
234                     (slot-value employee1 'last-name)
235                     ": "
236                     (slot-value employee1 'email))))
237   "Vladamir Lenin: lenin@soviet.org"
238   "Ivan Petrov: petrov@soviet.org"
239   "Vladamir Lenin: lenin@soviet.org")
240
241 ;; tests update-slot-from-record 
242 (deftest :oodml/update-instance/2
243     (values
244      (slot-value employee1 'email)
245      (progn
246        (clsql:update-records [employee] 
247                             :av-pairs '(([email] "lenin-nospam@soviet.org"))
248                             :where [= [emplid] 1])
249        (clsql:update-slot-from-record employee1 'email)
250        (slot-value employee1 'email))
251      (progn 
252        (clsql:update-records [employee] 
253                             :av-pairs '(([email] "lenin@soviet.org"))
254                             :where [= [emplid] 1])
255        (clsql:update-slot-from-record employee1 'email)
256        (slot-value employee1 'email)))
257   "lenin@soviet.org" "lenin-nospam@soviet.org" "lenin@soviet.org")
258
259
260 (deftest :oodml/do-query/1
261      (let ((result '()))
262        (clsql:do-query ((e) [select 'employee :order-by [emplid]])
263          (push (slot-value e 'last-name) result))
264        result)
265    ("Putin" "Yeltsin" "Gorbachev" "Chernenko" "Andropov" "Brezhnev" "Kruschev"
266  "Trotsky" "Stalin" "Lenin"))
267
268 (deftest :oodml/do-query/2
269      (let ((result '()))
270        (clsql:do-query ((e c) [select 'employee 'company 
271                                   :where [= [slot-value 'employee 'last-name] 
272                                   "Lenin"]])
273          (push (list (slot-value e 'last-name) (slot-value c 'name))
274                result))
275        result)
276  (("Lenin" "Widgets Inc.")))
277
278 (deftest :oodml/map-query/1
279      (clsql:map-query 'list #'last-name [select 'employee :order-by [emplid]])
280  ("Lenin" "Stalin" "Trotsky" "Kruschev" "Brezhnev" "Andropov" "Chernenko"
281   "Gorbachev" "Yeltsin" "Putin"))
282
283 (deftest :oodml/map-query/2 
284      (clsql:map-query 'list #'(lambda (e c) (list (slot-value e 'last-name)
285                                                   (slot-value c 'name)))
286       [select 'employee 'company :where [= [slot-value 'employee 'last-name] 
287                                            "Lenin"]])
288  (("Lenin" "Widgets Inc.")))
289
290 ;(deftest :oodml/iteration/3
291 ;    (loop for (e) being the tuples in 
292 ;          [select 'employee :where [married] :order-by [emplid]]
293 ;          collect (slot-value e 'last-name))
294 ;  ("Lenin" "Stalin" "Trotsky"))
295
296 ))
297
298 #.(clsql:restore-sql-reader-syntax-state)