/**
* Copyright (c) 2008, http://www.snakeyaml.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.pyyaml;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.emitter.Emitter;
import org.yaml.snakeyaml.emitter.EventConstructor;
import org.yaml.snakeyaml.events.CollectionStartEvent;
import org.yaml.snakeyaml.events.Event;
import org.yaml.snakeyaml.events.MappingStartEvent;
import org.yaml.snakeyaml.events.NodeEvent;
import org.yaml.snakeyaml.events.ScalarEvent;
import org.yaml.snakeyaml.events.SequenceStartEvent;
import org.yaml.snakeyaml.parser.Parser;
import org.yaml.snakeyaml.parser.ParserImpl;
import org.yaml.snakeyaml.reader.StreamReader;
import org.yaml.snakeyaml.reader.UnicodeReader;
/**
* imported from PyYAML
*/
public class PyEmitterTest extends PyImportTest {
public void testEmitterOnData() {
_testEmitter(".data", false);
}
public void testEmitterOnCanonicalNormally() {
_testEmitter(".canonical", false);
}
public void testEmitterOnCanonicalCanonically() {
_testEmitter(".canonical", true);
}
private void _testEmitter(String mask, boolean canonical) {
File[] files = getStreamsByExtension(mask, true);
assertTrue("No test files found.", files.length > 0);
for (File file : files) {
// if (!file.getName().contains("spec-06-01.canonical")) {
// continue;
// }
try {
InputStream input = new FileInputStream(file);
List<Event> events = parse(input);
input.close();
//
StringWriter stream = new StringWriter();
DumperOptions options = new DumperOptions();
options.setCanonical(canonical);
Emitter emitter = new Emitter(stream, options);
for (Event event : events) {
emitter.emit(event);
}
//
String data = stream.toString();
List<Event> newEvents = new ArrayList<Event>();
StreamReader reader = new StreamReader(data);
Parser parser = new ParserImpl(reader);
while (parser.peekEvent() != null) {
Event event = parser.getEvent();
newEvents.add(event);
}
// check
assertEquals(events.size(), newEvents.size());
Iterator<Event> iter1 = events.iterator();
Iterator<Event> iter2 = newEvents.iterator();
while (iter1.hasNext()) {
Event event = iter1.next();
Event newEvent = iter2.next();
assertEquals(event.getClass().getName(), newEvent.getClass().getName());
if (event instanceof NodeEvent) {
NodeEvent e1 = (NodeEvent) event;
NodeEvent e2 = (NodeEvent) newEvent;
assertEquals(e1.getAnchor(), e2.getAnchor());
}
if (event instanceof CollectionStartEvent) {
CollectionStartEvent e1 = (CollectionStartEvent) event;
CollectionStartEvent e2 = (CollectionStartEvent) newEvent;
assertEquals(e1.getTag(), e2.getTag());
}
if (event instanceof ScalarEvent) {
ScalarEvent e1 = (ScalarEvent) event;
ScalarEvent e2 = (ScalarEvent) newEvent;
if (e1.getImplicit().bothFalse() && e2.getImplicit().bothFalse()) {
assertEquals(e1.getTag(), e2.getTag());
}
assertEquals(e1.getValue(), e2.getValue());
}
}
} catch (Exception e) {
System.out.println("Failed File: " + file);
// fail("Failed File: " + file + "; " + e.getMessage());
throw new RuntimeException(e);
}
}
}
public void testEmitterStyles() {
File[] canonicalFiles = getStreamsByExtension(".canonical", false);
assertTrue("No test files found.", canonicalFiles.length > 0);
File[] dataFiles = getStreamsByExtension(".data", true);
assertTrue("No test files found.", dataFiles.length > 0);
List<File> allFiles = new ArrayList<File>(Arrays.asList(canonicalFiles));
allFiles.addAll(Arrays.asList(dataFiles));
for (File file : allFiles) {
try {
List<Event> events = new ArrayList<Event>();
InputStream input = new FileInputStream(file);
StreamReader reader = new StreamReader(new UnicodeReader(input));
Parser parser = new ParserImpl(reader);
while (parser.peekEvent() != null) {
Event event = parser.getEvent();
events.add(event);
}
input.close();
//
for (Boolean flowStyle : new Boolean[] { Boolean.FALSE, Boolean.TRUE }) {
for (DumperOptions.ScalarStyle style : DumperOptions.ScalarStyle.values()) {
List<Event> styledEvents = new ArrayList<Event>();
for (Event event : events) {
if (event instanceof ScalarEvent) {
ScalarEvent scalar = (ScalarEvent) event;
event = new ScalarEvent(scalar.getAnchor(), scalar.getTag(),
scalar.getImplicit(), scalar.getValue(),
scalar.getStartMark(), scalar.getEndMark(), style.getChar());
} else if (event instanceof SequenceStartEvent) {
SequenceStartEvent seqStart = (SequenceStartEvent) event;
event = new SequenceStartEvent(seqStart.getAnchor(),
seqStart.getTag(), seqStart.getImplicit(),
seqStart.getStartMark(), seqStart.getEndMark(), flowStyle);
} else if (event instanceof MappingStartEvent) {
MappingStartEvent mapStart = (MappingStartEvent) event;
event = new MappingStartEvent(mapStart.getAnchor(),
mapStart.getTag(), mapStart.getImplicit(),
mapStart.getStartMark(), mapStart.getEndMark(), flowStyle);
}
styledEvents.add(event);
}
// emit
String data = emit(styledEvents);
List<Event> newEvents = parse(data);
assertEquals("Events must not change. File: " + file, events.size(),
newEvents.size());
Iterator<Event> oldIter = events.iterator();
Iterator<Event> newIter = newEvents.iterator();
while (oldIter.hasNext()) {
Event event = oldIter.next();
Event newEvent = newIter.next();
assertEquals(event.getClass(), newEvent.getClass());
if (event instanceof NodeEvent) {
assertEquals(((NodeEvent) event).getAnchor(),
((NodeEvent) newEvent).getAnchor());
}
if (event instanceof CollectionStartEvent) {
assertEquals(((CollectionStartEvent) event).getTag(),
((CollectionStartEvent) newEvent).getTag());
}
if (event instanceof ScalarEvent) {
ScalarEvent scalarOld = (ScalarEvent) event;
ScalarEvent scalarNew = (ScalarEvent) newEvent;
if (scalarOld.getImplicit().bothFalse()
&& scalarNew.getImplicit().bothFalse()) {
assertEquals(scalarOld.getTag(), scalarNew.getTag());
}
assertEquals(scalarOld.getValue(), scalarNew.getValue());
}
}
}
}
} catch (Exception e) {
System.out.println("Failed File: " + file);
// fail("Failed File: " + file + "; " + e.getMessage());
throw new RuntimeException(e);
}
}
}
private String emit(List<Event> events) throws IOException {
StringWriter writer = new StringWriter();
Emitter emitter = new Emitter(writer, new DumperOptions());
for (Event event : events) {
emitter.emit(event);
}
return writer.toString();
}
private List<Event> parse(String data) {
ParserImpl parser = new ParserImpl(new StreamReader(data));
List<Event> newEvents = new ArrayList<Event>();
while (parser.peekEvent() != null) {
newEvents.add(parser.getEvent());
}
return newEvents;
}
@SuppressWarnings("unchecked")
public void testEmitterEvents() {
File[] files = getStreamsByExtension(".events", false);
assertTrue("No test files found.", files.length > 0);
for (File file : files) {
// if (!file.getName().contains("spec-06-01.canonical")) {
// continue;
// }
try {
List<Event> events = new ArrayList<Event>();
String content = getResource(file.getName());
events = (List<Event>) load(new EventConstructor(), content);
//
StringWriter stream = new StringWriter();
Emitter emitter = new Emitter(stream, new DumperOptions());
for (Event event : events) {
emitter.emit(event);
}
//
String data = stream.toString();
List<Event> newEvents = new ArrayList<Event>();
StreamReader reader = new StreamReader(data);
Parser parser = new ParserImpl(reader);
while (parser.peekEvent() != null) {
Event event = parser.getEvent();
newEvents.add(event);
}
// check
assertEquals(events.size(), newEvents.size());
Iterator<Event> iter1 = events.iterator();
Iterator<Event> iter2 = newEvents.iterator();
while (iter1.hasNext()) {
Event event = iter1.next();
Event newEvent = iter2.next();
assertEquals(event.getClass().getName(), newEvent.getClass().getName());
if (event instanceof NodeEvent) {
NodeEvent e1 = (NodeEvent) event;
NodeEvent e2 = (NodeEvent) newEvent;
assertEquals(e1.getAnchor(), e2.getAnchor());
}
if (event instanceof CollectionStartEvent) {
CollectionStartEvent e1 = (CollectionStartEvent) event;
CollectionStartEvent e2 = (CollectionStartEvent) newEvent;
assertEquals(e1.getTag(), e2.getTag());
}
if (event instanceof ScalarEvent) {
ScalarEvent e1 = (ScalarEvent) event;
ScalarEvent e2 = (ScalarEvent) newEvent;
if (e1.getImplicit().canOmitTagInPlainScalar() == e2.getImplicit()
.canOmitTagInPlainScalar()
&& e1.getImplicit().canOmitTagInNonPlainScalar() == e2
.getImplicit().canOmitTagInNonPlainScalar()) {
} else {
if ((e1.getTag() == null || e2.getTag() == null)
|| e1.getTag().equals(e2.getTag())) {
} else {
System.out.println("tag1: " + e1.getTag());
System.out.println("tag2: " + e2.getTag());
fail("in file: " + file);
}
}
assertEquals(e1.getValue(), e2.getValue());
}
}
} catch (Exception e) {
System.out.println("Failed File: " + file);
// fail("Failed File: " + file + "; " + e.getMessage());
throw new RuntimeException(e);
}
}
}
}