racket/collects/tests/datalog/parse.rkt
2011-06-28 02:01:41 -04:00

55 lines
2.8 KiB
Racket

#lang racket
(require rackunit
datalog/ast
datalog/parse
"util.rkt")
(provide parse-tests)
(define (test-literal-parse str res)
(test-literal str (parse-literal (open-input-string str)) res))
(define (test-clause-parse str res)
(test-clause str (parse-clause (open-input-string str)) res))
(define parse-tests
(test-suite
"parse"
(test-suite
"literal"
(test-literal-parse "parent(john, douglas)"
(make-literal #f 'parent (list (make-constant #f 'john) (make-constant #f 'douglas))))
(test-literal-parse "1 = 2"
(make-literal #f '= (list (make-constant #f '|1|) (make-constant #f '|2|))))
(test-literal-parse "1 != 2"
(make-literal #f '!= (list (make-constant #f '|1|) (make-constant #f '|2|))))
(test-literal-parse "zero-arity-literal"
(make-literal #f 'zero-arity-literal empty))
(test-literal-parse "zero-arity-literal()"
(make-literal #f 'zero-arity-literal empty))
(test-literal-parse "\"=\"(3,3)"
(make-literal #f "=" (list (make-constant #f '|3|) (make-constant #f '|3|))))
(test-literal-parse "\"\"(-0-0-0,&&&,***,\"\00\")"
(make-literal #f "" (list (make-constant #f '-0-0-0)
(make-constant #f '&&&)
(make-constant #f '***)
(make-constant #f "\00")))))
(test-suite
"clause"
(test-clause-parse "parent(john, douglas)"
(make-clause #f (make-literal #f 'parent (list (make-constant #f 'john) (make-constant #f 'douglas))) empty))
(test-clause-parse "ancestor(A, B) :- parent(A, B)"
(make-clause #f (make-literal #f 'ancestor (list (make-variable #f 'A) (make-variable #f 'B)))
(list (make-literal #f 'parent (list (make-variable #f 'A) (make-variable #f 'B))))))
(test-clause-parse "ancestor(A, B) :- parent(A, C), ancestor(C, B)"
(make-clause #f (make-literal #f 'ancestor (list (make-variable #f 'A) (make-variable #f 'B)))
(list (make-literal #f 'parent (list (make-variable #f 'A) (make-variable #f 'C)))
(make-literal #f 'ancestor (list (make-variable #f 'C) (make-variable #f 'B)))))))
(test-suite
"statement"
(test-not-false "assertion" (assertion? (parse-statement (open-input-string "parent(john, douglas)."))))
(test-not-false "retraction" (retraction? (parse-statement (open-input-string "parent(john, douglas)~"))))
(test-not-false "query" (query? (parse-statement (open-input-string "parent(john, douglas)?")))))))