1/**
2 * Copyright (c) 2008, http://www.snakeyaml.org
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.yaml.snakeyaml;
17
18import java.io.ByteArrayOutputStream;
19import java.io.InputStream;
20import java.io.OutputStreamWriter;
21import java.io.UnsupportedEncodingException;
22import java.util.ArrayList;
23import java.util.Iterator;
24import java.util.List;
25import java.util.Map;
26
27import junit.framework.AssertionFailedError;
28
29public class YamlStream {
30    private List<Object> nativeData = new ArrayList<Object>();
31
32    public YamlStream(String sourceName) {
33        InputStream input = YamlDocument.class.getClassLoader().getResourceAsStream(
34                YamlDocument.ROOT + sourceName);
35        Yaml yaml = new Yaml();
36        for (Object document : yaml.loadAll(input)) {
37            nativeData.add(document);
38        }
39        ByteArrayOutputStream output = new ByteArrayOutputStream();
40        yaml.dumpAll(nativeData.iterator(), new OutputStreamWriter(output));
41        String presentation;
42        try {
43            presentation = output.toString("UTF-8");
44        } catch (UnsupportedEncodingException e) {
45            throw new RuntimeException(e);
46        }
47        // try to read generated presentation to prove that the presentation
48        // is identical to the source
49        List<Object> parsedNativeData = new ArrayList<Object>();
50        for (Object document : yaml.loadAll(presentation)) {
51            parsedNativeData.add(document);
52        }
53        if (nativeData.getClass() != parsedNativeData.getClass()) {
54            throw new AssertionFailedError("Different class: " + parsedNativeData.getClass());
55        }
56        if (nativeData.size() != parsedNativeData.size()) {
57            throw new AssertionFailedError("Different size.");
58        }
59        Iterator<Object> piterator = parsedNativeData.iterator();
60        Iterator<Object> niterator = nativeData.iterator();
61        while (piterator.hasNext()) {
62            Object obj1 = niterator.next();
63            Object obj2 = piterator.next();
64            if (obj1 instanceof Map) {
65                @SuppressWarnings("unchecked")
66                Map<Object, Object> map1 = (Map<Object, Object>) obj1;
67                @SuppressWarnings("unchecked")
68                Map<Object, Object> map2 = (Map<Object, Object>) obj2;
69                if (!map1.keySet().equals(map2.keySet())) {
70                    throw new AssertionFailedError("Keyset: " + map1.keySet() + "; but was: "
71                            + map2.keySet());
72                }
73                for (Iterator<Object> iterator = map1.keySet().iterator(); iterator.hasNext();) {
74                    Object key = iterator.next();
75                    Object o1 = map1.get(key);
76                    Object o2 = map2.get(key);
77                    if (!o1.equals(o2)) {
78                        throw new AssertionFailedError("Values: " + o1 + "; but was: " + o2);
79                    }
80                }
81            }
82            if (!obj1.equals(obj2)) {
83                throw new AssertionFailedError("Expected: " + obj1 + "; but was: " + obj2);
84            }
85        }
86        if (!parsedNativeData.equals(nativeData)) {
87            throw new AssertionFailedError("Generated presentation is not the same: "
88                    + presentation);
89        }
90    }
91
92    public List<Object> getNativeData() {
93        return nativeData;
94    }
95}
96