;;; SPDX-License-Identifier: MIT
;;; SPDX-FileCopyrightText: 2020 Wolfgang Corcoran-Mathe

(define (check-mutators)
  (print-header "Checking mutators...")

  (let ((bvec (bitvector 1 0 1 0)))
    (check
     (bitvector= (begin (bitvector-set! bvec 1 1) bvec)
                 (bitvector 1 1 1 0))
     => #t))
  (let ((bvec (bitvector 1 0 1 0)))
    (check
     (bitvector= (begin (bitvector-set! bvec 0 #f) bvec)
                 (bitvector 0 0 1 0))
     => #t))
  (let ((bvec (bitvector 1 0 1 0)))
    (check
     (bitvector= (begin (bitvector-swap! bvec 0 1) bvec)
                 (bitvector 0 1 1 0))
     => #t))

  ;;; reverse!

  (let ((bvec (bitvector 1 0 1 0)))
    (check
     (bitvector= (begin (bitvector-reverse! bvec) bvec)
                 (bitvector 0 1 0 1))
     => #t))
  (let ((bvec (bitvector 1 0 1 0)))
    (check
     (bitvector= (begin (bitvector-reverse! bvec 2) bvec)
                 (bitvector 1 0 0 1))
     => #t))
  (let ((bvec (bitvector 1 0 1 0)))
    (check
     (bitvector= (begin (bitvector-reverse! bvec 1 3) bvec)
                 (bitvector 1 1 0 0))
     => #t))

  ;;; copy!

  (let ((bvec (bitvector 0 0 0 0)))
    (check
     (bitvector= (begin (bitvector-copy! bvec 0 (bitvector 1 0)) bvec)
                 (bitvector 1 0 0 0))
     => #t))
  (let ((bvec (bitvector 0 0 0 0)))
    (check
     (bitvector= (begin (bitvector-copy! bvec 1 (bitvector 1 1 0) 1) bvec)
                 (bitvector 0 1 0 0))
     => #t))
  (let ((bvec (bitvector 0 0 0 0)))
    (check
     (bitvector= (begin (bitvector-copy! bvec 1 (bitvector 1 0 1) 0 2) bvec)
                 (bitvector 0 1 0 0))
     => #t))

  ;;; reverse-copy!

  (let ((bvec (bitvector 0 0 0 0)))
    (check
     (bitvector= (begin (bitvector-reverse-copy! bvec 0 (bitvector 1 0))
                        bvec)
                 (bitvector 0 1 0 0))
     => #t))
  (let ((bvec (bitvector 0 0 0 0)))
    (check
     (bitvector= (begin (bitvector-reverse-copy! bvec 1 (bitvector 0 0 1) 1)
                        bvec)
                 (bitvector 0 1 0 0))
     => #t))
  (let ((bvec (bitvector 0 0 0 0)))
    (check
     (bitvector= (begin (bitvector-reverse-copy! bvec 1 (bitvector 0 1 1) 0 2)
                        bvec)
                 (bitvector 0 1 0 0))
     => #t))
)
