-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathobject_unpack.js
113 lines (81 loc) · 3.59 KB
/
object_unpack.js
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
108
109
110
111
112
113
var lexer = require('../../index').lex.lexer;
var parser = require('../../index').parse.parser;
var testParser = function(stream) {
var result = parser.parseStream(stream);
return result.body[0].expression.bindings[0].pattern;
};
exports.single = function(test) {
var result = testParser(lexer.lex("let {a} = {} in a;"));
test.equal(result.type, 'ObjectPattern');
test.equal(result.elements.length, 1);
test.equal(result.checked, false);
test.equal(result.elements[0].type, 'ObjectPatternElement');
test.equal(result.elements[0].key.id.name, 'a');
test.equal(result.elements[0].target, null);
test.done();
};
exports.empty_fails = function(test) {
test.throws(
testParser.bind(null, lexer.lex("let {} = {} in a;")));
test.done();
};
exports.checked = function(test) {
var result = testParser(lexer.lex("let ?{a} = {} in a;"));
test.equal(result.type, 'ObjectPattern');
test.equal(result.elements.length, 1);
test.equal(result.checked, true);
test.equal(result.elements[0].type, 'ObjectPatternElement');
test.equal(result.elements[0].key.type, 'IdentifierPattern');
test.equal(result.elements[0].key.id.name, 'a');
test.equal(result.elements[0].target, null);
test.done();
};
exports.alias_string_key = function(test) {
var result = testParser(lexer.lex("let {'+'#a} = {} in a;"));
test.equal(result.type, 'ObjectPattern');
test.equal(result.elements.length, 1);
test.equal(result.checked, false);
test.equal(result.elements[0].type, 'ObjectPatternElement');
test.equal(result.elements[0].key.type, 'Literal');
test.equal(result.elements[0].key.kind, 'string');
test.equal(result.elements[0].key.value, '+');
test.equal(result.elements[0].target.type, 'IdentifierPattern');
test.equal(result.elements[0].target.id.name, 'a');
test.done();
};
exports.operator_key = function(test) {
var result = testParser(lexer.lex("let {(+|+)} = {} in a;"));
test.equal(result.type, 'ObjectPattern');
test.equal(result.elements.length, 1);
test.equal(result.checked, false);
test.equal(result.elements[0].type, 'ObjectPatternElement');
test.equal(result.elements[0].key.type, 'IdentifierPattern');
test.equal(result.elements[0].key.id.name, '+|+');
test.done();
};
exports.multi = function(test) {
var result = testParser(lexer.lex("let {a b c} = [] in a;"));
test.equal(result.type, 'ObjectPattern');
test.equal(result.elements.length, 3);
test.equal(result.elements[0].type, 'ObjectPatternElement');
test.equal(result.elements[0].key.id.name, 'a');
test.equal(result.elements[1].type, 'ObjectPatternElement');
test.equal(result.elements[1].key.id.name, 'b');
test.equal(result.elements[2].type, 'ObjectPatternElement');
test.equal(result.elements[2].key.id.name, 'c');
test.done();
};
exports.nested = function(test) {
var result = testParser(lexer.lex("let {'+'#{a}} = [] in a;"));
test.equal(result.type, 'ObjectPattern');
test.equal(result.elements.length, 1);
test.equal(result.elements[0].type, 'ObjectPatternElement');
test.equal(result.elements[0].key.type, 'Literal');
test.equal(result.elements[0].key.kind, 'string');
test.equal(result.elements[0].key.value, '+');
test.equal(result.elements[0].target.type, 'ObjectPattern');
test.equal(result.elements[0].target.elements.length, 1);
test.equal(result.elements[0].target.elements[0].type, 'ObjectPatternElement');
test.equal(result.elements[0].target.elements[0].key.id.name, 'a');
test.done();
};