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
|
import TestPilot from require 'spec.test_setup'
import T, Struct from require 'alv'
describe "struct", ->
test = TestPilot '', '(import* struct-)\n'
ab = Struct { a: T.num, b: T.bool }
describe "(set)", ->
it "can update values", ->
rt = COPILOT\eval_once '(set (struct "a" 1 "b" false) "a" 2)'
assert.is.true rt\is_const!
assert.is.equal ab\mk_const({ a: 2, b: false }), rt.result
it "cannot add members", ->
err = assert.has.error -> COPILOT\eval_once '(set (struct "a" 1) "b" 2)'
assert.matches "{a: num} has no 'b' key", err
it "checks value type", ->
err = assert.has.error -> COPILOT\eval_once '(set (struct "a" 1) "a" "str")'
assert.matches "expected value for key 'a' to be num, not str", err
describe "(get)", ->
it "can get values", ->
rt = COPILOT\eval_once '(get (struct "a" 1 "b" false) "a")'
assert.is.true rt\is_const!
assert.is.equal '<num= 1>', tostring rt.result
it "checks keys", ->
err = assert.has.error -> COPILOT\eval_once '(get (struct "a" 1) "b")'
assert.matches "has no 'b' key", err
describe "(insert)", ->
it "can add members", ->
rt = COPILOT\eval_once '(insert (struct "b" true) "a" 1)'
assert.is.true rt\is_const!
assert.is.equal ab\mk_const({ a: 1, b: true }), rt.result
it "doesn't clobber existing members", ->
err = assert.has.error -> COPILOT\eval_once '(insert (struct "a" 1) "a" 2)'
assert.matches "key 'a' already exists in value of type {a: num}", err
describe "(remove)", ->
it "can remove members", ->
rt = COPILOT\eval_once '(remove (struct "a" 1 "b" false "c" "abc") "c")'
assert.is.true rt\is_const!
assert.is.equal ab\mk_const({ a: 1, b: false }), rt.result
it "checks keys", ->
err = assert.has.error -> COPILOT\eval_once '(remove (struct "a" 1) "b")'
assert.matches "has no 'b' key", err
|