/**
 * 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 org.yaml.snakeyaml.issues.issue103;

import java.util.List;
import java.util.Map;
import java.util.Set;

import junit.framework.TestCase;

import org.yaml.snakeyaml.Util;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;

public class MergingTest extends TestCase {

    public void testMergeWithDefaultMap() {
        String input = Util.getLocalResource("issues/issue103.yaml");
        // System.out.println(input);
        Yaml yaml = new Yaml();

        Map map = (Map) yaml.load(input);

        check(map);
    }

    public void testMergeWithFakeMap() {
        String input = Util.getLocalResource("issues/issue103.yaml");
        // System.out.println(input);
        Constructor c = new Constructor() {
            protected java.util.Map<Object, Object> createDefaultMap() {
                return new FakeMap<Object, Object>();
            };
        };

        Yaml yaml = new Yaml(c);

        FakeMap map = (FakeMap) yaml.load(input);

        check(map);
    }

    private void check(Map map) {

        assertEquals(2, map.size());
        assertTrue(map.containsKey("input"));
        assertTrue(map.containsKey("result"));

        // input: ...
        List<Map<?, ?>> inputList = (List<Map<?, ?>>) map.get("input");
        assertEquals(4, inputList.size());

        Map<?, ?> center = inputList.get(0);
        assertEquals(2, center.size());
        assertEquals(Integer.valueOf(1), center.get("x"));
        assertEquals(Integer.valueOf(2), center.get("y"));

        Map<?, ?> left = inputList.get(1);
        assertEquals(2, left.size());
        assertEquals(Integer.valueOf(0), left.get("x"));
        assertEquals(Integer.valueOf(2), left.get("y"));

        Map<?, ?> big = inputList.get(2);
        assertEquals(1, big.size());
        assertEquals(Integer.valueOf(10), big.get("r"));

        Map<?, ?> small = inputList.get(3);
        assertEquals(1, small.size());
        assertEquals(Integer.valueOf(1), small.get("r"));

        // result : ...
        List<Map<?, ?>> resultList = (List<Map<?, ?>>) map.get("result");
        assertEquals(5, resultList.size());

        Map<?, ?> explicitKeys = resultList.get(0);
        assertEquals(4, explicitKeys.size());
        assertEquals(Integer.valueOf(1), explicitKeys.get("x"));
        assertEquals(Integer.valueOf(2), explicitKeys.get("y"));
        assertEquals(Integer.valueOf(10), explicitKeys.get("r"));
        assertEquals("center/big", explicitKeys.get("label"));

        Map<?, ?> merge_center = resultList.get(1);
        assertEquals(4, merge_center.size());
        assertEquals(Integer.valueOf(1), merge_center.get("x"));
        assertEquals(Integer.valueOf(2), merge_center.get("y"));
        assertEquals(Integer.valueOf(10), merge_center.get("r"));
        assertEquals("center/big", merge_center.get("label"));

        Map<?, ?> merge_left_override = resultList.get(2);
        assertEquals(4, merge_left_override.size());
        assertEquals(Integer.valueOf(0), merge_left_override.get("x"));
        assertEquals(Integer.valueOf(5), merge_left_override.get("y"));
        assertEquals(Integer.valueOf(10), merge_left_override.get("r"));
        assertEquals("center/big", merge_left_override.get("label"));

        Map<?, ?> merge_center_big = resultList.get(3);
        assertEquals(4, merge_center_big.size());
        assertEquals(Integer.valueOf(1), merge_center_big.get("x"));
        assertEquals(Integer.valueOf(2), merge_center_big.get("y"));
        assertEquals(Integer.valueOf(10), merge_center_big.get("r"));
        assertEquals("center/big", merge_center_big.get("label"));

        Map<?, ?> merge_big_left_small_override = resultList.get(4);
        assertEquals(4, merge_big_left_small_override.size());
        assertEquals(Integer.valueOf(1), merge_big_left_small_override.get("x"));
        assertEquals(Integer.valueOf(2), merge_big_left_small_override.get("y"));
        assertEquals(Integer.valueOf(10), merge_big_left_small_override.get("r"));
        assertEquals("center/big", merge_big_left_small_override.get("label"));

    }

}
