(fiasco:define-test-package #:st-buchberger-test
 (:use #:st-buchberger)
 (:import-from #:st-buchberger #:element->string))

(in-package #:st-buchberger-test)

(deftest test-make-polynomial ()
 (flet ((is-string= (sexp string)
          "Assert that the polynomial given by SEXP is represented as STRING."
          (is (string= (element->string (make-polynomial sexp))
                       string))))
   (signals error (make-polynomial nil))
   (is (ring-zero-p (make-polynomial 0)))
   (is (ring-zero-p (make-polynomial '(+))))
   (is (ring-zero-p (make-polynomial '(-))))
   (is-string= 1 "1")
   (is-string= 'x "x")
   (signals error (make-polynomial 'w))
   (is-string= '(+ x y z) "x + y + z")
   (is-string= '(* (expt x 2) y (expt z 3)) "x^2yz^3")
   (signals error (make-polynomial '(* 1.0d0 x)))
   (signals error (make-polynomial '(* -1 0)))
   (signals error (make-polynomial '(expt 3 2)))
   (signals error (make-polynomial '(expt 3 2)))
   (signals error (make-polynomial '(expt x -1)))
   (is-string= '(- (expt x 2) (* 2 x y) (- (expt y 2)))
               "x^2 - 2xy + y^2")))

(deftest test-member-p ()
 (with-polynomial-ring
     (make-instance 'polynomial-ring :variables '(x y))
   (let* ((f (make-polynomial 'x))
          (g (make-polynomial '(+ x y)))
          (h (make-polynomial 1))
          (ideal (make-ideal f g)))
     (is (member-p (ring* f g) ideal))
     (is (not (member-p h ideal))))))