[funds-cvs] r14 - trunk/funds/src/trees/tests
abaine at common-lisp.net
abaine at common-lisp.net
Fri Jun 15 17:57:14 UTC 2007
Author: abaine
Date: Fri Jun 15 13:57:14 2007
New Revision: 14
Modified:
trunk/funds/src/trees/tests/avl-tree-test.lisp
Log:
Wrote unit tests for insert and empty
Modified: trunk/funds/src/trees/tests/avl-tree-test.lisp
==============================================================================
--- trunk/funds/src/trees/tests/avl-tree-test.lisp (original)
+++ trunk/funds/src/trees/tests/avl-tree-test.lisp Fri Jun 15 13:57:14 2007
@@ -4,29 +4,80 @@
(defun random-tree ()
(reduce #'(lambda (tr v)
(avl-insert tr v v))
- (loop for i below 100 collect (random 10000))
+ (loop for i below 20 collect (random 10))
:initial-value (empty-avl-tree)))
-(define-test empty-avl-tree
- (assert-true (avl-empty-p (empty-avl-tree)))
- (assert-equal 0 (avl-height (empty-avl-tree))))
-
+(defmacro assert-avl-valid (tree)
+ `(progn
+ (assert-true (height-correct-p ,tree) ,tree)
+ (assert-true (balanced-p ,tree) ,tree)
+ (assert-true (ordered-p ,tree) ,tree)))
-(define-test avl-insert
- (assert-true (balanced (random-tree))))
+(define-test test-avl-empty-p
+ (assert-true (avl-empty-p (empty-avl-tree)))
+ (assert-avl-valid (empty-avl-tree)))
-(defun balanced (tree)
+(define-test test-avl-insert
+ (let ((tree (random-tree)))
+ (assert-avl-valid tree)))
+
+(defun height-correct-p (tree)
+ "Whether (avl-height tree) returns the correct height of the given
+AVL Tree. The height is correct if (a) the tree is empty and zero
+is returned or (b) each of the following is true:
+ 1. the height of the left sub-tree is correct;
+ 2. the height of the right sub-tree is correct;
+ 3. the height of the given tree is 1 more than the greater
+ of the heights of the left and right sub-trees."
+ (if (avl-empty-p tree)
+ (zerop (avl-height tree))
+ (and (height-correct-p (avl-left tree))
+ (height-correct-p (avl-right tree))
+ (let* ((a (avl-height (avl-left tree)))
+ (b (avl-height (avl-right tree)))
+ (c (if (> a b) a b)))
+ (eql (1+ c) (avl-height tree))))))
+
+(defun balanced-p (tree)
+ "Whether the given AVL Tree is properly balanced. To be balanced,
+the tree must be either (a) empty or (b) have left and right sub-trees
+that differ in height by no more than 1."
(or (avl-empty-p tree)
- (and (balanced (avl-left tree))
- (balanced (avl-right tree))
+ (and (balanced-p (avl-left tree))
+ (balanced-p (avl-right tree))
(< -2 (- (avl-height (avl-left tree))
(avl-height (avl-right tree)))
2))))
-
-(defun root-height-correct (tree)
- (let* ((a (avl-height (avl-left tree)))
- (b (avl-height (avl-right tree)))
- (c (if (> a b) a b)))
- (eql (1+ c) (avl-height tree))))
-
+(defun ordered-p (tree &optional (less-than #'<))
+ "Whether this AVL tree is properly ordered. To be ordered,
+the tree must be either (a) empty or (b) satisfy each of the following
+requirements:
+
+ 1. the left sub-tree is properly ordered;
+ 2. the right sub-tree is properly ordered;
+ 3. every key in the left sub-tree is less than
+ the root key; and
+ 4. every key in the right sub-tree is not less
+ than the root key."
+ (or (avl-empty-p tree)
+ (and (ordered-p (avl-left tree))
+ (ordered-p (avl-right tree))
+ (or (avl-empty-p (avl-left tree))
+ (not (funcall less-than (avl-key tree)
+ (greatest-key (avl-left tree)))))
+ (or (avl-empty-p (avl-right tree))
+ (not (funcall less-than (least-key (avl-right tree))
+ (avl-key tree)))))))
+
+(defun least-key (tree)
+ "The least key in a properly ordered AVL tree."
+ (if (avl-empty-p (avl-left tree))
+ (avl-key tree)
+ (least-key (avl-left tree))))
+
+(defun greatest-key (tree)
+ "The greatest key in a properly ordered AVL tree."
+ (if (avl-empty-p (avl-right tree))
+ (avl-key tree)
+ (greatest-key (avl-right tree))))
More information about the Funds-cvs
mailing list