rlm@10
|
1 ;; Copyright (c) Jeffrey Straszheim. All rights reserved. The use and
|
rlm@10
|
2 ;; distribution terms for this software are covered by the Eclipse Public
|
rlm@10
|
3 ;; License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) which can
|
rlm@10
|
4 ;; be found in the file epl-v10.html at the root of this distribution. By
|
rlm@10
|
5 ;; using this software in any fashion, you are agreeing to be bound by the
|
rlm@10
|
6 ;; terms of this license. You must not remove this notice, or any other,
|
rlm@10
|
7 ;; from this software.
|
rlm@10
|
8 ;;
|
rlm@10
|
9 ;; test-database.clj
|
rlm@10
|
10 ;;
|
rlm@10
|
11 ;; A Clojure implementation of Datalog -- Database
|
rlm@10
|
12 ;;
|
rlm@10
|
13 ;; straszheimjeffrey (gmail)
|
rlm@10
|
14 ;; Created 12 Feburary 2009
|
rlm@10
|
15
|
rlm@10
|
16
|
rlm@10
|
17 (ns clojure.contrib.datalog.tests.test-database
|
rlm@10
|
18 (:use clojure.test
|
rlm@10
|
19 clojure.contrib.datalog.database))
|
rlm@10
|
20
|
rlm@10
|
21
|
rlm@10
|
22 (def test-db
|
rlm@10
|
23 (make-database
|
rlm@10
|
24 (relation :fred [:mary :sue])
|
rlm@10
|
25 (index :fred :mary)
|
rlm@10
|
26 (relation :sally [:jen :becky :joan])
|
rlm@10
|
27 (index :sally :jen)
|
rlm@10
|
28 (index :sally :becky)))
|
rlm@10
|
29
|
rlm@10
|
30 (deftest test-make-database
|
rlm@10
|
31 (is (= test-db
|
rlm@10
|
32 (datalog-database
|
rlm@10
|
33 {:sally (datalog-relation
|
rlm@10
|
34 #{:jen :joan :becky}
|
rlm@10
|
35 #{}
|
rlm@10
|
36 {:becky {}
|
rlm@10
|
37 :jen {}})
|
rlm@10
|
38 :fred (datalog-relation
|
rlm@10
|
39 #{:sue :mary}
|
rlm@10
|
40 #{}
|
rlm@10
|
41 {:mary {}})}))))
|
rlm@10
|
42
|
rlm@10
|
43
|
rlm@10
|
44 (deftest test-ensure-relation
|
rlm@10
|
45 (is (contains? (ensure-relation test-db :bob [:sam :george] [:sam]) :bob))
|
rlm@10
|
46 (is (contains? (ensure-relation test-db :fred [:mary :sue] [:mary]) :fred))
|
rlm@10
|
47 (is (thrown? AssertionError (ensure-relation test-db :fred [:bob :joe] []))))
|
rlm@10
|
48
|
rlm@10
|
49 (deftest test-add-tuple
|
rlm@10
|
50 (let [new-db (add-tuple test-db :fred {:mary 1 :sue 2})]
|
rlm@10
|
51 (is (= (select new-db :fred {:mary 1}) [{:mary 1 :sue 2}])))
|
rlm@10
|
52 (is (thrown? AssertionError (add-tuple test-db :fred {:mary 1}))))
|
rlm@10
|
53
|
rlm@10
|
54 (def test-db-1
|
rlm@10
|
55 (add-tuples test-db
|
rlm@10
|
56 [:fred :mary 1 :sue 2]
|
rlm@10
|
57 [:fred :mary 2 :sue 3]
|
rlm@10
|
58 [:sally :jen 1 :becky 2 :joan 0]
|
rlm@10
|
59 [:sally :jen 1 :becky 4 :joan 3]
|
rlm@10
|
60 [:sally :jen 1 :becky 3 :joan 0]
|
rlm@10
|
61 [:sally :jen 1 :becky 2 :joan 3]
|
rlm@10
|
62 [:fred :mary 1 :sue 1]
|
rlm@10
|
63 [:fred :mary 3 :sue 1]))
|
rlm@10
|
64
|
rlm@10
|
65 (deftest test-add-tuples
|
rlm@10
|
66 (is (= test-db-1
|
rlm@10
|
67 (datalog-database
|
rlm@10
|
68 {:sally (datalog-relation
|
rlm@10
|
69 #{:jen :joan :becky}
|
rlm@10
|
70 #{{:jen 1, :joan 0, :becky 3}
|
rlm@10
|
71 {:jen 1, :joan 0, :becky 2}
|
rlm@10
|
72 {:jen 1, :joan 3, :becky 2}
|
rlm@10
|
73 {:jen 1, :joan 3, :becky 4}}
|
rlm@10
|
74 {:becky {3
|
rlm@10
|
75 #{{:jen 1, :joan 0, :becky 3}}
|
rlm@10
|
76 4
|
rlm@10
|
77 #{{:jen 1, :joan 3, :becky 4}}
|
rlm@10
|
78 2
|
rlm@10
|
79 #{{:jen 1, :joan 0, :becky 2}
|
rlm@10
|
80 {:jen 1, :joan 3, :becky 2}}}
|
rlm@10
|
81 :jen {1
|
rlm@10
|
82 #{{:jen 1, :joan 0, :becky 3}
|
rlm@10
|
83 {:jen 1, :joan 0, :becky 2}
|
rlm@10
|
84 {:jen 1, :joan 3, :becky 2}
|
rlm@10
|
85 {:jen 1, :joan 3, :becky 4}}}})
|
rlm@10
|
86 :fred (datalog-relation
|
rlm@10
|
87 #{:sue :mary}
|
rlm@10
|
88 #{{:sue 2, :mary 1}
|
rlm@10
|
89 {:sue 1, :mary 1}
|
rlm@10
|
90 {:sue 3, :mary 2}
|
rlm@10
|
91 {:sue 1, :mary 3}}
|
rlm@10
|
92 {:mary {3
|
rlm@10
|
93 #{{:sue 1, :mary 3}}
|
rlm@10
|
94 2
|
rlm@10
|
95 #{{:sue 3, :mary 2}}
|
rlm@10
|
96 1
|
rlm@10
|
97 #{{:sue 2, :mary 1}
|
rlm@10
|
98 {:sue 1, :mary 1}}}})}))))
|
rlm@10
|
99
|
rlm@10
|
100 (deftest test-remove-tuples
|
rlm@10
|
101 (let [db (reduce #(apply remove-tuple %1 (first %2) (next %2))
|
rlm@10
|
102 test-db-1
|
rlm@10
|
103 [[:fred {:mary 1 :sue 1}]
|
rlm@10
|
104 [:fred {:mary 3 :sue 1}]
|
rlm@10
|
105 [:sally {:jen 1 :becky 2 :joan 0}]
|
rlm@10
|
106 [:sally {:jen 1 :becky 4 :joan 3}]])]
|
rlm@10
|
107 (is (= db
|
rlm@10
|
108 (datalog-database
|
rlm@10
|
109 {:sally (datalog-relation
|
rlm@10
|
110 #{:jen :joan :becky}
|
rlm@10
|
111 #{{:jen 1, :joan 0, :becky 3}
|
rlm@10
|
112 {:jen 1, :joan 3, :becky 2}}
|
rlm@10
|
113 {:becky
|
rlm@10
|
114 {3
|
rlm@10
|
115 #{{:jen 1, :joan 0, :becky 3}}
|
rlm@10
|
116 2
|
rlm@10
|
117 #{{:jen 1, :joan 3, :becky 2}}}
|
rlm@10
|
118 :jen
|
rlm@10
|
119 {1
|
rlm@10
|
120 #{{:jen 1, :joan 0, :becky 3}
|
rlm@10
|
121 {:jen 1, :joan 3, :becky 2}}}})
|
rlm@10
|
122 :fred (datalog-relation
|
rlm@10
|
123 #{:sue :mary}
|
rlm@10
|
124 #{{:sue 2, :mary 1}
|
rlm@10
|
125 {:sue 3, :mary 2}}
|
rlm@10
|
126 {:mary
|
rlm@10
|
127 {2
|
rlm@10
|
128 #{{:sue 3, :mary 2}}
|
rlm@10
|
129 1
|
rlm@10
|
130 #{{:sue 2, :mary 1}}}})})))))
|
rlm@10
|
131
|
rlm@10
|
132
|
rlm@10
|
133
|
rlm@10
|
134 (deftest test-select
|
rlm@10
|
135 (is (= (set (select test-db-1 :sally {:jen 1 :becky 2}))
|
rlm@10
|
136 #{{:jen 1 :joan 0 :becky 2} {:jen 1 :joan 3 :becky 2}}))
|
rlm@10
|
137 (is (= (set (select test-db-1 :fred {:sue 1})))
|
rlm@10
|
138 #{{:mary 3 :sue 1} {:mary 1 :sue 1}})
|
rlm@10
|
139 (is (empty? (select test-db-1 :sally {:joan 5 :jen 1}))))
|
rlm@10
|
140
|
rlm@10
|
141 (deftest test-any-match?
|
rlm@10
|
142 (is (any-match? test-db-1 :fred {:mary 3}))
|
rlm@10
|
143 (is (any-match? test-db-1 :sally {:jen 1 :becky 2 :joan 3}))
|
rlm@10
|
144 (is (not (any-match? test-db-1 :sally {:jen 5})))
|
rlm@10
|
145 (is (not (any-match? test-db-1 :fred {:mary 1 :sue 5}))))
|
rlm@10
|
146
|
rlm@10
|
147
|
rlm@10
|
148 (comment
|
rlm@10
|
149 (run-tests)
|
rlm@10
|
150 )
|
rlm@10
|
151
|
rlm@10
|
152 ;; End of file
|
rlm@10
|
153
|