/**
 * Copyright (c) 2008-2011, 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 examples;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import junit.framework.TestCase;

import org.yaml.snakeyaml.Util;
import org.yaml.snakeyaml.Yaml;

public class AnyObjectExampleTest extends TestCase {
    @SuppressWarnings("unchecked")
    public void testLoad() throws IOException {
        String doc = Util.getLocalResource("examples/any-object-example.yaml");
        Yaml yaml = new Yaml();
        Map<String, Object> object = (Map<String, Object>) yaml.load(doc);
        assertEquals(6, object.size());
        assertEquals("[null, null]", object.get("none").toString());
        List list1 = (List) object.get("none");
        assertEquals(2, list1.size());
        for (Object object2 : list1) {
            assertNull(object2);
        }
        //
        assertEquals("[true, false, true, false]", object.get("bool").toString());
        assertEquals(4, ((List) object.get("bool")).size());
        //
        assertEquals(new Integer(42), object.get("int"));
        assertEquals(new Double(3.14159), object.get("float"));
        //
        assertEquals("[LITE, RES_ACID, SUS_DEXT]", object.get("list").toString());
        List list2 = (List) object.get("list");
        assertEquals(3, list2.size());
        for (Object object2 : list2) {
            assertEquals(object2.toString(), object2.toString().toUpperCase());
        }
        //
        assertEquals("{hp=13, sp=5}", object.get("dict").toString());
        Map<String, Integer> map = (Map<String, Integer>) object.get("dict");
        assertEquals(2, map.keySet().size());
        assertEquals(new Integer(13), map.get("hp"));
        assertEquals(new Integer(5), map.get("sp"));
    }
}
