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.pyyaml; 15 16 import java.io.File; 17 import java.io.FileInputStream; 18 import java.io.IOException; 19 import java.io.InputStream; 20 import java.io.StringWriter; 21 import java.util.ArrayList; 22 import java.util.Arrays; 23 import java.util.Iterator; 24 import java.util.List; 25 import org.yaml.snakeyaml.DumperOptions; 26 import org.yaml.snakeyaml.emitter.Emitter; 27 import org.yaml.snakeyaml.emitter.EventConstructor; 28 import org.yaml.snakeyaml.events.CollectionStartEvent; 29 import org.yaml.snakeyaml.events.Event; 30 import org.yaml.snakeyaml.events.MappingStartEvent; 31 import org.yaml.snakeyaml.events.NodeEvent; 32 import org.yaml.snakeyaml.events.ScalarEvent; 33 import org.yaml.snakeyaml.events.SequenceStartEvent; 34 import org.yaml.snakeyaml.parser.Parser; 35 import org.yaml.snakeyaml.parser.ParserImpl; 36 import org.yaml.snakeyaml.reader.StreamReader; 37 import org.yaml.snakeyaml.reader.UnicodeReader; 38 39 /** 40 * imported from PyYAML 41 */ 42 public class PyEmitterTest extends PyImportTest { 43 testEmitterOnData()44 public void testEmitterOnData() { 45 _testEmitter(".data", false); 46 } 47 testEmitterOnCanonicalNormally()48 public void testEmitterOnCanonicalNormally() { 49 _testEmitter(".canonical", false); 50 } 51 testEmitterOnCanonicalCanonically()52 public void testEmitterOnCanonicalCanonically() { 53 _testEmitter(".canonical", true); 54 } 55 _testEmitter(String mask, boolean canonical)56 private void _testEmitter(String mask, boolean canonical) { 57 File[] files = getStreamsByExtension(mask, true); 58 assertTrue("No test files found.", files.length > 0); 59 for (File file : files) { 60 // if (!file.getName().contains("spec-06-01.canonical")) { 61 // continue; 62 // } 63 try { 64 InputStream input = new FileInputStream(file); 65 List<Event> events = parse(input); 66 input.close(); 67 // 68 StringWriter stream = new StringWriter(); 69 DumperOptions options = new DumperOptions(); 70 options.setCanonical(canonical); 71 Emitter emitter = new Emitter(stream, options); 72 for (Event event : events) { 73 emitter.emit(event); 74 } 75 // 76 String data = stream.toString(); 77 List<Event> newEvents = new ArrayList<Event>(); 78 StreamReader reader = new StreamReader(data); 79 Parser parser = new ParserImpl(reader); 80 while (parser.peekEvent() != null) { 81 Event event = parser.getEvent(); 82 newEvents.add(event); 83 } 84 // check 85 assertEquals(events.size(), newEvents.size()); 86 Iterator<Event> iter1 = events.iterator(); 87 Iterator<Event> iter2 = newEvents.iterator(); 88 while (iter1.hasNext()) { 89 Event event = iter1.next(); 90 Event newEvent = iter2.next(); 91 assertEquals(event.getClass().getName(), newEvent.getClass().getName()); 92 if (event instanceof NodeEvent) { 93 NodeEvent e1 = (NodeEvent) event; 94 NodeEvent e2 = (NodeEvent) newEvent; 95 assertEquals(e1.getAnchor(), e2.getAnchor()); 96 } 97 if (event instanceof CollectionStartEvent) { 98 CollectionStartEvent e1 = (CollectionStartEvent) event; 99 CollectionStartEvent e2 = (CollectionStartEvent) newEvent; 100 assertEquals(e1.getTag(), e2.getTag()); 101 } 102 if (event instanceof ScalarEvent) { 103 ScalarEvent e1 = (ScalarEvent) event; 104 ScalarEvent e2 = (ScalarEvent) newEvent; 105 if (e1.getImplicit().bothFalse() && e2.getImplicit().bothFalse()) { 106 assertEquals(e1.getTag(), e2.getTag()); 107 } 108 assertEquals(e1.getValue(), e2.getValue()); 109 } 110 } 111 } catch (Exception e) { 112 System.out.println("Failed File: " + file); 113 // fail("Failed File: " + file + "; " + e.getMessage()); 114 throw new RuntimeException(e); 115 } 116 } 117 } 118 testEmitterStyles()119 public void testEmitterStyles() { 120 File[] canonicalFiles = getStreamsByExtension(".canonical", false); 121 assertTrue("No test files found.", canonicalFiles.length > 0); 122 File[] dataFiles = getStreamsByExtension(".data", true); 123 assertTrue("No test files found.", dataFiles.length > 0); 124 List<File> allFiles = new ArrayList<File>(Arrays.asList(canonicalFiles)); 125 allFiles.addAll(Arrays.asList(dataFiles)); 126 for (File file : allFiles) { 127 try { 128 List<Event> events = new ArrayList<Event>(); 129 InputStream input = new FileInputStream(file); 130 StreamReader reader = new StreamReader(new UnicodeReader(input)); 131 Parser parser = new ParserImpl(reader); 132 while (parser.peekEvent() != null) { 133 Event event = parser.getEvent(); 134 events.add(event); 135 } 136 input.close(); 137 // 138 for (DumperOptions.FlowStyle flowStyle : DumperOptions.FlowStyle.values()) { 139 for (DumperOptions.ScalarStyle style : DumperOptions.ScalarStyle.values()) { 140 List<Event> styledEvents = new ArrayList<Event>(); 141 for (Event event : events) { 142 if (event instanceof ScalarEvent) { 143 ScalarEvent scalar = (ScalarEvent) event; 144 event = new ScalarEvent(scalar.getAnchor(), scalar.getTag(), scalar.getImplicit(), 145 scalar.getValue(), scalar.getStartMark(), scalar.getEndMark(), style); 146 } else if (event instanceof SequenceStartEvent) { 147 SequenceStartEvent seqStart = (SequenceStartEvent) event; 148 event = new SequenceStartEvent(seqStart.getAnchor(), seqStart.getTag(), 149 seqStart.getImplicit(), seqStart.getStartMark(), seqStart.getEndMark(), 150 flowStyle); 151 } else if (event instanceof MappingStartEvent) { 152 MappingStartEvent mapStart = (MappingStartEvent) event; 153 event = new MappingStartEvent(mapStart.getAnchor(), mapStart.getTag(), 154 mapStart.getImplicit(), mapStart.getStartMark(), mapStart.getEndMark(), 155 flowStyle); 156 } 157 styledEvents.add(event); 158 } 159 // emit 160 String data = emit(styledEvents); 161 List<Event> newEvents = parse(data); 162 assertEquals("Events must not change. File: " + file, events.size(), newEvents.size()); 163 Iterator<Event> oldIter = events.iterator(); 164 Iterator<Event> newIter = newEvents.iterator(); 165 while (oldIter.hasNext()) { 166 Event event = oldIter.next(); 167 Event newEvent = newIter.next(); 168 assertEquals(event.getClass(), newEvent.getClass()); 169 if (event instanceof NodeEvent) { 170 assertEquals(((NodeEvent) event).getAnchor(), ((NodeEvent) newEvent).getAnchor()); 171 } 172 if (event instanceof CollectionStartEvent) { 173 assertEquals(((CollectionStartEvent) event).getTag(), 174 ((CollectionStartEvent) newEvent).getTag()); 175 } 176 if (event instanceof ScalarEvent) { 177 ScalarEvent scalarOld = (ScalarEvent) event; 178 ScalarEvent scalarNew = (ScalarEvent) newEvent; 179 if (scalarOld.getImplicit().bothFalse() && scalarNew.getImplicit().bothFalse()) { 180 assertEquals(scalarOld.getTag(), scalarNew.getTag()); 181 } 182 assertEquals(scalarOld.getValue(), scalarNew.getValue()); 183 } 184 } 185 } 186 } 187 188 } catch (Exception e) { 189 System.out.println("Failed File: " + file); 190 // fail("Failed File: " + file + "; " + e.getMessage()); 191 throw new RuntimeException(e); 192 } 193 } 194 } 195 emit(List<Event> events)196 private String emit(List<Event> events) throws IOException { 197 StringWriter writer = new StringWriter(); 198 Emitter emitter = new Emitter(writer, new DumperOptions()); 199 for (Event event : events) { 200 emitter.emit(event); 201 } 202 return writer.toString(); 203 } 204 parse(String data)205 private List<Event> parse(String data) { 206 ParserImpl parser = new ParserImpl(new StreamReader(data)); 207 List<Event> newEvents = new ArrayList<Event>(); 208 while (parser.peekEvent() != null) { 209 newEvents.add(parser.getEvent()); 210 } 211 return newEvents; 212 } 213 214 @SuppressWarnings("unchecked") testEmitterEvents()215 public void testEmitterEvents() { 216 File[] files = getStreamsByExtension(".events", false); 217 assertTrue("No test files found.", files.length > 0); 218 for (File file : files) { 219 // if (!file.getName().contains("spec-06-01.canonical")) { 220 // continue; 221 // } 222 try { 223 List<Event> events = new ArrayList<Event>(); 224 String content = getResource(file.getName()); 225 events = (List<Event>) load(new EventConstructor(), content); 226 // 227 StringWriter stream = new StringWriter(); 228 Emitter emitter = new Emitter(stream, new DumperOptions()); 229 for (Event event : events) { 230 emitter.emit(event); 231 } 232 // 233 String data = stream.toString(); 234 List<Event> newEvents = new ArrayList<Event>(); 235 StreamReader reader = new StreamReader(data); 236 Parser parser = new ParserImpl(reader); 237 while (parser.peekEvent() != null) { 238 Event event = parser.getEvent(); 239 newEvents.add(event); 240 } 241 // check 242 assertEquals(events.size(), newEvents.size()); 243 Iterator<Event> iter1 = events.iterator(); 244 Iterator<Event> iter2 = newEvents.iterator(); 245 while (iter1.hasNext()) { 246 Event event = iter1.next(); 247 Event newEvent = iter2.next(); 248 assertEquals(event.getClass().getName(), newEvent.getClass().getName()); 249 if (event instanceof NodeEvent) { 250 NodeEvent e1 = (NodeEvent) event; 251 NodeEvent e2 = (NodeEvent) newEvent; 252 assertEquals(e1.getAnchor(), e2.getAnchor()); 253 } 254 if (event instanceof CollectionStartEvent) { 255 CollectionStartEvent e1 = (CollectionStartEvent) event; 256 CollectionStartEvent e2 = (CollectionStartEvent) newEvent; 257 assertEquals(e1.getTag(), e2.getTag()); 258 } 259 if (event instanceof ScalarEvent) { 260 ScalarEvent e1 = (ScalarEvent) event; 261 ScalarEvent e2 = (ScalarEvent) newEvent; 262 if (e1.getImplicit().canOmitTagInPlainScalar() == e2.getImplicit() 263 .canOmitTagInPlainScalar() 264 && e1.getImplicit().canOmitTagInNonPlainScalar() == e2.getImplicit() 265 .canOmitTagInNonPlainScalar()) { 266 267 } else { 268 if ((e1.getTag() == null || e2.getTag() == null) || e1.getTag().equals(e2.getTag())) { 269 } else { 270 System.out.println("tag1: " + e1.getTag()); 271 System.out.println("tag2: " + e2.getTag()); 272 fail("in file: " + file); 273 } 274 } 275 assertEquals(e1.getValue(), e2.getValue()); 276 } 277 } 278 } catch (Exception e) { 279 System.out.println("Failed File: " + file); 280 // fail("Failed File: " + file + "; " + e.getMessage()); 281 throw new RuntimeException(e); 282 } 283 } 284 } 285 } 286