179 lines
4.5 KiB
Scheme
179 lines
4.5 KiB
Scheme
(load-relative "../mzscheme/loadtest.ss")
|
|
(require (lib "class.ss")
|
|
(lib "token-tree.ss" "syntax-color"))
|
|
|
|
(define t (new token-tree% (length 1) (data 'a)))
|
|
|
|
(define (check-only-root)
|
|
(test #f 'get-root (not (send t get-root)))
|
|
(test #f node-left (send t get-root))
|
|
(test #f node-right (send t get-root)))
|
|
|
|
(define (check-root len dat sp ep)
|
|
(test len 'get-root-length (send t get-root-length))
|
|
(test dat 'get-root-data (send t get-root-data))
|
|
(test sp 'get-root-start-position (send t get-root-start-position))
|
|
(test ep 'get-root-end-position (send t get-root-end-position)))
|
|
|
|
(SECTION 'init-tree)
|
|
(test #f 'is-empty (send t is-empty?))
|
|
(check-only-root)
|
|
(check-root 1 'a 0 1)
|
|
|
|
(send t reset-tree)
|
|
(SECTION 'empty-tree)
|
|
(test #f 'get-root (send t get-root))
|
|
(test #t 'is-empty (send t is-empty?))
|
|
(check-root 0 #f 0 0)
|
|
|
|
(define (build-tree n len?)
|
|
(when (> n 0)
|
|
(insert-first! t (new token-tree% (length (if len? 5 n)) (data (list n 1))))
|
|
(insert-last! t (new token-tree% (length (if len? 5 n)) (data (list n 2))))
|
|
(build-tree (sub1 n) len?)))
|
|
(define (check-tree n)
|
|
(let ((tot-len (* n 10)))
|
|
(let loop ((i 0))
|
|
(when (< i n)
|
|
(let* ((x (* i 5))
|
|
(y (- tot-len x 5)))
|
|
(send t search! x)
|
|
(check-root 5 (list (add1 i) 1) x (+ 5 x))
|
|
(send t search! y)
|
|
(check-root 5 (list (add1 i) 2) y (+ 5 y)))
|
|
(loop (add1 i))))))
|
|
|
|
|
|
(build-tree 4 #t)
|
|
(SECTION 'check-tree)
|
|
(check-tree 4)
|
|
(send t search-min!)
|
|
(check-root 5 '(1 1) 0 5)
|
|
(send t search-max!)
|
|
(check-root 5 '(1 2) 35 40)
|
|
|
|
(SECTION 'remove-root)
|
|
(send t search! 20)
|
|
(send t remove-root!)
|
|
(send t search-max!)
|
|
(check-root 5 '(1 2) 30 35)
|
|
|
|
(SECTION 'add-to-root-length)
|
|
(send t search-min!)
|
|
(send t add-to-root-length 1)
|
|
(check-root 6 '(1 1) 0 6)
|
|
(send t search! 15)
|
|
(check-root 5 '(3 1) 11 16)
|
|
(send t search-max!)
|
|
(check-root 5 '(1 2) 31 36)
|
|
|
|
(SECTION 'for-each)
|
|
(send t reset-tree)
|
|
(build-tree 4 #f)
|
|
(let loop ((i 0))
|
|
(when (< i 1000)
|
|
(send t search! (random 20))
|
|
(loop (add1 i))))
|
|
(define (to-list t)
|
|
(let ((x null))
|
|
(send t for-each (lambda (start len data) (set! x (cons (list start len data) x))))
|
|
(reverse x)))
|
|
(test '((0 1 (1 1))
|
|
(1 2 (2 1))
|
|
(3 3 (3 1))
|
|
(6 4 (4 1))
|
|
(10 4 (4 2))
|
|
(14 3 (3 2))
|
|
(17 2 (2 2))
|
|
(19 1 (1 2)))
|
|
'for-each (to-list t))
|
|
|
|
(SECTION 'stress)
|
|
(send t reset-tree)
|
|
(build-tree 100 #f)
|
|
(let loop ((i 0))
|
|
(when (< i 10000)
|
|
(send t search! (random 10100))
|
|
(loop (add1 i))))
|
|
(send t search-max!)
|
|
(check-root 1 '(1 2) 10099 10100)
|
|
|
|
(SECTION 'splits)
|
|
(send t reset-tree)
|
|
(build-tree 5 #f)
|
|
(let-values (((s e t1 t2)
|
|
(send t split 16)))
|
|
(test 15 'split s)
|
|
(test 20 'split e)
|
|
(test '((0 1 (1 1))
|
|
(1 2 (2 1))
|
|
(3 3 (3 1))
|
|
(6 4 (4 1))
|
|
(10 5 (5 1)))
|
|
'split (to-list t1))
|
|
(test '((0 4 (4 2))
|
|
(4 3 (3 2))
|
|
(7 2 (2 2))
|
|
(9 1 (1 2)))
|
|
'split (to-list t2)))
|
|
(build-tree 5 #f)
|
|
(let-values (((s e t1 t2)
|
|
(send t split 15)))
|
|
(test 10 'split s)
|
|
(test 20 'split e)
|
|
(test '((0 1 (1 1))
|
|
(1 2 (2 1))
|
|
(3 3 (3 1))
|
|
(6 4 (4 1)))
|
|
'split (to-list t1))
|
|
(test '((0 4 (4 2))
|
|
(4 3 (3 2))
|
|
(7 2 (2 2))
|
|
(9 1 (1 2)))
|
|
'split (to-list t2)))
|
|
(send t reset-tree)
|
|
(build-tree 5 #f)
|
|
(send t search! 15)
|
|
(let-values (((t1 t2) (send t split-after)))
|
|
(test '((0 1 (1 1))
|
|
(1 2 (2 1))
|
|
(3 3 (3 1))
|
|
(6 4 (4 1))
|
|
(10 5 (5 1))
|
|
(15 5 (5 2)))
|
|
'split-after (to-list t1))
|
|
(test '((0 4 (4 2))
|
|
(4 3 (3 2))
|
|
(7 2 (2 2))
|
|
(9 1 (1 2)))
|
|
'split-after (to-list t2)))
|
|
(send t reset-tree)
|
|
(build-tree 5 #f)
|
|
(send t search! 15)
|
|
(let-values (((t1 t2) (send t split-before)))
|
|
(test '((0 1 (1 1))
|
|
(1 2 (2 1))
|
|
(3 3 (3 1))
|
|
(6 4 (4 1))
|
|
(10 5 (5 1)))
|
|
'split-before (to-list t1))
|
|
(test '((0 5 (5 2))
|
|
(5 4 (4 2))
|
|
(9 3 (3 2))
|
|
(12 2 (2 2))
|
|
(14 1 (1 2)))
|
|
'split-before (to-list t2)))
|
|
|
|
(send t reset-tree)
|
|
(insert-last! t (new token-tree% (length 1) (data 1)))
|
|
(insert-last! t (new token-tree% (length 1) (data 2)))
|
|
(insert-last! t (new token-tree% (length 1) (data 3)))
|
|
(test '((0 1 1) (1 1 2) (2 1 3)) 'insert-last (to-list t))
|
|
(let-values (((s e t1 t2) (send t split 2)))
|
|
(test 1 'split s)
|
|
(test 3 'split e)
|
|
(test '((0 1 1)) 'split (to-list t1))
|
|
(test '() 'split (to-list t2)))
|
|
|
|
(report-errs)
|