package-mutation-check.scm 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey, Jonathan Rees, Mike Sperber
  3. ; Package mutation tests
  4. (define-test-suite package-mutation-tests)
  5. (define-test-case package-mutation package-mutation-tests
  6. (let* ((meta
  7. (make-simple-package
  8. (list scheme interfaces packages defpackage built-in-structures)
  9. eval #f 'meta))
  10. (p1
  11. (eval '(begin
  12. (define p1 (make-simple-package (list scheme) eval #f 'p1))
  13. p1)
  14. meta)))
  15. (check-exception (eval 'a p1))
  16. (eval '(define a 'aa) p1)
  17. (check (eval 'a p1) => 'aa)
  18. (eval '(define (foo) b) p1)
  19. (check-exception (eval '(foo) p1))
  20. (eval '(define b 'bb) p1)
  21. (check (eval 'b p1) => 'bb)
  22. (check (eval '(foo) p1) => 'bb)
  23. (eval '(define s1-sig (make-simple-interface 's1-sig `(a b c d e f)))
  24. meta)
  25. (eval '(define s1 (make-structure p1 (lambda () s1-sig) 's1))
  26. meta)
  27. (let ((p2
  28. (eval '(begin
  29. (define p2 (make-simple-package (list s1 scheme) eval #f 'p2))
  30. p2)
  31. meta)))
  32. (check (eval 'b p2) => 'bb)
  33. (check-exception (eval 'c p2))
  34. (check-exception (eval 'z p2))
  35. (eval '(define (bar) c) p2)
  36. (check-exception (eval '(bar) p2))
  37. (eval '(define c 'cc) p1)
  38. (check (eval 'c p2) => 'cc)
  39. (check (eval '(bar) p2) => 'cc)
  40. (eval '(define (baz1) d) p1)
  41. (eval '(define (baz2) d) p2)
  42. (check-exception (eval '(baz1) p1))
  43. (check-exception (eval '(baz2) p2))
  44. (eval '(define d 'dd) p1)
  45. (check (eval '(baz1) p1) => 'dd)
  46. (check (eval '(baz2) p2) => 'dd)
  47. ;; Shadow
  48. (eval '(define d 'shadowed) p2)
  49. (check (eval '(baz1) p1) => 'dd)
  50. (check (eval '(baz2) p2) => 'shadowed)
  51. ;; Shadow undefined
  52. (eval '(define (moo1) f) p1)
  53. (eval '(define (moo2) f) p2)
  54. (eval '(define f 'ff) p2)
  55. (check-exception (eval '(moo1) p1))
  56. (check (eval '(moo2) p2) => 'ff)
  57. (eval '(define (quux1) e) p1)
  58. (eval '(define (quux2) e) p2)
  59. (eval '(define (quux3 x) (set! e x)) p1)
  60. (eval '(define (quux4 x) (set! e x)) p2)
  61. (check-exception (eval '(quux1) p1))
  62. (check-exception (eval '(quux2) p2))
  63. (check-exception (eval '(quux3 'q3) p1))
  64. (check-exception (eval '(quux4 'q4) p2))
  65. (eval '(define e 'ee) p1)
  66. (check (eval '(quux1) p1) => 'ee)
  67. (check (eval '(quux2) p2) => 'ee)
  68. (eval '(quux3 'q3) p1)
  69. (check (eval '(quux1) p1) => 'q3)
  70. (check (eval '(quux2) p2) => 'q3)
  71. (eval '(quux4 'q4) p2) ; should eventually be violation
  72. (eval '(define e 'ee2) p2)
  73. (check (eval '(quux1) p1) => 'q4) ; should eventually be q3
  74. (check (eval '(quux2) p2) => 'ee2)
  75. (eval '(quux3 'qq3) p1)
  76. (eval '(quux4 'qq4) p2)
  77. (check (eval '(quux1) p1) => 'qq3)
  78. (check (eval '(quux2) p2) => 'qq4)
  79. ;; (set-verify-later! really-verify-later!)
  80. (eval '(define-interface s3-sig (export a b x y z))
  81. meta)
  82. (eval '(define s3
  83. (make-structure p1 (lambda () s3-sig) 's3))
  84. meta)
  85. (let ((p4
  86. (eval '(begin
  87. (define p4 (make-simple-package (list s3 scheme) eval #f 'p4))
  88. p4)
  89. meta)))
  90. (eval '(define (fuu1) a) p4)
  91. (eval '(define (fuu2) d) p4)
  92. (check (eval '(fuu1) p4) => 'aa)
  93. (check-exception (eval '(fuu2) p4))
  94. ;; Remove a, add d
  95. (eval '(define-interface s3-sig (export b d x y z))
  96. meta)
  97. (package-system-sentinel)
  98. (check-exception (eval 'a p4))
  99. (check (eval 'd p4) => 'dd)
  100. (check (eval '(fuu2) p4) => 'dd)
  101. (check-exception (eval '(fuu1) p4)) ; Foo.
  102. ))))