r8910: rework so that tests are automatically run for multiple backends
[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 ;;;;
9 ;;;; Description ==========================================================
10 ;;;; ======================================================================
11 ;;;;
12 ;;;; Tests for the CLSQL Object Oriented Data Definition Language
13 ;;;; (OODML).
14 ;;;;
15 ;;;; ======================================================================
16
17 (in-package #:clsql-tests)
18
19 #.(clsql:locally-enable-sql-reader-syntax)
20
21 (setq *rt-oodml*
22       '(
23         
24 (deftest :oodml/select/1
25     (mapcar #'(lambda (e) (slot-value e 'last-name))
26             (clsql:select 'employee :order-by [last-name]))
27   ("Andropov" "Brezhnev" "Chernenko" "Gorbachev" "Kruschev" "Lenin" "Putin"
28               "Stalin" "Trotsky" "Yeltsin"))
29
30 (deftest :oodml/select/2
31     (mapcar #'(lambda (e) (slot-value e 'name))
32             (clsql:select 'company))
33   ("Widgets Inc."))
34
35 (deftest :oodml/select/3
36     (mapcar #'(lambda (e) (slot-value e 'companyid))
37             (clsql:select 'employee
38                          :where [and [= [slot-value 'employee 'companyid]
39                                         [slot-value 'company 'companyid]]
40                                      [= [slot-value 'company 'name]
41                                         "Widgets Inc."]]))
42   (1 1 1 1 1 1 1 1 1 1))
43
44 (deftest :oodml/select/4
45     (mapcar #'(lambda (e)
46                 (concatenate 'string (slot-value e 'first-name)
47                              " "
48                              (slot-value e 'last-name)))
49             (clsql:select 'employee :where [= [slot-value 'employee 'first-name]
50                                              "Vladamir"]
51                          :order-by [last-name]))
52   ("Vladamir Lenin" "Vladamir Putin"))
53
54 ;; sqlite fails this because it is typeless 
55 (deftest :oodml/select/5
56     (length (clsql:select 'employee :where [married]))
57   3)
58
59 ;; tests update-records-from-instance 
60 (deftest :oodml/update-records/1
61     (values
62      (progn
63        (let ((lenin (car (clsql:select 'employee
64                                       :where [= [slot-value 'employee 'emplid]
65                                                 1]))))
66          (concatenate 'string
67                       (first-name lenin)
68                       " "
69                       (last-name lenin)
70                       ": "
71                       (employee-email lenin))))
72        (progn
73          (setf (slot-value employee1 'first-name) "Dimitriy" 
74                (slot-value employee1 'last-name) "Ivanovich"
75                (slot-value employee1 'email) "ivanovich@soviet.org")
76          (clsql:update-records-from-instance employee1)
77          (let ((lenin (car (clsql:select 'employee
78                                       :where [= [slot-value 'employee 'emplid]
79                                                 1]))))
80            (concatenate 'string
81                         (first-name lenin)
82                         " "
83                         (last-name lenin)
84                         ": "
85                         (employee-email lenin))))
86        (progn 
87          (setf (slot-value employee1 'first-name) "Vladamir" 
88                (slot-value employee1 'last-name) "Lenin"
89                (slot-value employee1 'email) "lenin@soviet.org")
90          (clsql:update-records-from-instance employee1)
91          (let ((lenin (car (clsql:select 'employee
92                                       :where [= [slot-value 'employee 'emplid]
93                                                 1]))))
94            (concatenate 'string
95                         (first-name lenin)
96                         " "
97                         (last-name lenin)
98                         ": "
99                         (employee-email lenin)))))
100   "Vladamir Lenin: lenin@soviet.org"
101   "Dimitriy Ivanovich: ivanovich@soviet.org"
102   "Vladamir Lenin: lenin@soviet.org")
103
104 ;; tests update-record-from-slot 
105 (deftest :oodml/update-records/2
106     (values
107      (employee-email
108       (car (clsql:select 'employee
109                         :where [= [slot-value 'employee 'emplid] 1])))
110      (progn
111        (setf (slot-value employee1 'email) "lenin-nospam@soviet.org")
112        (clsql:update-record-from-slot employee1 'email)
113        (employee-email
114         (car (clsql:select 'employee
115                           :where [= [slot-value 'employee 'emplid] 1]))))
116      (progn 
117        (setf (slot-value employee1 'email) "lenin@soviet.org")
118        (clsql:update-record-from-slot employee1 'email)
119        (employee-email
120         (car (clsql:select 'employee
121                           :where [= [slot-value 'employee 'emplid] 1])))))
122   "lenin@soviet.org" "lenin-nospam@soviet.org" "lenin@soviet.org")
123
124 ;; tests update-record-from-slots
125 (deftest :oodml/update-records/3
126     (values
127      (let ((lenin (car (clsql:select 'employee
128                                     :where [= [slot-value 'employee 'emplid]
129                                               1]))))
130        (concatenate 'string
131                     (first-name lenin)
132                     " "
133                     (last-name lenin)
134                     ": "
135                     (employee-email lenin)))
136      (progn
137        (setf (slot-value employee1 'first-name) "Dimitriy" 
138              (slot-value employee1 'last-name) "Ivanovich"
139              (slot-value employee1 'email) "ivanovich@soviet.org")
140        (clsql:update-record-from-slots employee1 '(first-name last-name email))
141        (let ((lenin (car (clsql:select 'employee
142                                       :where [= [slot-value 'employee 'emplid]
143                                                 1]))))
144          (concatenate 'string
145                       (first-name lenin)
146                       " "
147                       (last-name lenin)
148                       ": "
149                       (employee-email lenin))))
150      (progn 
151        (setf (slot-value employee1 'first-name) "Vladamir" 
152              (slot-value employee1 'last-name) "Lenin"
153              (slot-value employee1 'email) "lenin@soviet.org")
154        (clsql:update-record-from-slots employee1 '(first-name last-name email))
155        (let ((lenin (car (clsql:select 'employee
156                                       :where [= [slot-value 'employee 'emplid]
157                                                 1]))))
158          (concatenate 'string
159                       (first-name lenin)
160                       " "
161                       (last-name lenin)
162                       ": "
163                       (employee-email lenin)))))
164   "Vladamir Lenin: lenin@soviet.org"
165   "Dimitriy Ivanovich: ivanovich@soviet.org"
166   "Vladamir Lenin: lenin@soviet.org")
167
168 ;; tests update-instance-from-records 
169 (deftest :oodml/update-instance/1
170     (values
171      (concatenate 'string
172                   (slot-value employee1 'first-name)
173                   " "
174                   (slot-value employee1 'last-name)
175                   ": "
176                   (slot-value employee1 'email))
177      (progn
178        (clsql:update-records [employee] 
179                             :av-pairs '(([first-name] "Ivan")
180                                         ([last-name] "Petrov")
181                                         ([email] "petrov@soviet.org"))
182                             :where [= [emplid] 1])
183        (clsql:update-instance-from-records employee1)
184        (concatenate 'string
185                     (slot-value employee1 'first-name)
186                     " "
187                     (slot-value employee1 'last-name)
188                     ": "
189                     (slot-value employee1 'email)))
190      (progn 
191        (clsql:update-records [employee] 
192                             :av-pairs '(([first-name] "Vladamir")
193                                         ([last-name] "Lenin")
194                                         ([email] "lenin@soviet.org"))
195                             :where [= [emplid] 1])
196        (clsql:update-instance-from-records employee1)
197        (concatenate 'string
198                     (slot-value employee1 'first-name)
199                     " "
200                     (slot-value employee1 'last-name)
201                     ": "
202                     (slot-value employee1 'email))))
203   "Vladamir Lenin: lenin@soviet.org"
204   "Ivan Petrov: petrov@soviet.org"
205   "Vladamir Lenin: lenin@soviet.org")
206
207 ;; tests update-slot-from-record 
208 (deftest :oodml/update-instance/2
209     (values
210      (slot-value employee1 'email)
211      (progn
212        (clsql:update-records [employee] 
213                             :av-pairs '(([email] "lenin-nospam@soviet.org"))
214                             :where [= [emplid] 1])
215        (clsql:update-slot-from-record employee1 'email)
216        (slot-value employee1 'email))
217      (progn 
218        (clsql:update-records [employee] 
219                             :av-pairs '(([email] "lenin@soviet.org"))
220                             :where [= [emplid] 1])
221        (clsql:update-slot-from-record employee1 'email)
222        (slot-value employee1 'email)))
223   "lenin@soviet.org" "lenin-nospam@soviet.org" "lenin@soviet.org")
224
225
226 ;(deftest :oodml/iteration/1
227 ;    (clsql:do-query ((e) [select 'clsql-tests::employee :where [married]
228 ;                                :order-by [emplid]])
229 ;      (slot-value e last-name))
230 ;  ("Lenin" "Stalin" "Trotsky"))
231
232 ;(deftest :oodml/iteration/2
233 ;    (clsql:map-query 'list #'last-name [select 'employee :where [married]
234 ;                                              :order-by [emplid]])
235 ;  ("Lenin" "Stalin" "Trotsky"))
236
237 ;(deftest :oodml/iteration/3
238 ;    (loop for (e) being the tuples in 
239 ;          [select 'employee :where [married] :order-by [emplid]]
240 ;          collect (slot-value e 'last-name))
241 ;  ("Lenin" "Stalin" "Trotsky"))
242
243 ))
244
245 #.(clsql:restore-sql-reader-syntax-state)