xref: /freebsd/contrib/lyaml/spec/ext_yaml_emitter_spec.yaml (revision 9f0f30bc1f5f08d25243952bad3fdc6e13a75c2a)
1# LYAML binding for Lua 5.1, 5.2, 5.3 & 5.4
2# Copyright (C) 2013-2022 Gary V. Vaughan
3
4specify emitting:
5- it diagnoses an invalid event:
6    emitter = yaml.emitter ()
7    expect (emitter.emit "not an event").to_raise "expected table"
8- it can generate an empty stream:
9    pending (github_issue "2")
10    expect (emit {
11                  {type = "DOCUMENT_START", implicit = true},
12                  {type = "SCALAR", value = ""},
13                  {type = "DOCUMENT_END", implicit = true},
14                 }).
15       to_equal ""
16
17- describe STREAM_START:
18  - it diagnoses unrecognised encodings:
19      expect (emitevents (yaml.emitter (), {
20                          {type = "STREAM_START", encoding = "notexists"},
21                          "STREAM_END"})).
22         to_raise "invalid stream encoding 'notexists'"
23  - it accepts an encoding parameter:
24      expect (emitevents (yaml.emitter (), {
25                          {type = "STREAM_START", encoding = "UTF16BE"},
26                          "STREAM_END"})).
27          to_equal (BOM)
28
29- describe STREAM_END:
30  - it returns the yaml document from the preceding events:
31      expect (emit {"DOCUMENT_START", {type = "SCALAR", value = "woo!"},
32                    "DOCUMENT_END"}).
33         to_equal "--- woo!\n...\n"
34
35- describe DOCUMENT_START:
36  - it accepts a version directive parameter:
37      expect (emit {{type = "DOCUMENT_START",
38                     version_directive = { major = 1, minor = 1 }},
39                    {type = "SCALAR", value = ""},
40                    "DOCUMENT_END"}).
41         to_match "^%%YAML 1.1\n---"
42  - it accepts a list of tag directives:
43      expect (emit {{type = "DOCUMENT_START",
44                     tag_directives = {{handle = "!",
45                                        prefix = "tag:ben-kiki.org,2000:app/"}}},
46                    {type = "SCALAR", value = ""},
47                    "DOCUMENT_END"}).
48         to_contain "%TAG ! tag:ben-kiki.org,2000:app/\n---"
49      expect (emit {
50                    {type = "DOCUMENT_START",
51                     tag_directives = {{handle = "!",
52                                        prefix = "tag:ben-kiki.org,2000:app/"},
53                                       {handle = "!!",
54                                        prefix = "tag:yaml.org,2002:"}}},
55                    {type = "SCALAR", value = ""},
56                    "DOCUMENT_END"}).
57         to_contain ("%TAG ! tag:ben-kiki.org,2000:app/\n" ..
58                        "%TAG !! tag:yaml.org,2002:\n---")
59  - it accepts an implicit parameter:
60      expect (emit {{type = "DOCUMENT_START", implicit = true},
61                    {type = "SCALAR", value = ""}, "DOCUMENT_END"}).
62         not_to_contain "--- \n"
63      pending (github_issue "2")
64      expect (emit {{type = "DOCUMENT_START", implicit = false},
65                    {type = "SCALAR", value = ""}, "DOCUMENT_END"}).
66         not_to_contain "---"
67
68- describe DOCUMENT_END:
69  - it accepts an implicit parameter:
70      expect (emit {"DOCUMENT_START", {type = "SCALAR", value = ""},
71                    {type = "DOCUMENT_END", implicit = false}}).
72         to_contain "\n..."
73      pending (github_issue "2")
74      expect (emit {"DOCUMENT_START", {type = "SCALAR", value = ""},
75                    {type = "DOCUMENT_END", implicit = true}}).
76         not_to_contain "\n..."
77
78- describe MAPPING_START:
79  - it accepts an anchor parameter:
80      expect (emit {"DOCUMENT_START",
81                    {type = "MAPPING_START", anchor = "foo"},
82                    "MAPPING_END", "DOCUMENT_END"}).
83         to_contain "&foo"
84  - it diagnoses unrecognised styles:
85      expect (emit {"DOCUMENT_START",
86                    {type = "MAPPING_START", style = "notexists"},
87                    "MAPPING_END", "DOCUMENT_END"}).
88         to_raise "invalid mapping style 'notexists'"
89  - it understands block style: '
90      expect (emit {"DOCUMENT_START",
91                    {type = "MAPPING_START", style = "BLOCK"},
92                    {type = "SCALAR", value = "foo"}, {type = "SCALAR", value = "bar"},
93                    "MAPPING_END", "DOCUMENT_END"}).
94         to_contain "foo: bar\n"'
95  - it understands flow style: '
96      expect (emit {"DOCUMENT_START",
97                    {type = "MAPPING_START", style = "FLOW"},
98                    {type = "SCALAR", value = "foo"}, {type = "SCALAR", value = "bar"},
99                    {type = "SCALAR", value = "baz"}, {type = "SCALAR", value = "qux"},
100                    "MAPPING_END", "DOCUMENT_END"}).
101         to_contain "{foo: bar, baz: qux}\n"'
102  - it accepts an explicit tag parameter: '
103      expect (emit {"DOCUMENT_START",
104                    {type = "MAPPING_START", style = "FLOW",
105                     tag = "tag:yaml.org,2002:map", implicit = false},
106                    {type = "SCALAR", value = "foo"}, {type = "SCALAR", value = "bar"},
107                    "MAPPING_END", "DOCUMENT_END"}).
108         to_contain "!!map {foo: bar}"'
109  - it accepts an implicit tag parameter: '
110      expect (emit {"DOCUMENT_START",
111      {type = "MAPPING_START", tag = "tag:yaml.org,2002:map", implicit = true},
112                    {type = "SCALAR", value = "foo"}, {type = "SCALAR", value = "bar"},
113                    "MAPPING_END", "DOCUMENT_END"}).
114         not_to_contain "map"'
115
116- describe MAPPING_END:
117  - it requires no parameters: '
118      expect (emit {"DOCUMENT_START", "MAPPING_START",
119                    {type = "SCALAR", value = "foo"}, {type = "SCALAR", value = "bar"},
120                    "MAPPING_END", "DOCUMENT_END"}).
121         to_contain "foo: bar\n"'
122
123- describe SEQUENCE_START:
124  - it accepts an anchor parameter:
125      expect (emit {"DOCUMENT_START",
126                    {type = "SEQUENCE_START", anchor = "foo"},
127                    "SEQUENCE_END", "DOCUMENT_END"}).
128         to_contain "&foo"
129  - it diagnoses unrecognised styles:
130      expect (emit {"DOCUMENT_START",
131                    {type = "SEQUENCE_START", style = "notexists"},
132                    "SEQUENCE_END", "DOCUMENT_END"}).
133         to_raise "invalid sequence style 'notexists'"
134  - it understands block style:
135      expect (emit {"DOCUMENT_START",
136                    {type = "SEQUENCE_START", style = "BLOCK"},
137                    {type = "SCALAR", value = "foo"}, {type = "SCALAR", value = "bar"},
138                    "SEQUENCE_END", "DOCUMENT_END"}).
139         to_contain "- foo\n- bar\n"
140  - it understands flow style:
141      expect (emit {"DOCUMENT_START",
142                    {type = "SEQUENCE_START", style = "FLOW"},
143                    {type = "SCALAR", value = "foo"}, {type = "SCALAR", value = "bar"},
144                    "SEQUENCE_END", "DOCUMENT_END"}).
145         to_contain "[foo, bar]"
146  - it accepts an explicit tag parameter:
147      expect (emit {"DOCUMENT_START",
148                    {type = "SEQUENCE_START", style = "FLOW",
149                     tag = "tag:yaml.org,2002:sequence", implicit = false},
150                    {type = "SCALAR", value = "foo"}, {type = "SCALAR", value = "bar"},
151                    "SEQUENCE_END", "DOCUMENT_END"}).
152         to_contain "!!sequence [foo, bar]\n"
153  - it accepts an implicit tag parameter:
154      expect (emit {"DOCUMENT_START",
155                    {type = "SEQUENCE_START", style = "FLOW",
156                     tag = "tag:yaml.org,2002:sequence", implicit = true},
157                    {type = "SCALAR", value = "foo"}, {type = "SCALAR", value = "bar"},
158                    "SEQUENCE_END", "DOCUMENT_END"}).
159         not_to_contain "sequence"
160
161- describe SEQUENCE_END:
162  - it requires no parameters: '
163      expect (emit {"DOCUMENT_START", "SEQUENCE_START",
164                    {type = "SCALAR", value = "moo"},
165                    "SEQUENCE_END", "DOCUMENT_END"}).
166         to_contain "- moo\n"'
167
168- describe SCALAR:
169  - it diagnoses a missing value parameter:
170  - it accepts a value parameter:
171      expect (emit {"DOCUMENT_START", {type = "SCALAR", value = "boo"},
172                    "DOCUMENT_END"}).
173         to_contain "boo"
174  - it diagnoses unrecognised styles:
175      expect (emit {"DOCUMENT_START",
176                    {type = "SCALAR", style = "notexists", value = "foo"},
177                    "DOCUMENT_END"}).
178         to_raise "invalid scalar style 'notexists'"
179  - it understands plain style:
180      expect (emit {"DOCUMENT_START",
181                    {type = "SCALAR", style = "PLAIN", value = "boo"},
182                    "DOCUMENT_END"}).
183         to_contain "boo\n"
184  - it understands single quoted style:
185      expect (emit {"DOCUMENT_START",
186                    {type = "SCALAR", style = "SINGLE_QUOTED", value = "bar"},
187                    "DOCUMENT_END"}).
188         to_contain "'bar'\n"
189      expect (emit {"DOCUMENT_START",
190                    {type = "SCALAR", style = "SINGLE_QUOTED", value = "bar'"},
191                    "DOCUMENT_END"}).
192         to_contain "'bar'''\n"
193  - it understands double quoted style:
194      expect (emit {"DOCUMENT_START",
195                    {type = "SCALAR", style = "DOUBLE_QUOTED", value = "baz"},
196                    "DOCUMENT_END"}).
197         to_contain '"baz"\n'
198      expect (emit {"DOCUMENT_START",
199                    {type = "SCALAR", style = "DOUBLE_QUOTED", value = '"baz"'},
200                    "DOCUMENT_END"}).
201         to_contain ([["\"baz\""]] .. "\n")
202  - it understands literal style:
203      expect (emit {"DOCUMENT_START",
204                    {type = "SCALAR", style = "LITERAL", value = "quux"},
205                    "DOCUMENT_END"}).
206         to_contain "|-\n  quux\n"
207  - it understands folded style:
208      expect (emit {"DOCUMENT_START",
209                    {type = "SCALAR", style = "FOLDED", value = "thud"},
210                    "DOCUMENT_END"}).
211         to_contain ">-\n  thud\n"
212  - it understands plain_implicit:
213      expect (emit {"DOCUMENT_START",
214                    {type = "SCALAR", style = "PLAIN", value = "hello", plain_implicit=false},
215                    "DOCUMENT_END"}).
216         to_contain "'hello'\n"
217  - it understands quoted_implicit:
218      expect (emit {"DOCUMENT_START",
219                    {type = "SCALAR", style = "PLAIN", value = "- world", quoted_implicit=false},
220                    "DOCUMENT_END"}).
221         to_contain "! '- world'\n"
222  - it understands tag:
223      expect (emit {"DOCUMENT_START",
224                    {type = "SCALAR", style = "PLAIN", value = "bug_squash", tag="tagger", plain_implicit=false, quoted_implicit=false},
225                    "DOCUMENT_END"}).
226         to_contain "!<tagger> bug_squash\n"
227
228- describe ALIAS:
229  - it diagnoses missing anchor parameter:
230  - it diagnoses non-alphanumeric anchor characters:
231      expect (emit {"DOCUMENT_START", {type = "ALIAS", anchor = "woo!"},
232                    "DOCUMENT_END"}).
233         to_raise "must contain alphanumerical characters only"
234  - it accepts an anchor parameter:
235      expect (emit {"DOCUMENT_START", "SEQUENCE_START",
236                    {type = "SCALAR", anchor = "woo",  value = "hoo"},
237                    {type = "ALIAS", anchor = "woo"},
238                    "SEQUENCE_END", "DOCUMENT_END"}).
239         to_contain.all_of {"&woo", "*woo"}
240