Home | History | Annotate | Download | only in snakeyaml
      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  */
     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 }
     96