#lang racket/base
(require racket/port
rackunit
"../ssax/SXML-tree-trans.rkt")
(provide sxml-tree-trans-tests)
(define sxml-tree-trans-tests
(test-suite "SXML-tree-trans"
(let* ((tree
'(root (n1 (n11) "s12" (n13))
"s2"
(n2 (n21) "s22")
(n3
(n31 (n311))
"s32"
(n33 (n331) "s332" (n333))
"s34")))
(test
(lambda (pred-begin pred-end expected)
(let ((computed
(car (replace-range pred-begin pred-end (list tree)))))
(check-equal? computed expected)))))
(test-case "Remove one node, s2"
(test
(lambda (node)
(and (equal? node "s2") '()))
(lambda (node) (list node))
'(root (n1 (n11) "s12" (n13))
(n2 (n21) "s22")
(n3 (n31 (n311)) "s32" (n33 (n331) "s332" (n333)) "s34"))))
(test-case "Replace one node, s2 with s2-new"
(test
(lambda (node)
(and (equal? node "s2") '("s2-new")))
(lambda (node) (list node))
'(root (n1 (n11) "s12" (n13))
"s2-new"
(n2 (n21) "s22")
(n3 (n31 (n311)) "s32" (n33 (n331) "s332" (n333)) "s34"))))
(test-case "Replace one node, s2 with s2-new and its brother (n-new s)"
(test
(lambda (node)
(and (equal? node "s2") '("s2-new" (n-new "s"))))
(lambda (node) (list node))
'(root (n1 (n11) "s12" (n13))
"s2-new" (n-new "s")
(n2 (n21) "s22")
(n3 (n31 (n311)) "s32" (n33 (n331) "s332" (n333)) "s34"))))
(test-case "Remove everything from s2 onward"
(test
(lambda (node)
(and (equal? node "s2") '()))
(lambda (node) #f)
'(root (n1 (n11) "s12" (n13)))))
(test-case "Remove everything from n1 onward"
(test
(lambda (node)
(and (pair? node) (eq? 'n1 (car node)) '()))
(lambda (node) #f)
'(root)))
(test-case "Replace from n1 through n33"
(test
(lambda (node)
(and (pair? node)
(eq? 'n1 (car node))
(list node '(n1* "s12*"))))
(lambda (node)
(and (pair? node)
(eq? 'n33 (car node))
(list node)))
'(root
(n1 (n11) "s12" (n13))
(n1* "s12*")
(n3
(n33 (n331) "s332" (n333))
"s34"))))
)))