check.scm 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. ;;; Little test harness, 'cause I'm paraoid about tricky code.
  2. ;;; This code is
  3. ;;; Copyright (c) 1998 by Olin Shivers.
  4. ;;; The terms are: You may do as you please with this code, as long as
  5. ;;; you do not delete this notice or hold me responsible for any outcome
  6. ;;; related to its use.
  7. ;;;
  8. ;;; Blah blah blah. Don't you think source files should contain more lines
  9. ;;; of code than copyright notice?
  10. (define-test-suite sort-tests)
  11. ;; Three-way comparison for numbers
  12. (define (my-c x y)
  13. (cond ((= x y) 0)
  14. ((< x y) -1)
  15. (else 1)))
  16. ;;; For testing stable sort -- 3 & -3 compare the same.
  17. (define (my< x y) (< (abs x) (abs y)))
  18. (define (unstable-sort-test v) ; quick & heap vs simple insert
  19. (let ((v1 (vector-copy v))
  20. (v2 (vector-copy v))
  21. (v3 (vector-copy v))
  22. (v4 (vector-copy v)))
  23. (vector-heap-sort! < v1)
  24. (vector-insert-sort! < v2)
  25. (vector-quick-sort! < v3)
  26. (vector-quick-sort3! my-c v4)
  27. (check-that v2 (is v1))
  28. (check-that v3 (is v1))
  29. (check-that v4 (is v1))
  30. (check-that v1 (is (lambda (v) (vector-sorted? < v))))))
  31. (define (stable-sort-test v) ; insert, list & vector merge sorts
  32. (let ((v1 (vector-copy v))
  33. (v2 (vector-copy v))
  34. (v3 (list->vector (list-merge-sort! my< (vector->list v))))
  35. (v4 (list->vector (list-merge-sort my< (vector->list v)))))
  36. (vector-merge-sort! my< v1)
  37. (vector-insert-sort! my< v2)
  38. (check-that v1 (is (lambda (v) (vector-sorted? my< v))))
  39. (check-that v2 (is v1))
  40. (check-that v3 (is v1))
  41. (check-that v4 (is v1))))
  42. (define (run-sort-test sort-test count max-size)
  43. (let loop ((i 0))
  44. (if (< i count)
  45. (begin
  46. (sort-test (random-vector (random-integer max-size)))
  47. (loop (+ 1 i))))))
  48. (define-test-case stable-sort sort-tests
  49. (run-sort-test stable-sort-test 10 4096))
  50. (define-test-case unstable-sort sort-tests
  51. (run-sort-test unstable-sort-test 10 4096))
  52. (define (random-vector size)
  53. (let ((v (make-vector size)))
  54. (fill-vector-randomly! v (* 10 size))
  55. v))
  56. (define (fill-vector-randomly! v range)
  57. (let ((half (quotient range 2)))
  58. (do ((i (- (vector-length v) 1) (- i 1)))
  59. ((< i 0))
  60. (vector-set! v i (- (random-integer range) half)))))
  61. (define (vector-portion-copy vec start end)
  62. (let* ((len (vector-length vec))
  63. (new-len (- end start))
  64. (new (make-vector new-len)))
  65. (do ((i start (+ i 1))
  66. (j 0 (+ j 1)))
  67. ((= i end) new)
  68. (vector-set! new j (vector-ref vec i)))))
  69. (define (vector-copy vec)
  70. (vector-portion-copy vec 0 (vector-length vec)))