;-*- Mode:     Lisp -*-
;;;; Author:   Paul Dietz
;;;; Created:  Wed Feb 11 19:53:33 2004
;;;; Contains: Tests of LOG

(in-package :cl-test)

(deftest log.1
  (let ((result (log 1)))
    (or (eqlt result 0)
	(eqlt result 0.0)))
  t)

(deftest log.2
  (mapcar #'log '(1.0s0 1.0f0 1.0d0 1.0l0))
  (0.0s0 0.0f0 0.0d0 0.0l0))

(deftest log.3
  (loop for type in '(short-float single-float double-float long-float)
	nconc
	(loop
	 for x = (+ (random (coerce 1 type)) (/ 1 1000))
	 for rlist = (multiple-value-list (log x))
	 for y = (car rlist)
	 repeat 1000
	 unless (and (null (cdr rlist))
		     (typep y type))
	 collect (list x rlist)))
  nil)

(deftest log.4
  (loop for type in '(short-float single-float double-float long-float)
	nconc
	(loop
	 for x = (1+ (random (coerce 1000000 type)))
	 for rlist = (multiple-value-list (log x))
	 for y = (car rlist)
	 repeat 1000
	 unless (and (null (cdr rlist))
		     (typep y type))
	 collect (list x rlist)))
  nil)

(deftest log.5
  (loop for type in '(short-float single-float double-float long-float)
	for zero = (coerce 0 type)
	nconc
	(loop
	 for x = (- (random (coerce 1 type)))
	 for rlist = (and (/= x zero) (multiple-value-list (log x)))
	 for y = (car rlist)
	 repeat 1000
	 unless (or (= x zero)
		    (and (null (cdr rlist))
			 (typep y `(complex ,type))))
	 collect (list x rlist)))
  nil)

(deftest log.6
  (loop for type in '(short-float single-float double-float long-float)
	for zero = (coerce 0 type)
	nconc
	(loop
	 for x = (- (random (coerce 1000000 type)))
	 for rlist = (and (/= x zero) (multiple-value-list (log x)))
	 for y = (car rlist)
	 repeat 1000
	 unless (or (= x zero)
		    (and (null (cdr rlist))
			 (typep y `(complex ,type))))
	 collect (list x rlist)))
  nil)

(deftest log.7
  (loop for type in '(short-float single-float double-float long-float)
	for zero = (coerce 0 type)
	nconc
	(loop
	 for x1 = (- (random (coerce 2000 type)) 1000)
	 for x2 = (1+ (random (coerce 1000 type)))
	 for rlist = (and (/= x1 zero)
			  (multiple-value-list (log (complex x1 x2))))
	 for y = (car rlist)
	 repeat 1000
	 unless (or (= x1 zero)
		    (and (null (cdr rlist))
			 (typep y `(complex ,type))))
	 collect (list x1 x2 rlist)))
  nil)

(deftest log.8
  (loop for type in '(short-float single-float double-float long-float)
	for zero = (coerce 0 type)
	nconc
	(loop
	 for x1 = (- (random (coerce 2000 type)) 1000)
	 for x2 = (- -1 (random (coerce 1000 type)))
	 for rlist = (and (/= x1 zero)
			  (multiple-value-list (log (complex x1 x2))))
	 for y = (car rlist)
	 repeat 1000
	 unless (or (= x1 zero)
		    (and (null (cdr rlist))
			 (typep y `(complex ,type))))
	 collect (list x1 x2 rlist)))
  nil)

(deftest log.9
    (log (expt 2 1024))
  709.782712893384)

(deftest log.10
    (log (complex (expt 2 1024) 3))
  #C(709.782712893384 1.668805393880401E-308))

;;; FIXME
;;; Add tests for two-arg calls
	 
;;; FIXME
;;; More accuracy tests here

;;; Error tests

(deftest log.error.1
  (signals-error (log) program-error)
  t)

(deftest log.error.2
  (signals-error (log 1.0 2.0 3.0) program-error)
  t)

