r8930: add database-create for pg socket, documentation improvements
[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]))
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))
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   (1 1 1 1 1 1 1 1 1 1))
44
45 (deftest :oodml/select/4
46     (mapcar #'(lambda (e)
47                 (concatenate 'string (slot-value e 'first-name)
48                              " "
49                              (slot-value e 'last-name)))
50             (clsql:select 'employee :where [= [slot-value 'employee 'first-name]
51                                              "Vladamir"]
52                          :order-by [last-name]))
53   ("Vladamir Lenin" "Vladamir Putin"))
54
55 ;; sqlite fails this because it is typeless 
56 (deftest :oodml/select/5
57     (length (clsql:select 'employee :where [married]))
58   3)
59
60 ;; tests update-records-from-instance 
61 (deftest :oodml/update-records/1
62     (values
63      (progn
64        (let ((lenin (car (clsql:select 'employee
65                                       :where [= [slot-value 'employee 'emplid]
66                                                 1]))))
67          (concatenate 'string
68                       (first-name lenin)
69                       " "
70                       (last-name lenin)
71                       ": "
72                       (employee-email lenin))))
73        (progn
74          (setf (slot-value employee1 'first-name) "Dimitriy" 
75                (slot-value employee1 'last-name) "Ivanovich"
76                (slot-value employee1 'email) "ivanovich@soviet.org")
77          (clsql:update-records-from-instance employee1)
78          (let ((lenin (car (clsql:select 'employee
79                                       :where [= [slot-value 'employee 'emplid]
80                                                 1]))))
81            (concatenate 'string
82                         (first-name lenin)
83                         " "
84                         (last-name lenin)
85                         ": "
86                         (employee-email lenin))))
87        (progn 
88          (setf (slot-value employee1 'first-name) "Vladamir" 
89                (slot-value employee1 'last-name) "Lenin"
90                (slot-value employee1 'email) "lenin@soviet.org")
91          (clsql:update-records-from-instance employee1)
92          (let ((lenin (car (clsql:select 'employee
93                                       :where [= [slot-value 'employee 'emplid]
94                                                 1]))))
95            (concatenate 'string
96                         (first-name lenin)
97                         " "
98                         (last-name lenin)
99                         ": "
100                         (employee-email lenin)))))
101   "Vladamir Lenin: lenin@soviet.org"
102   "Dimitriy Ivanovich: ivanovich@soviet.org"
103   "Vladamir Lenin: lenin@soviet.org")
104
105 ;; tests update-record-from-slot 
106 (deftest :oodml/update-records/2
107     (values
108      (employee-email
109       (car (clsql:select 'employee
110                         :where [= [slot-value 'employee 'emplid] 1])))
111      (progn
112        (setf (slot-value employee1 'email) "lenin-nospam@soviet.org")
113        (clsql:update-record-from-slot employee1 'email)
114        (employee-email
115         (car (clsql:select 'employee
116                           :where [= [slot-value 'employee 'emplid] 1]))))
117      (progn 
118        (setf (slot-value employee1 'email) "lenin@soviet.org")
119        (clsql:update-record-from-slot employee1 'email)
120        (employee-email
121         (car (clsql:select 'employee
122                           :where [= [slot-value 'employee 'emplid] 1])))))
123   "lenin@soviet.org" "lenin-nospam@soviet.org" "lenin@soviet.org")
124
125 ;; tests update-record-from-slots
126 (deftest :oodml/update-records/3
127     (values
128      (let ((lenin (car (clsql:select 'employee
129                                     :where [= [slot-value 'employee 'emplid]
130                                               1]))))
131        (concatenate 'string
132                     (first-name lenin)
133                     " "
134                     (last-name lenin)
135                     ": "
136                     (employee-email lenin)))
137      (progn
138        (setf (slot-value employee1 'first-name) "Dimitriy" 
139              (slot-value employee1 'last-name) "Ivanovich"
140              (slot-value employee1 'email) "ivanovich@soviet.org")
141        (clsql:update-record-from-slots employee1 '(first-name last-name email))
142        (let ((lenin (car (clsql:select 'employee
143                                       :where [= [slot-value 'employee 'emplid]
144                                                 1]))))
145          (concatenate 'string
146                       (first-name lenin)
147                       " "
148                       (last-name lenin)
149                       ": "
150                       (employee-email lenin))))
151      (progn 
152        (setf (slot-value employee1 'first-name) "Vladamir" 
153              (slot-value employee1 'last-name) "Lenin"
154              (slot-value employee1 'email) "lenin@soviet.org")
155        (clsql:update-record-from-slots employee1 '(first-name last-name email))
156        (let ((lenin (car (clsql:select 'employee
157                                       :where [= [slot-value 'employee 'emplid]
158                                                 1]))))
159          (concatenate 'string
160                       (first-name lenin)
161                       " "
162                       (last-name lenin)
163                       ": "
164                       (employee-email lenin)))))
165   "Vladamir Lenin: lenin@soviet.org"
166   "Dimitriy Ivanovich: ivanovich@soviet.org"
167   "Vladamir Lenin: lenin@soviet.org")
168
169 ;; tests update-instance-from-records 
170 (deftest :oodml/update-instance/1
171     (values
172      (concatenate 'string
173                   (slot-value employee1 'first-name)
174                   " "
175                   (slot-value employee1 'last-name)
176                   ": "
177                   (slot-value employee1 'email))
178      (progn
179        (clsql:update-records [employee] 
180                             :av-pairs '(([first-name] "Ivan")
181                                         ([last-name] "Petrov")
182                                         ([email] "petrov@soviet.org"))
183                             :where [= [emplid] 1])
184        (clsql:update-instance-from-records employee1)
185        (concatenate 'string
186                     (slot-value employee1 'first-name)
187                     " "
188                     (slot-value employee1 'last-name)
189                     ": "
190                     (slot-value employee1 'email)))
191      (progn 
192        (clsql:update-records [employee] 
193                             :av-pairs '(([first-name] "Vladamir")
194                                         ([last-name] "Lenin")
195                                         ([email] "lenin@soviet.org"))
196                             :where [= [emplid] 1])
197        (clsql:update-instance-from-records employee1)
198        (concatenate 'string
199                     (slot-value employee1 'first-name)
200                     " "
201                     (slot-value employee1 'last-name)
202                     ": "
203                     (slot-value employee1 'email))))
204   "Vladamir Lenin: lenin@soviet.org"
205   "Ivan Petrov: petrov@soviet.org"
206   "Vladamir Lenin: lenin@soviet.org")
207
208 ;; tests update-slot-from-record 
209 (deftest :oodml/update-instance/2
210     (values
211      (slot-value employee1 'email)
212      (progn
213        (clsql:update-records [employee] 
214                             :av-pairs '(([email] "lenin-nospam@soviet.org"))
215                             :where [= [emplid] 1])
216        (clsql:update-slot-from-record employee1 'email)
217        (slot-value employee1 'email))
218      (progn 
219        (clsql:update-records [employee] 
220                             :av-pairs '(([email] "lenin@soviet.org"))
221                             :where [= [emplid] 1])
222        (clsql:update-slot-from-record employee1 'email)
223        (slot-value employee1 'email)))
224   "lenin@soviet.org" "lenin-nospam@soviet.org" "lenin@soviet.org")
225
226
227 ;(deftest :oodml/iteration/1
228 ;    (clsql:do-query ((e) [select 'clsql-tests::employee :where [married]
229 ;                                :order-by [emplid]])
230 ;      (slot-value e last-name))
231 ;  ("Lenin" "Stalin" "Trotsky"))
232
233 ;(deftest :oodml/iteration/2
234 ;    (clsql:map-query 'list #'last-name [select 'employee :where [married]
235 ;                                              :order-by [emplid]])
236 ;  ("Lenin" "Stalin" "Trotsky"))
237
238 ;(deftest :oodml/iteration/3
239 ;    (loop for (e) being the tuples in 
240 ;          [select 'employee :where [married] :order-by [emplid]]
241 ;          collect (slot-value e 'last-name))
242 ;  ("Lenin" "Stalin" "Trotsky"))
243
244 ))
245
246 #.(clsql:restore-sql-reader-syntax-state)