rlm@10: ;; Copyright (c) Jeffrey Straszheim. All rights reserved. The use and rlm@10: ;; distribution terms for this software are covered by the Eclipse Public rlm@10: ;; License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) which can rlm@10: ;; be found in the file epl-v10.html at the root of this distribution. By rlm@10: ;; using this software in any fashion, you are agreeing to be bound by the rlm@10: ;; terms of this license. You must not remove this notice, or any other, rlm@10: ;; from this software. rlm@10: ;; rlm@10: ;; test-database.clj rlm@10: ;; rlm@10: ;; A Clojure implementation of Datalog -- Database rlm@10: ;; rlm@10: ;; straszheimjeffrey (gmail) rlm@10: ;; Created 12 Feburary 2009 rlm@10: rlm@10: rlm@10: (ns clojure.contrib.datalog.tests.test-database rlm@10: (:use clojure.test rlm@10: clojure.contrib.datalog.database)) rlm@10: rlm@10: rlm@10: (def test-db rlm@10: (make-database rlm@10: (relation :fred [:mary :sue]) rlm@10: (index :fred :mary) rlm@10: (relation :sally [:jen :becky :joan]) rlm@10: (index :sally :jen) rlm@10: (index :sally :becky))) rlm@10: rlm@10: (deftest test-make-database rlm@10: (is (= test-db rlm@10: (datalog-database rlm@10: {:sally (datalog-relation rlm@10: #{:jen :joan :becky} rlm@10: #{} rlm@10: {:becky {} rlm@10: :jen {}}) rlm@10: :fred (datalog-relation rlm@10: #{:sue :mary} rlm@10: #{} rlm@10: {:mary {}})})))) rlm@10: rlm@10: rlm@10: (deftest test-ensure-relation rlm@10: (is (contains? (ensure-relation test-db :bob [:sam :george] [:sam]) :bob)) rlm@10: (is (contains? (ensure-relation test-db :fred [:mary :sue] [:mary]) :fred)) rlm@10: (is (thrown? AssertionError (ensure-relation test-db :fred [:bob :joe] [])))) rlm@10: rlm@10: (deftest test-add-tuple rlm@10: (let [new-db (add-tuple test-db :fred {:mary 1 :sue 2})] rlm@10: (is (= (select new-db :fred {:mary 1}) [{:mary 1 :sue 2}]))) rlm@10: (is (thrown? AssertionError (add-tuple test-db :fred {:mary 1})))) rlm@10: rlm@10: (def test-db-1 rlm@10: (add-tuples test-db rlm@10: [:fred :mary 1 :sue 2] rlm@10: [:fred :mary 2 :sue 3] rlm@10: [:sally :jen 1 :becky 2 :joan 0] rlm@10: [:sally :jen 1 :becky 4 :joan 3] rlm@10: [:sally :jen 1 :becky 3 :joan 0] rlm@10: [:sally :jen 1 :becky 2 :joan 3] rlm@10: [:fred :mary 1 :sue 1] rlm@10: [:fred :mary 3 :sue 1])) rlm@10: rlm@10: (deftest test-add-tuples rlm@10: (is (= test-db-1 rlm@10: (datalog-database rlm@10: {:sally (datalog-relation rlm@10: #{:jen :joan :becky} rlm@10: #{{:jen 1, :joan 0, :becky 3} rlm@10: {:jen 1, :joan 0, :becky 2} rlm@10: {:jen 1, :joan 3, :becky 2} rlm@10: {:jen 1, :joan 3, :becky 4}} rlm@10: {:becky {3 rlm@10: #{{:jen 1, :joan 0, :becky 3}} rlm@10: 4 rlm@10: #{{:jen 1, :joan 3, :becky 4}} rlm@10: 2 rlm@10: #{{:jen 1, :joan 0, :becky 2} rlm@10: {:jen 1, :joan 3, :becky 2}}} rlm@10: :jen {1 rlm@10: #{{:jen 1, :joan 0, :becky 3} rlm@10: {:jen 1, :joan 0, :becky 2} rlm@10: {:jen 1, :joan 3, :becky 2} rlm@10: {:jen 1, :joan 3, :becky 4}}}}) rlm@10: :fred (datalog-relation rlm@10: #{:sue :mary} rlm@10: #{{:sue 2, :mary 1} rlm@10: {:sue 1, :mary 1} rlm@10: {:sue 3, :mary 2} rlm@10: {:sue 1, :mary 3}} rlm@10: {:mary {3 rlm@10: #{{:sue 1, :mary 3}} rlm@10: 2 rlm@10: #{{:sue 3, :mary 2}} rlm@10: 1 rlm@10: #{{:sue 2, :mary 1} rlm@10: {:sue 1, :mary 1}}}})})))) rlm@10: rlm@10: (deftest test-remove-tuples rlm@10: (let [db (reduce #(apply remove-tuple %1 (first %2) (next %2)) rlm@10: test-db-1 rlm@10: [[:fred {:mary 1 :sue 1}] rlm@10: [:fred {:mary 3 :sue 1}] rlm@10: [:sally {:jen 1 :becky 2 :joan 0}] rlm@10: [:sally {:jen 1 :becky 4 :joan 3}]])] rlm@10: (is (= db rlm@10: (datalog-database rlm@10: {:sally (datalog-relation rlm@10: #{:jen :joan :becky} rlm@10: #{{:jen 1, :joan 0, :becky 3} rlm@10: {:jen 1, :joan 3, :becky 2}} rlm@10: {:becky rlm@10: {3 rlm@10: #{{:jen 1, :joan 0, :becky 3}} rlm@10: 2 rlm@10: #{{:jen 1, :joan 3, :becky 2}}} rlm@10: :jen rlm@10: {1 rlm@10: #{{:jen 1, :joan 0, :becky 3} rlm@10: {:jen 1, :joan 3, :becky 2}}}}) rlm@10: :fred (datalog-relation rlm@10: #{:sue :mary} rlm@10: #{{:sue 2, :mary 1} rlm@10: {:sue 3, :mary 2}} rlm@10: {:mary rlm@10: {2 rlm@10: #{{:sue 3, :mary 2}} rlm@10: 1 rlm@10: #{{:sue 2, :mary 1}}}})}))))) rlm@10: rlm@10: rlm@10: rlm@10: (deftest test-select rlm@10: (is (= (set (select test-db-1 :sally {:jen 1 :becky 2})) rlm@10: #{{:jen 1 :joan 0 :becky 2} {:jen 1 :joan 3 :becky 2}})) rlm@10: (is (= (set (select test-db-1 :fred {:sue 1}))) rlm@10: #{{:mary 3 :sue 1} {:mary 1 :sue 1}}) rlm@10: (is (empty? (select test-db-1 :sally {:joan 5 :jen 1})))) rlm@10: rlm@10: (deftest test-any-match? rlm@10: (is (any-match? test-db-1 :fred {:mary 3})) rlm@10: (is (any-match? test-db-1 :sally {:jen 1 :becky 2 :joan 3})) rlm@10: (is (not (any-match? test-db-1 :sally {:jen 5}))) rlm@10: (is (not (any-match? test-db-1 :fred {:mary 1 :sue 5})))) rlm@10: rlm@10: rlm@10: (comment rlm@10: (run-tests) rlm@10: ) rlm@10: rlm@10: ;; End of file rlm@10: