#|
 | Copyright (c) 2016 John Cowan
 | Copyright (c) 2017 Koz Ross 
 |
 | Permission is hereby granted, free of charge, to any person obtaining a copy of
 | this software and associated documentation files (the "Software"), to deal in
 | the Software without restriction, including without limitation the rights to
 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 | the Software, and to permit persons to whom the Software is furnished to do so,
 | subject to the following conditions:
 |
 | The above copyright notice and this permission notice shall be included in all
 | copies or substantial portions of the Software.
 |
 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 |#

(import
  (scheme base)
  (srfi 27)
  (scheme cyclone array-list)
  (scheme cyclone test))

(define test-size 2000)

(test-group
  "array-list/basic"
  (define a (make-array-list 10))
  (test 0 (array-list-length a))
  (test-assert (array-list-empty? a))
  (array-list-insert! a 5)
  (test 1 (array-list-length a))
  (test-not (array-list-empty? a))
  (test 5 (array-list-ref a 0))
  (array-list-insert! a 0 12)
  (test 2 (array-list-length a))
  (test-not (array-list-empty? a))
  (test 12 (array-list-ref a 0))
  (test 5 (array-list-ref a 1))
  (array-list-insert! a 1 15)
  (test 3 (array-list-length a))
  (test-not (array-list-empty? a))
  (test 12 (array-list-ref a 0))
  (test 15 (array-list-ref a 1))
  (test 5 (array-list-ref a 2))
  (array-list-set! a 2 45)
  (test 3 (array-list-length a))
  (test-not (array-list-empty? a))
  (test 12 (array-list-ref a 0))
  (test 15 (array-list-ref a 1))
  (test 45 (array-list-ref a 2))
  (array-list-delete! a)
  (test 2 (array-list-length a))
  (test-not (array-list-empty? a))
  (test 12 (array-list-ref a 0))
  (test 15 (array-list-ref a 1))
  (array-list-delete! a 0)
  (test 1 (array-list-length a))
  (test-not (array-list-empty? a))
  (test 15 (array-list-ref a 0)))

(test-group
  "array-list/hammer"
  (define al (make-array-list 16))
  (do
    ((i 0 (+ i 1)))
    ((= i test-size))
    (test i (array-list-length al))
    (array-list-insert! al i)
    (test i (array-list-ref al i)))
  (do
    ((i test-size (- i 1)))
    ((= i 2))
    (let* ((r (random-integer (- (array-list-length al) 2)))
           (x (array-list-ref al r)))
      (test i (array-list-length al))
      (array-list-delete! al r)
      (test-not (= x (array-list-ref al r))))))

(test-exit)