(in-package metabang.graph) ;;; --------------------------------------------------------------------------- ;;; utilities ;;; --------------------------------------------------------------------------- (defun make-simple-test-graph () (let ((g (make-container 'graph-container))) (loop for v in '(a b c d e) do (add-vertex g v)) (loop for (v1 . v2) in '((a . b) (a . c) (b . d) (c . e)) do (add-edge-between-vertexes g v1 v2)) g)) ;;; --------------------------------------------------------------------------- ;;; tests ;;; --------------------------------------------------------------------------- (deftestsuite test-graph-container () ()) ;;; --------------------------------------------------------------------------- (addtest (test-graph-container) test-simple-copying (let ((g1 (make-simple-test-graph)) (g2 nil)) (setf g2 (copy-top-level g1)) (ensure-same (size g1) (size g2)) (iterate-vertexes g1 (lambda (v) (ensure (find-vertex g2 (value v))))) (iterate-edges g1 (lambda (e) (ensure (find-edge-between-vertexes g2 (value (source-vertex e)) (value (target-vertex e)))))))) ;;; --------------------------------------------------------------------------- ;; fails because find-edge-between-vertexes for graph containers doesn't ;; care about the graph... (addtest (test-graph-container) test-find-edge-between-vertexes (let ((g1 (make-simple-test-graph)) (g2 nil)) (setf g2 (copy-top-level g1)) (ensure (not (find-edge-between-vertexes g2 (find-vertex g1 'a) (find-vertex g1 'b)))))) ;;; --------------------------------------------------------------------------- (addtest (test-graph-container) test-empty! (let ((g1 (make-simple-test-graph))) (empty! g1) (ensure-same (size g1) 0))) ;;; --------------------------------------------------------------------------- ;;; vertex test ;;; --------------------------------------------------------------------------- ;;?? should be in test-graph and work for every graph container type (addtest (test-graph-container) no-vertex-test (let ((g (make-container 'graph-container))) (loop for (src dst) in '((a b) (a c) (c d) (a d) (d e) (e f) (b f)) do (add-edge-between-vertexes g (list src) (list dst))) (ensure-same (size g) 14 :test '=))) (addtest (test-graph-container) vertex-test (let ((g (make-container 'graph-container :vertex-test #'equal))) (loop for (src dst) in '((a b) (a c) (c d) (a d) (d e) (e f) (b f)) do (add-edge-between-vertexes g (list src) (list dst))) (ensure-same (size g) 6 :test '=)))