;-*- Mode:     Lisp -*-
;;;; Author:   Paul Dietz
;;;; Created:  Sun Apr 20 07:38:18 2003
;;;; Contains: Tests of REMF





(deftest remf.1
  (let ((x nil))
    (values (remf x 'a) x))
  nil ())

(deftest remf.2
  (let ((x (list 'a 'b)))
    (values (not (null (remf x 'a))) x))
  t ())

(deftest remf.3
  (let ((x (list 'a 'b 'a 'c)))
    (values (not (null (remf x 'a))) x))
  t (a c))

(deftest remf.4
  (let ((x (list 'a 'b 'c 'd)))
    (values
     (and (remf x 'c) t)
     (loop
      for ptr on x by #'cddr count
      (not (eqt (car ptr) 'a)))))
  t 0)

;;; Test that explicit calls to macroexpand in subforms
;;; are done in the correct environment

(deftest remf.5
  (macrolet
   ((%m (z) z))
   (let ((x nil))
     (values
      (remf (expand-in-current-env (%m x)) 'a)
      x)))
  nil nil)

(deftest remf.6
  (macrolet
   ((%m (z) z))
   (let ((x (list 'a 'b)))
     (values
      (notnot (remf (expand-in-current-env (%m x)) 'a))
      x)))
  t nil)

(deftest remf.7
  (macrolet
   ((%m (z) z))
   (let ((x (list 'a 'b 'c 'd)))
     (values
      (notnot (remf x (expand-in-current-env (%m 'a))))
      x)))
  t (c d))



(deftest remf.order.1
  (let ((i 0) x y
        (p (make-array 1 :initial-element (copy-list '(a b c d e f)))))
    (values
     (notnot
      (remf (aref p (progn (setf x (incf i)) 0))
            (progn (setf y (incf i))
                   'c)))
     (aref p 0)
     i x y))
  t (a b e f) 2 1 2)

(deftest remf.order.2
  (let ((x  (copy-seq #(nil :a :b)))
        (pa (vector (list :a 1) (list :b 2) (list :c 3) (list :d 4)))
        (i 0))
    (values
     (not (remf (aref pa (incf i)) (aref x (incf i))))
     pa))
  nil #((:a 1) nil (:c 3) (:d 4)))

(deftest remf.order.3
  (let ((x (list 'a 'b 'c 'd)))
    (progn
      "See CLtS 5.1.3"
      (values
       (remf x (progn (setq x (list 'e 'f)) 'a))
       x)))
  nil (e f))

(def-macro-test remf.error.1 (remf x 'a))
