(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)