;;; -*- mode: Lisp; Syntax: Common-Lisp; -*-
;;;
;;; Copyright (c) 2009 by the authors.
;;;
;;; See LICENCE for details.

(in-package :hu.dwim.def)

;; resolve the headache: stefil and def both have -body-, but they have no common dependencies...
;; TODO get rid of the common -body- and start using -with-macro/body- and similar naming. possibly also add extra defaulting arg for them to be able to provide user given names...

;; :compile-toplevel confuses ECL's compiler and makes it
;; produce invalid code for unexport. Since it is not
;; exactly needed here anyway, it is better to remove it.
(eval-when (:load-toplevel :execute)
  #-allegro ;; TODO THL what does this mean for allegro?
  (unexport         'hu.dwim.stefil:-body- :hu.dwim.stefil)
  (shadowing-import 'hu.dwim.def:-body-    :hu.dwim.stefil)
  (export           'hu.dwim.def:-body-    :hu.dwim.stefil))

(pushnew 'hu.dwim.def:-body- hu.dwim.stefil::*fixture-body-aliases*)

;; we define "TEST" with a string name, so it will match (def test ...) no matter what is the
;; home package of 'test. this is done like that to be able to write
;; (def any-package::test some-lib::test ...) in any library to create the toplevel TEST
;; defun called some-lib::test without shadowing stefil:test everywhere.
(def (definer :available-flags "do") "TEST" ()
  (function-like-definer hu.dwim.stefil:deftest :allow-compound-name t))

(def (definer :available-flags "e") hu.dwim.stefil::suite (name &rest args)
  `(progn
     (hu.dwim.stefil:defsuite ,name ,@args)
     ,@(when (getf -options- :export)
             `((export ',(first (ensure-list name)))))))

(def (definer :available-flags "e") hu.dwim.stefil::suite* (name &rest args)
  `(progn
     (hu.dwim.stefil:defsuite* ,name ,@args)
     ,@(when (getf -options- :export)
             `((export ',(first (ensure-list name)))))))

(def (definer :available-flags "e") hu.dwim.stefil::fixture (name &body body)
  `(progn
     (hu.dwim.stefil:defixture ,name ,@body)
     ,@(when (getf -options- :export)
             `((export ',name)))))

(integrated-export '(hu.dwim.stefil::suite hu.dwim.stefil::suite* hu.dwim.stefil::fixture) :hu.dwim.def)
