;;;;
;;;; 154.stk         -- Tests for SRFI-154: First-class dynamic extents
;;;;
;;;; Copyright © 2021 Jeronimo Pellegrini <j_p@aleph0.info>
;;;;
;;;;
;;;; This program is free software; you can redistribute it and/or modify
;;;; it under the terms of the GNU General Public License as published by
;;;; the Free Software Foundation; either version 2 of the License, or
;;;; (at your option) any later version.
;;;;
;;;; This program is distributed in the hope that it will be useful,
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;;; GNU General Public License for more details.
;;;;
;;;; You should have received a copy of the GNU General Public License
;;;; along with this program; if not, write to the Free Software
;;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
;;;; USA.
;;;;
;;;; This file is a derivative work from the  implementation of
;;;; this SRFI by Marc Nieper-Wißkirchen, it is copyrighted as:
;;;;

;;;;;; Copyright (C) Marc Nieper-Wißkirchen (2017).  All Rights Reserved.
;;;;;;
;;;;;; Permission is hereby granted, free of charge, to any person
;;;;;; obtaining a copy of this software and associated documentation
;;;;;; files (the "Software"), to deal in the Software without
;;;;;; restriction, including without limitation the rights to use, copy,
;;;;;; modify, merge, publish, distribute, sublicense, and/or sell copies
;;;;;; of the Software, and to permit persons to whom the Software is
;;;;;; furnished to do so, subject to the following conditions:
;;;;;;
;;;;;; The above copyright notice and this permission notice shall be
;;;;;; included in all copies or substantial portions of the Software.
;;;;;;
;;;;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
;;;;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
;;;;;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
;;;;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
;;;;;; BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
;;;;;; ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
;;;;;; CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
;;;;;; SOFTWARE.
;;;;
;;;;           Author: Jeronimo Pellegrini [j_p@aleph0.info]
;;;;    Creation date: 07-Apr-2021 17:20

(test "Dynamic extents"
      #t
      (dynamic-extent? (current-dynamic-extent)))

(test "Parameter bindings"
      'b
      (let*
	  ((x (make-parameter 'a))
	   (de (parameterize
		   ((x 'b))
		 (current-dynamic-extent))))
	(parameterize
	    ((x 'c))
	  (with-dynamic-extent
	   de
	   (lambda ()
	     (x))))))

(test "Dynamically closed procedures"
      'a
      (let* ((x (make-parameter 'a))
	     (getter (dynamic-lambda () (x))))
	(parameterize ((x 'b))
	  (getter))))

(test "Multiple values"
      '(1 2)
      (call-with-values
	  (lambda ()
	    (with-dynamic-extent (current-dynamic-extent) (lambda ()
							    (values 1 2))))
	list))

(test "Nested with-dynamic-extent"
      1
      (let* ((x (make-parameter 1))
	     (e1 (current-dynamic-extent))
	     (e2 (parameterize ((x 2))
		   (current-dynamic-extent))))
	(with-dynamic-extent e2 (lambda ()
				  (with-dynamic-extent e1 (lambda ()
							    (x)))))))
