xref: /aosp_15_r20/external/snakeyaml/src/test/java/org/pyyaml/PyEmitterTest.java (revision ac2a7c1bf4e14d82f3bd566dcc2d76d5b42faf34)
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