• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (c) 2008, SnakeYAML
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5  * in compliance with the License. You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the License
10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11  * or implied. See the License for the specific language governing permissions and limitations under
12  * the License.
13  */
14 package org.yaml.snakeyaml.comment;
15 
16 import static org.junit.Assert.assertEquals;
17 import static org.junit.Assert.assertFalse;
18 import static org.junit.Assert.assertSame;
19 import static org.junit.Assert.assertTrue;
20 
21 import java.io.StringReader;
22 import java.util.Arrays;
23 import java.util.Iterator;
24 import java.util.List;
25 import org.junit.Test;
26 import org.yaml.snakeyaml.LoaderOptions;
27 import org.yaml.snakeyaml.reader.StreamReader;
28 import org.yaml.snakeyaml.scanner.Scanner;
29 import org.yaml.snakeyaml.scanner.ScannerImpl;
30 import org.yaml.snakeyaml.tokens.CommentToken;
31 import org.yaml.snakeyaml.tokens.ScalarToken;
32 import org.yaml.snakeyaml.tokens.Token;
33 import org.yaml.snakeyaml.tokens.Token.ID;
34 
35 public class ScannerWithCommentEnabledTest {
36 
assertTokensEqual(List<ID> expected, Scanner sut)37   private void assertTokensEqual(List<ID> expected, Scanner sut) {
38     assertTokensEqual(expected, null, sut);
39   }
40 
printToken(Token token)41   private void printToken(Token token) {
42     String value;
43     switch (token.getTokenId()) {
44       case Scalar:
45         value = "(value='" + ((ScalarToken) token).getValue() + "')";
46         break;
47       case Comment:
48         CommentToken commentToken = (CommentToken) token;
49         value = "(type='" + commentToken.getCommentType() + ", value='" + commentToken.getValue()
50             + "')";
51         break;
52       default:
53         value = "";
54         break;
55     }
56     // System.out.println(token.getTokenId().name() + value);
57   }
58 
assertTokenEquals(Iterator<ID> expectedIdIterator, Iterator<String> expectedScalarValueIterator, Token token)59   private void assertTokenEquals(Iterator<ID> expectedIdIterator,
60       Iterator<String> expectedScalarValueIterator, Token token) {
61     printToken(token);
62     assertTrue(expectedIdIterator.hasNext());
63     ID expectedValue = expectedIdIterator.next();
64     assertSame(expectedValue, token.getTokenId());
65     if (expectedScalarValueIterator != null && token.getTokenId() == ID.Scalar) {
66       assertEquals(expectedScalarValueIterator.next(), ((ScalarToken) token).getValue());
67     }
68   }
69 
assertTokensEqual(List<ID> expectedList, List<String> expectedScalarValueList, Scanner sut)70   private void assertTokensEqual(List<ID> expectedList, List<String> expectedScalarValueList,
71       Scanner sut) {
72     Iterator<ID> expectedIterator = expectedList.iterator();
73     Iterator<String> expectedScalarValueIterator =
74         expectedScalarValueList == null ? null : expectedScalarValueList.iterator();
75     while (!sut.checkToken(Token.ID.StreamEnd)) {
76       Token token = sut.getToken();
77       assertTokenEquals(expectedIterator, expectedScalarValueIterator, token);
78     }
79     Token token = sut.peekToken();
80     assertTokenEquals(expectedIterator, expectedScalarValueIterator, token);
81     assertFalse(expectedIterator.hasNext());
82   }
83 
constructScanner(String input)84   private Scanner constructScanner(String input) {
85     LoaderOptions options = new LoaderOptions();
86     options.setProcessComments(true);
87     return new ScannerImpl(new StreamReader(new StringReader(input)), options);
88   }
89 
90   @Test
testEmpty()91   public void testEmpty() {
92     List<ID> expected = Arrays.asList(ID.StreamStart, ID.StreamEnd);
93 
94     Scanner sut = constructScanner("");
95 
96     assertTokensEqual(expected, sut);
97   }
98 
99   @Test
testOnlyCommentLines()100   public void testOnlyCommentLines() {
101     List<ID> expected = Arrays.asList(ID.StreamStart, //
102         ID.Comment, //
103         ID.Comment, //
104         ID.StreamEnd);
105 
106     Scanner sut = constructScanner("" + //
107         "# This stream contains no\n" + //
108         "# documents, only comments.");
109 
110     assertTokensEqual(expected, sut);
111   }
112 
113   @Test
testCommentEndingALine()114   public void testCommentEndingALine() {
115     List<ID> expected = Arrays.asList(ID.StreamStart, //
116         ID.BlockMappingStart, //
117         ID.Key, ID.Scalar, ID.Value, ID.Comment, //
118         ID.Scalar, //
119         ID.BlockEnd, //
120         ID.StreamEnd);
121     List<String> expectedScalarValue = Arrays.asList(//
122         "key", "value");
123 
124     Scanner sut = constructScanner("" + //
125         "key: # Comment\n" + //
126         "  value\n");
127 
128     assertTokensEqual(expected, expectedScalarValue, sut);
129   }
130 
131   @Test
testMultiLineComment()132   public void testMultiLineComment() {
133     List<ID> expected = Arrays.asList(ID.StreamStart, //
134         ID.BlockMappingStart, //
135         ID.Key, ID.Scalar, ID.Value, ID.Comment, ID.Comment, //
136         ID.Scalar, //
137         ID.Comment, //
138         ID.BlockEnd, //
139         ID.StreamEnd);
140     List<String> expectedScalarValue = Arrays.asList(//
141         "key", "value");
142 
143     Scanner sut = constructScanner("" + //
144         "key: # Comment\n" + //
145         "     # lines\n" + //
146         "  value\n" + //
147         "\n");
148 
149     assertTokensEqual(expected, expectedScalarValue, sut);
150   }
151 
152   @Test
testBlankLine()153   public void testBlankLine() {
154     List<ID> expected = Arrays.asList(ID.StreamStart, //
155         ID.Comment, //
156         ID.StreamEnd);
157 
158     Scanner sut = constructScanner("" + //
159         "\n");
160 
161     assertTokensEqual(expected, sut);
162   }
163 
164   @Test
testBlankLineComments()165   public void testBlankLineComments() {
166     List<ID> expected = Arrays.asList(ID.StreamStart, //
167         ID.Comment, //
168         ID.BlockMappingStart, //
169         ID.Key, ID.Scalar, ID.Value, ID.Scalar, ID.Comment, //
170         ID.Comment, //
171         ID.Comment, //
172         ID.BlockEnd, //
173         ID.StreamEnd);
174 
175     Scanner sut = constructScanner("" + //
176         "\n" + //
177         "abc: def # commment\n" + //
178         "\n" + //
179         "\n");
180 
181     assertTokensEqual(expected, sut);
182   }
183 
184   @Test
test_blockScalar_replaceNLwithSpaces_singleNLatEnd()185   public void test_blockScalar_replaceNLwithSpaces_singleNLatEnd() {
186     List<ID> expected = Arrays.asList(//
187         ID.StreamStart, //
188         ID.BlockMappingStart, //
189         ID.Key, ID.Scalar, ID.Value, ID.Comment, //
190         ID.Scalar, //
191         ID.BlockEnd, //
192         ID.StreamEnd //
193     );
194     List<String> expectedScalarValue = Arrays.asList(//
195         "abc", "def hij\n");
196 
197     Scanner sut = constructScanner("abc: > # Comment\n    def\n    hij\n\n");
198 
199     // printTokens(sut);
200     assertTokensEqual(expected, expectedScalarValue, sut);
201   }
202 
203   @Test
test_blockScalar_replaceNLwithSpaces_noNLatEnd()204   public void test_blockScalar_replaceNLwithSpaces_noNLatEnd() {
205     List<ID> expected = Arrays.asList(//
206         ID.StreamStart, //
207         ID.BlockMappingStart, //
208         ID.Key, ID.Scalar, ID.Value, ID.Comment, ID.Scalar, //
209         ID.BlockEnd, //
210         ID.StreamEnd //
211     );
212     List<String> expectedScalarValue = Arrays.asList(//
213         "abc", "def hij");
214 
215     Scanner sut = constructScanner("abc: >- # Comment\n    def\n    hij\n\n");
216 
217     assertTokensEqual(expected, expectedScalarValue, sut);
218   }
219 
220   @Test
test_blockScalar_replaceNLwithSpaces_allNLatEnd()221   public void test_blockScalar_replaceNLwithSpaces_allNLatEnd() {
222     List<ID> expected = Arrays.asList(//
223         ID.StreamStart, //
224         ID.BlockMappingStart, //
225         ID.Key, ID.Scalar, ID.Value, ID.Comment, ID.Scalar, //
226         ID.BlockEnd, //
227         ID.StreamEnd //
228     );
229     List<String> expectedScalarValue = Arrays.asList(//
230         "abc", "def hij\n\n");
231 
232     Scanner sut = constructScanner("abc: >+ # Comment\n    def\n    hij\n\n");
233 
234     assertTokensEqual(expected, expectedScalarValue, sut);
235   }
236 
237   @Test
test_blockScalar_keepNL_singleNLatEnd()238   public void test_blockScalar_keepNL_singleNLatEnd() {
239     List<ID> expected = Arrays.asList(//
240         ID.StreamStart, //
241         ID.BlockMappingStart, //
242         ID.Key, ID.Scalar, ID.Value, ID.Comment, ID.Scalar, //
243         ID.BlockEnd, //
244         ID.StreamEnd //
245     );
246     List<String> expectedScalarValue = Arrays.asList(//
247         "abc", "def\nhij\n");
248 
249     Scanner sut = constructScanner("abc: | # Comment\n    def\n    hij\n\n");
250 
251     assertTokensEqual(expected, expectedScalarValue, sut);
252   }
253 
254   @Test
test_blockScalar_keepNL_noNLatEnd()255   public void test_blockScalar_keepNL_noNLatEnd() {
256     List<ID> expected = Arrays.asList(//
257         ID.StreamStart, //
258         ID.BlockMappingStart, //
259         ID.Key, ID.Scalar, ID.Value, ID.Comment, ID.Scalar, //
260         ID.BlockEnd, //
261         ID.StreamEnd //
262     );
263     List<String> expectedScalarValue = Arrays.asList(//
264         "abc", "def\nhij");
265 
266     Scanner sut = constructScanner("abc: |- # Comment\n    def\n    hij\n\n");
267 
268     assertTokensEqual(expected, expectedScalarValue, sut);
269   }
270 
271   @Test
test_blockScalar_keepNL_allNLatEnd()272   public void test_blockScalar_keepNL_allNLatEnd() {
273     List<ID> expected = Arrays.asList(//
274         ID.StreamStart, //
275         ID.BlockMappingStart, //
276         ID.Key, ID.Scalar, ID.Value, ID.Comment, ID.Scalar, //
277         ID.BlockEnd, //
278         ID.StreamEnd //
279     );
280     List<String> expectedScalarValue = Arrays.asList(//
281         "abc", "def\nhij\n\n");
282 
283     Scanner sut = constructScanner("abc: |+ # Comment\n    def\n    hij\n\n");
284 
285     assertTokensEqual(expected, expectedScalarValue, sut);
286   }
287 
288   @Test
testDirectiveLineEndComment()289   public void testDirectiveLineEndComment() {
290     List<ID> expected = Arrays.asList(//
291         ID.StreamStart, //
292         ID.Directive, //
293         ID.Comment, //
294         ID.StreamEnd //
295     );
296 
297     Scanner sut = constructScanner("%YAML 1.1 #Comment\n");
298 
299     assertTokensEqual(expected, sut);
300   }
301 }
302