summaryrefslogtreecommitdiff
path: root/test-suite/tests/records.test
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2019-10-28 16:58:22 +0100
committerAndy Wingo <wingo@pobox.com>2019-10-28 16:59:58 +0100
commit315fabdfe7122737ca9a804097ff16dabfd7a63a (patch)
treebedc0edf9abe43bad1d3bd6535c710019be7dca8 /test-suite/tests/records.test
parentf963bdf02d7dd316884ccc9d590b3a7327406422 (diff)
downloadguile-315fabdfe7122737ca9a804097ff16dabfd7a63a.tar.gz
Add support for immutable fields in core records
* module/ice-9/boot-9.scm (make-record-type): Allow (mutable NAME) or (immutable NAME) as a field name, and record field mutability in a bitfield. (record-modifier): Throw an error if the field isn't mutable. * test-suite/tests/records.test ("records"): Add tests. * doc/ref/api-data.texi (Records): Update.
Diffstat (limited to 'test-suite/tests/records.test')
-rw-r--r--test-suite/tests/records.test32
1 files changed, 31 insertions, 1 deletions
diff --git a/test-suite/tests/records.test b/test-suite/tests/records.test
index 5ec784c49..375733419 100644
--- a/test-suite/tests/records.test
+++ b/test-suite/tests/records.test
@@ -166,4 +166,34 @@
(pass-if (not (record-type-opaque? b)))
(pass-if (record-type-opaque? c))
(pass-if-exception "non-opaque" '(misc-error . "opaque")
- (make-record-type 'd '() #:opaque? #f #:parent a)))))
+ (make-record-type 'd '() #:opaque? #f #:parent a))))
+
+ (with-test-prefix "immutable fields"
+ (let ()
+ (define a (make-record-type 'a '(s t (mutable u) (immutable v))
+ #:extensible? #t))
+ (define b (make-record-type 'b '(w (immutable x)) #:parent a))
+
+ (pass-if-exception "bad field" '(misc-error . "field")
+ (make-record-type 'a '("foo")))
+ (pass-if-exception "bad field" '(misc-error . "field")
+ (make-record-type 'a '((mutable u x))))
+ (pass-if-exception "bad field" '(misc-error . "field")
+ (make-record-type 'a '((qux u))))
+ (pass-if-equal (record-type-mutable-fields a) #b0111)
+ (pass-if-equal (record-type-mutable-fields b) #b010111)
+
+ (pass-if (procedure? (record-modifier a 's)))
+ (pass-if (procedure? (record-modifier a 't)))
+ (pass-if (procedure? (record-modifier a 'u)))
+ (pass-if-exception "immutable" '(misc-error . "immutable")
+ (record-modifier a 'v))
+
+ (pass-if (procedure? (record-modifier b 's)))
+ (pass-if (procedure? (record-modifier b 't)))
+ (pass-if (procedure? (record-modifier b 'u)))
+ (pass-if-exception "immutable" '(misc-error . "immutable")
+ (record-modifier b 'v))
+ (pass-if (procedure? (record-modifier b 'w)))
+ (pass-if-exception "immutable" '(misc-error . "immutable")
+ (record-modifier b 'x)))))