diff src/clojure/contrib/test_contrib/datalog/tests/test_database.clj @ 10:ef7dbbd6452c

added clojure source goodness
author Robert McIntyre <rlm@mit.edu>
date Sat, 21 Aug 2010 06:25:44 -0400
parents
children
line wrap: on
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/clojure/contrib/test_contrib/datalog/tests/test_database.clj	Sat Aug 21 06:25:44 2010 -0400
     1.3 @@ -0,0 +1,153 @@
     1.4 +;;  Copyright (c) Jeffrey Straszheim. All rights reserved.  The use and
     1.5 +;;  distribution terms for this software are covered by the Eclipse Public
     1.6 +;;  License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) which can
     1.7 +;;  be found in the file epl-v10.html at the root of this distribution.  By
     1.8 +;;  using this software in any fashion, you are agreeing to be bound by the
     1.9 +;;  terms of this license.  You must not remove this notice, or any other,
    1.10 +;;  from this software.
    1.11 +;;
    1.12 +;;  test-database.clj
    1.13 +;;
    1.14 +;;  A Clojure implementation of Datalog -- Database
    1.15 +;;
    1.16 +;;  straszheimjeffrey (gmail)
    1.17 +;;  Created 12 Feburary 2009
    1.18 +
    1.19 +
    1.20 +(ns clojure.contrib.datalog.tests.test-database
    1.21 +  (:use clojure.test
    1.22 +	clojure.contrib.datalog.database))
    1.23 +
    1.24 +
    1.25 +(def test-db
    1.26 +     (make-database
    1.27 +      (relation :fred [:mary :sue])
    1.28 +      (index :fred :mary)
    1.29 +      (relation :sally [:jen :becky :joan])
    1.30 +      (index :sally :jen)
    1.31 +      (index :sally :becky)))
    1.32 +
    1.33 +(deftest test-make-database
    1.34 +  (is (= test-db
    1.35 +         (datalog-database
    1.36 +          {:sally (datalog-relation
    1.37 +                   #{:jen :joan :becky}
    1.38 +                   #{}
    1.39 +                   {:becky {}
    1.40 +                    :jen {}})
    1.41 +           :fred (datalog-relation
    1.42 +                  #{:sue :mary}
    1.43 +                  #{}
    1.44 +                  {:mary {}})}))))
    1.45 +
    1.46 +
    1.47 +(deftest test-ensure-relation
    1.48 +  (is (contains? (ensure-relation test-db :bob [:sam :george] [:sam]) :bob))
    1.49 +  (is (contains? (ensure-relation test-db :fred [:mary :sue] [:mary]) :fred))
    1.50 +  (is (thrown? AssertionError (ensure-relation test-db :fred [:bob :joe] []))))
    1.51 +
    1.52 +(deftest test-add-tuple
    1.53 +  (let [new-db (add-tuple test-db :fred {:mary 1 :sue 2})]
    1.54 +    (is (= (select new-db :fred {:mary 1}) [{:mary 1 :sue 2}])))
    1.55 +  (is (thrown? AssertionError (add-tuple test-db :fred {:mary 1}))))
    1.56 +
    1.57 +(def test-db-1
    1.58 +     (add-tuples test-db
    1.59 +                 [:fred :mary 1 :sue 2]
    1.60 +                 [:fred :mary 2 :sue 3]
    1.61 +                 [:sally :jen 1 :becky 2 :joan 0]
    1.62 +                 [:sally :jen 1 :becky 4 :joan 3]
    1.63 +                 [:sally :jen 1 :becky 3 :joan 0]
    1.64 +                 [:sally :jen 1 :becky 2 :joan 3]
    1.65 +                 [:fred :mary 1 :sue 1]
    1.66 +                 [:fred :mary 3 :sue 1]))
    1.67 +
    1.68 +(deftest test-add-tuples
    1.69 +  (is (= test-db-1
    1.70 +         (datalog-database
    1.71 +          {:sally (datalog-relation
    1.72 +                   #{:jen :joan :becky}
    1.73 +                   #{{:jen 1, :joan 0, :becky 3}
    1.74 +                     {:jen 1, :joan 0, :becky 2}
    1.75 +                     {:jen 1, :joan 3, :becky 2}
    1.76 +                     {:jen 1, :joan 3, :becky 4}}
    1.77 +                   {:becky {3
    1.78 +                            #{{:jen 1, :joan 0, :becky 3}}
    1.79 +                            4
    1.80 +                            #{{:jen 1, :joan 3, :becky 4}}
    1.81 +                            2
    1.82 +                            #{{:jen 1, :joan 0, :becky 2}
    1.83 +                              {:jen 1, :joan 3, :becky 2}}}
    1.84 +                    :jen {1
    1.85 +                          #{{:jen 1, :joan 0, :becky 3}
    1.86 +                            {:jen 1, :joan 0, :becky 2}
    1.87 +                            {:jen 1, :joan 3, :becky 2}
    1.88 +                            {:jen 1, :joan 3, :becky 4}}}})
    1.89 +           :fred (datalog-relation
    1.90 +                  #{:sue :mary}
    1.91 +                  #{{:sue 2, :mary 1}
    1.92 +                    {:sue 1, :mary 1}
    1.93 +                    {:sue 3, :mary 2}
    1.94 +                    {:sue 1, :mary 3}}
    1.95 +                  {:mary {3
    1.96 +                          #{{:sue 1, :mary 3}}
    1.97 +                          2
    1.98 +                          #{{:sue 3, :mary 2}}
    1.99 +                          1
   1.100 +                          #{{:sue 2, :mary 1}
   1.101 +                            {:sue 1, :mary 1}}}})}))))
   1.102 +
   1.103 +(deftest test-remove-tuples
   1.104 +  (let [db (reduce #(apply remove-tuple %1 (first %2) (next %2))
   1.105 +                   test-db-1
   1.106 +                   [[:fred {:mary 1 :sue 1}]
   1.107 +                    [:fred {:mary 3 :sue 1}]
   1.108 +                    [:sally {:jen 1 :becky 2 :joan 0}]
   1.109 +                    [:sally {:jen 1 :becky 4 :joan 3}]])]
   1.110 +    (is (= db
   1.111 +           (datalog-database
   1.112 +            {:sally (datalog-relation
   1.113 +                     #{:jen :joan :becky}
   1.114 +                     #{{:jen 1, :joan 0, :becky 3}
   1.115 +                       {:jen 1, :joan 3, :becky 2}}
   1.116 +                     {:becky
   1.117 +                      {3
   1.118 +                       #{{:jen 1, :joan 0, :becky 3}}
   1.119 +                       2
   1.120 +                       #{{:jen 1, :joan 3, :becky 2}}}
   1.121 +                      :jen
   1.122 +                      {1
   1.123 +                       #{{:jen 1, :joan 0, :becky 3}
   1.124 +                         {:jen 1, :joan 3, :becky 2}}}})
   1.125 +             :fred (datalog-relation
   1.126 +                    #{:sue :mary}
   1.127 +                    #{{:sue 2, :mary 1}
   1.128 +                      {:sue 3, :mary 2}}
   1.129 +                    {:mary
   1.130 +                     {2
   1.131 +                      #{{:sue 3, :mary 2}}
   1.132 +                      1
   1.133 +                      #{{:sue 2, :mary 1}}}})})))))
   1.134 +
   1.135 +
   1.136 +
   1.137 +(deftest test-select
   1.138 +  (is (= (set (select test-db-1 :sally {:jen 1 :becky 2}))
   1.139 +         #{{:jen 1 :joan 0 :becky 2} {:jen 1 :joan 3 :becky 2}}))
   1.140 +  (is (= (set (select test-db-1 :fred {:sue 1})))
   1.141 +      #{{:mary 3 :sue 1} {:mary 1 :sue 1}})
   1.142 +  (is (empty? (select test-db-1 :sally {:joan 5 :jen 1}))))
   1.143 +         
   1.144 +(deftest test-any-match?
   1.145 +  (is (any-match? test-db-1 :fred {:mary 3}))
   1.146 +  (is (any-match? test-db-1 :sally {:jen 1 :becky 2 :joan 3}))
   1.147 +  (is (not (any-match? test-db-1 :sally {:jen 5})))
   1.148 +  (is (not (any-match? test-db-1 :fred {:mary 1 :sue 5}))))
   1.149 +
   1.150 +
   1.151 +(comment
   1.152 +  (run-tests)
   1.153 +)
   1.154 +
   1.155 +;; End of file
   1.156 +