+(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 '=)))