View Javadoc

1   /**
2    * Copyright (c) 2008-2012, 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   */
16  package org.yaml.snakeyaml;
17  
18  import java.io.ByteArrayOutputStream;
19  import java.io.InputStream;
20  import java.io.OutputStreamWriter;
21  import java.io.UnsupportedEncodingException;
22  import java.util.ArrayList;
23  import java.util.Iterator;
24  import java.util.List;
25  import java.util.Map;
26  
27  import junit.framework.AssertionFailedError;
28  
29  public 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  }