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