Additional test case. Somewhat confusing situation. Potential TODO

This commit is contained in:
Tony Garnock-Jones 2016-03-10 12:20:38 +00:00
parent 23c482bb3e
commit 226e909f2a
1 changed files with 22 additions and 1 deletions

View File

@ -1019,7 +1019,7 @@
['() (void)]
[(list* message expectedstr rest)
(define actualset (trie-lookup trie message (tset)))
(printf "~v ==> ~v\n" message actualset)
(printf "~v ==> ~v\n" message (tset->list actualset))
(check-equal? actualset
(apply tset (map (lambda (c) (string->symbol (string c)))
(string->list expectedstr))))
@ -1031,6 +1031,27 @@
'foo ""
(list (list 'z (list 'z))) "")
(let ((t (trie-subtract (pattern->trie SA ?) (pattern->trie SA (list 'a)))))
;; I expected this test to fail, because of the way (get) in
;; (trie-lookup) returns #f when there is no entry in the treap.
;; The choice of #f as sentinel for "no entry" is potentially
;; problematic, since it also means "empty trie". However, things
;; work out for us because we have the EOS step that saves us!
;; This means that when '(a) is presented as a value, at 'a it
;; steps to the trie EOS->empty, and then when it steps through
;; the EOS it retrieves #f (empty), mistakes it for a sentinel,
;; retrieves the wildcard entry, which is also #f, and thus by
;; coincidence does the right thing.
;;
;; TODO: probably the right thing to do is change (get) to return
;; e.g. 'missing -- anything not in the domain of tries -- so it
;; is unambiguous when a lookup fails.
(check-matches t
'b "A"
'a "A"
(list 'b) "A"
(list 'a) ""))
(define (pretty-print-trie* m)
(newline)
(pretty-print-trie m)