record-syntactic-check.scm 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Mike Sperber
  3. (define-test-suite r6rs-records-syntactic-tests)
  4. (define-record-type (pare kons pare?)
  5. (fields kar kdr))
  6. (define-test-case pare r6rs-records-syntactic-tests
  7. (let ((p1 (kons 1 2)))
  8. (check (pare? p1))
  9. (check (not (pare? 5)))
  10. (check (pare-kar p1) => 1)
  11. (check (pare-kdr p1) => 2)))
  12. (define-record-type point
  13. (fields (immutable x)
  14. (mutable y))
  15. (nongenerative
  16. point-4893d957-e00b-11d9-817f-00111175eb9e))
  17. (define-record-type (cpoint make-cpoint cpoint?)
  18. (parent point)
  19. (protocol
  20. (lambda (n)
  21. (lambda (x y c)
  22. ((n x y) (color->rgb c)))))
  23. (fields
  24. (mutable rgb cpoint-rgb cpoint-rgb-set!)))
  25. (define (color->rgb c)
  26. (cons 'rgb c))
  27. (define-test-case point r6rs-records-syntactic-tests
  28. (let ((p1 (make-point 1 2))
  29. (p2 (make-cpoint 3 4 'red)))
  30. (check (point? p1) => #t)
  31. (check (point-x p1) => 1)
  32. (check (point-y p1) => 2)
  33. (check (point? (vector)) => #f)
  34. (check (point? (cons 'a 'b)) => #f)
  35. (point-y-set! p1 17)
  36. (check (point-y p1) => 17)
  37. (check (record-rtd p1) => (record-type-descriptor point))))
  38. (define-test-case cpoint r6rs-records-syntactic-tests
  39. (let ((p1 (make-point 1 2))
  40. (p2 (make-cpoint 3 4 'red)))
  41. (check (cpoint? p1) => #f)
  42. (check (point? p2) => #t)
  43. (check (cpoint? p2) => #t)
  44. (check (point-x p2) => 3)
  45. (check (point-y p2) => 4)
  46. (check (cpoint-rgb p2) => '(rgb . red))))
  47. (define-record-type (ex1 make-ex1 ex1?)
  48. (protocol (lambda (p) (lambda a (p a))))
  49. (fields (immutable f ex1-f)))
  50. (define-test-case ex1 r6rs-records-syntactic-tests
  51. (let ((ex1-i1 (make-ex1 1 2 3)))
  52. (check (ex1-f ex1-i1) => '(1 2 3))))
  53. (define-record-type (ex2 make-ex2 ex2?)
  54. (protocol
  55. (lambda (p) (lambda (a . b) (p a b))))
  56. (fields (immutable a ex2-a)
  57. (immutable b ex2-b)))
  58. (define-test-case ex2 r6rs-records-syntactic-tests
  59. (let ((ex2-i1 (make-ex2 1 2 3)))
  60. (check (ex2-a ex2-i1) => 1)
  61. (check (ex2-b ex2-i1) => '(2 3))))
  62. (define-record-type (unit-vector
  63. make-unit-vector
  64. unit-vector?)
  65. (protocol
  66. (lambda (p)
  67. (lambda (x y z)
  68. (let ((length
  69. (sqrt (+ (* x x)
  70. (* y y)
  71. (* z z)))))
  72. (p (/ x length)
  73. (/ y length)
  74. (/ z length))))))
  75. (fields (immutable x unit-vector-x)
  76. (immutable y unit-vector-y)
  77. (immutable z unit-vector-z)))
  78. (define *ex3-instance* #f)
  79. (define-record-type ex3
  80. (parent cpoint)
  81. (protocol
  82. (lambda (n)
  83. (lambda (x y t)
  84. (let ((r ((n x y 'red) t)))
  85. (set! *ex3-instance* r)
  86. r))))
  87. (fields
  88. (mutable thickness))
  89. (sealed #t) (opaque #t))
  90. (define-test-case ex3 r6rs-records-syntactic-tests
  91. (let ((ex3-i1 (make-ex3 1 2 17)))
  92. (check (ex3? ex3-i1) => #t)
  93. (check (cpoint-rgb ex3-i1) => '(rgb . red))
  94. (check (ex3-thickness ex3-i1) => 17)
  95. (ex3-thickness-set! ex3-i1 18)
  96. (check (ex3-thickness ex3-i1) => 18)
  97. (check *ex3-instance* => ex3-i1)
  98. (check (record? ex3-i1) => #f)))
  99. ; static record type with parent
  100. (define-record-type ppoint
  101. (parent point)
  102. (fields
  103. (immutable smell)))
  104. (define-test-case ppoint r6rs-records-syntactic-tests
  105. (let ((pp (make-ppoint 1 2 'bad)))
  106. (check (point-x pp) => 1)
  107. (check (point-y pp) => 2)
  108. (check (ppoint-smell pp) => 'bad)))