summaryrefslogtreecommitdiff
path: root/test-suite/tests/compiler.test
blob: 6d433ebacd87311468693a8d4682c9ce8db65c3b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
;;;; compiler.test --- tests for the compiler      -*- scheme -*-
;;;; Copyright (C) 2008, 2009 Free Software Foundation, Inc.
;;;; 
;;;; This library is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU Lesser General Public
;;;; License as published by the Free Software Foundation; either
;;;; version 3 of the License, or (at your option) any later version.
;;;; 
;;;; This library 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
;;;; Lesser General Public License for more details.
;;;; 
;;;; You should have received a copy of the GNU Lesser General Public
;;;; License along with this library; if not, write to the Free Software
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

(define-module (test-suite tests compiler)
  :use-module (test-suite lib)
  :use-module (test-suite guile-test)
  :use-module (system base compile)
  :use-module ((system vm vm) #:select (the-vm vm-load)))

(define read-and-compile
  (@@ (system base compile) read-and-compile))



(with-test-prefix "basic"

  (pass-if "compile to value"
    (equal? (compile 1) 1)))


(with-test-prefix "psyntax"

  (pass-if "compile uses a fresh module by default"
    (begin
      (compile '(define + -))
      (eq? (compile '+) +)))

  (pass-if "compile-time definitions are isolated"
    (begin
      (compile '(define foo-bar #t))
      (not (module-variable (current-module) 'foo-bar))))

  (pass-if "compile in current module"
    (let ((o (begin
               (compile '(define-macro (foo) 'bar)
                        #:env (current-module))
               (compile '(let ((bar 'ok)) (foo))
                        #:env (current-module)))))
      (and (macro? (module-ref (current-module) 'foo))
           (eq? o 'ok))))

  (pass-if "compile in fresh module"
    (let* ((m  (let ((m (make-module)))
                 (beautify-user-module! m)
                 m))
           (o  (begin
                 (compile '(define-macro (foo) 'bar) #:env m)
                 (compile '(let ((bar 'ok)) (foo)) #:env m))))
      (and (module-ref m 'foo)
           (eq? o 'ok))))

  (pass-if "redefinition"
    ;; In this case the locally-bound `round' must have the same value as the
    ;; imported `round'.  See the same test in `syntax.test' for details.
    (let ((m (make-module)))
      (beautify-user-module! m)
      (compile '(define round round) #:env m)
      (eq? round (module-ref m 'round)))))


(with-test-prefix "current-reader"

  (pass-if "default compile-time current-reader differs"
    (not (eq? (compile 'current-reader)
              current-reader)))

  (pass-if "compile-time changes are honored and isolated"
    ;; Make sure changing `current-reader' as the side-effect of a defmacro
    ;; actually works.
    (let ((r     (fluid-ref current-reader))
          (input (open-input-string
                  "(define-macro (install-reader!)
                     ;;(format #t \"current-reader = ~A~%\" current-reader)
                     (fluid-set! current-reader
                                 (let ((first? #t))
                                   (lambda args
                                     (if first?
                                         (begin
                                           (set! first? #f)
                                           ''ok)
                                         (read (open-input-string \"\"))))))
                     #f)
                   (install-reader!)
                   this-should-be-ignored")))
      (and (eq? (vm-load (the-vm) (read-and-compile input))
                'ok)
           (eq? r (fluid-ref current-reader)))))

  (pass-if "with eval-when"
    (let ((r (fluid-ref current-reader)))
      (compile '(eval-when (compile eval)
                  (fluid-set! current-reader (lambda args 'chbouib))))
      (eq? (fluid-ref current-reader) r))))