summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--tests/Makefile.am4
-rw-r--r--tests/resolve.test131
2 files changed, 133 insertions, 2 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 913e871..bd4349f 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,8 +1,8 @@
 TESTS_ENVIRONMENT =							\
   $(GUILE) -L $(top_srcdir)/src/guile -L $(top_builddir)/src/guile
 
-TESTS = ast.test readers/rss-2.test
+TESTS = ast.test readers/rss-2.test resolve.test
 
 EXTRA_DIST = $(TESTS)
 
-CLEANFILES = ast.log rss-2.log
+CLEANFILES = ast.log resolve.log rss-2.log
diff --git a/tests/resolve.test b/tests/resolve.test
new file mode 100644
index 0000000..0e29614
--- /dev/null
+++ b/tests/resolve.test
@@ -0,0 +1,131 @@
+;;; Excercise the `resolve' routines.                  -*- Scheme -*-
+;;;
+;;; Copyright (C) 2009  Ludovic Courtès <ludo@gnu.org>
+;;;
+;;; This file is part of Skribilo.
+;;;
+;;; Skribilo is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU Lesser General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; Skribilo is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public License
+;;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (tests resolve)
+  :use-module (skribilo ast)
+  :use-module (skribilo engine)
+  :use-module (skribilo resolve)
+  :use-module (skribilo package base)
+  :use-module (srfi srfi-64))
+
+(define %engine
+  (find-engine 'base))
+
+
+(test-begin "resolve")
+
+(test-assert "parents"
+  (let* ((doc (document #:title "Doc"
+                (chapter #:title "C"
+                  (section #:title "S"
+                    (p "par")))))
+         (ch  (car (markup-body doc)))
+         (sec (car (markup-body ch)))
+         (par (car (markup-body sec))))
+    (and (is-markup? ch 'chapter)
+         (eq? (ast-parent ch) 'unspecified)
+         (begin
+           (resolve! doc %engine '())
+           (and (eq? (ast-parent ch) doc)
+                (eq? (ast-parent sec) ch)
+                (eq? (ast-parent par) sec))))))
+
+(test-assert "unresolved node in body"
+  (let* ((resolved? #f)
+         (doc (document #:title "Doc"
+                (resolve (lambda (n e env)
+                           (set! resolved? #t))))))
+    (and (not resolved?)
+         (begin
+           (resolve! doc %engine '())
+           resolved?))))
+
+(test-assert "unresolved node in unresolved node in body"
+  (let* ((resolved? #f)
+         (doc (document #:title "Doc"
+                (resolve (lambda (n e env)
+                           (resolve (lambda (n e env)
+                                      (set! resolved? #t))))))))
+    (and (not resolved?)
+         (begin
+           (resolve! doc %engine '())
+           resolved?))))
+
+(test-assert "unresolved node in options"
+  (let* ((resolved? #f)
+         (doc (document #:title
+                (resolve (lambda (n e env)
+                           (set! resolved? #t)))
+                "body...")))
+    (and (not resolved?)
+         (begin
+           (resolve! doc %engine '())
+           resolved?))))
+
+(test-assert "unresolved node in processor body"
+  (let* ((resolved? #f)
+         (doc (document #:title
+                (processor #:combinator (lambda (e1 e2) e1)
+                           (resolve (lambda (n e env)
+                                      (set! resolved? #t)))))))
+    (and (not resolved?)
+         (begin
+           (resolve! doc %engine '())
+           resolved?))))
+
+(test-assert "unresolved node product has a parent"
+  (let* ((doc (document #:title "Doc"
+                (resolve (lambda (n e env)
+                           (chapter #:title "C"))))))
+    (resolve! doc %engine '())
+
+    (let ((ch (car (markup-body doc))))
+      (and (is-markup? ch 'chapter)
+           (eq? (ast-parent ch) doc)))))
+
+(test-assert "node bindings"
+  (let* ((doc (document #:title "Doc"
+                (chapter #:title "C" #:ident "c"
+                  (section #:title "S" #:ident "s"))))
+         (ch  (car (markup-body doc)))
+         (sec (car (markup-body ch))))
+    (and (not (document-lookup-node doc "c"))
+         (not (document-lookup-node doc "s"))
+         (begin
+           (resolve! doc %engine '())
+           (and (eq? (document-lookup-node doc "c") ch)
+                (eq? (document-lookup-node doc "s") sec))))))
+
+(test-assert "unresolved node bindings"
+  ;; Make sure nodes returned by `unresolved' nodes are eventually bound.
+  (let* ((doc (document #:title "Doc"
+                (resolve (lambda (n e env)
+                           (chapter #:title "C" #:ident "c"
+                             (section #:title "S" #:ident "s")))))))
+    (and (not (document-lookup-node doc "c"))
+         (not (document-lookup-node doc "s"))
+         (begin
+           (resolve! doc %engine '())
+           (and (is-markup? (document-lookup-node doc "c") 'chapter)
+                (is-markup? (document-lookup-node doc "s") 'section))))))
+
+(test-end "resolve")
+
+
+(exit (= (test-runner-fail-count (test-runner-current)) 0))