aboutsummaryrefslogtreecommitdiff
path: root/test/union-find.lisp
blob: 4bfa61d9f4f1532e2c4b8e34e9e59c06cef06aa9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
(in-package :com.lisp-algo.test)


;;; Utils
(defun get-row (array &optional (row-id 0))
  (let* ((row-size (array-dimension array 1)) ; Deduce row size from array
         (row (make-array row-size :fill-pointer 0))) ; Initialize a new vector (which will contain the row row-id from array)
    ;; Fill row with the right values of array
    (do ((cur-id 0 (+ cur-id 1)))
        ((>= cur-id row-size) row)
      (vector-push (row-major-aref array (+ cur-id (* row-size row-id ))) row))))


;;; Test create network
(define-test create-network-test ()
  ;; ----- Length tests
  (dotimes (nw-size 1000)
    (assert-equal nw-size (length (qf-create-network nw-size))) ; Quick-Find
    (assert-equal nw-size (length (qu-create-network nw-size))) ; Quick-Union
    ;; Weighted-Quick-Union
    (assert-equal 10 (length (get-row (wqu-create-network 10) 0)))
    (assert-equal 10 (length (get-row (wqu-create-network 10) 1)))
    ;; Weighted-Quick-Union with Path Compression
    (assert-equal 10 (length (get-row (wqupc-create-network 10) 0)))
    (assert-equal 10 (length (get-row (wqupc-create-network 10) 1))))
  ;; ----- Value tests
  (assert-equalp #(0 1 2 3 4) (qf-create-network 5)) ; Quick-Find
  (assert-equalp #(0 1 2 3 4) (qu-create-network 5)) ; Quick-Union
  ;; Weighted-Quick-Union
  (assert-true (equalp #(0 1 2 3 4 5 6 7 8 9) (get-row (wqu-create-network 10) 0)))
  (assert-true (equalp (make-array 10 :initial-element 1) (get-row (wqu-create-network 10) 1)))
  ;; Weighted-Quick-Union with Path Compression
  (assert-true (equalp #(0 1 2 3 4 5 6 7 8 9) (get-row (wqupc-create-network 10) 0)))
  (assert-true (equalp (make-array 10 :initial-element 1) (get-row (wqupc-create-network 10) 1))))


;; (define-test test-union_
;;     (let ((nw (create-network 10)))
;;       (setf nw (union_ nw 1 2))
;;       (setf nw (union_ nw 0 5))
;;       (assert-equal (aref nw 1) (aref nw 2))
;;       (assert-equal (aref nw 0) (aref nw 5))
;;       (assert-false (equal (aref nw 0) (aref nw 8)))
;;       (assert-false (equal (aref nw 0) (aref nw 2)))))

;; (define-test test-connected
;;     (let ((nw (create-network 10)))
;;       (setf nw (union_ nw 1 2))
;;       (setf nw (union_ nw 0 5))
;;       (assert-true (connected nw 1 2))
;;       (assert-true (connected nw 0 5))
;;       (assert-false (connected nw 0 8))
;;       (assert-false (connected nw 0 2))))

;; (define-test test-nunion__
;;     (let ((nw (create-network 10)))
;;       (nunion_ nw 1 2)
;;       (nunion_ nw 0 5)
;;       (assert-equal (aref nw 1) (aref nw 2))
;;       (assert-equal (aref nw 0) (aref nw 5))
;;       (assert-false (equal (aref nw 0) (aref nw 8)))
;;       (assert-false (equal (aref nw 0) (aref nw 2)))))

;; ;; Run all tests
;; (setq *print-summary* t) ; Details tests locations when running tests
;; (run-tests :all)