/**
 * Copyright (c) 2008-2010, http://code.google.com/p/snakeyaml/
 *
 * 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.issue82;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import junit.framework.TestCase;

import org.yaml.snakeyaml.JavaBeanDumper;
import org.yaml.snakeyaml.JavaBeanLoader;
import org.yaml.snakeyaml.TypeDescription;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;
import org.yaml.snakeyaml.nodes.Tag;
import org.yaml.snakeyaml.representer.Representer;

/**
 * @see issue 82: property order influence when aliased in generic collection
 */
public class PropOrderInfluenceWhenAliasedInGenericCollectionTest extends TestCase {

    public static interface Account {
    }

    public static class GeneralAccount implements Account {
        public String name = "General";
    }

    public static class SuperSaverAccount extends GeneralAccount {

        public SuperSaverAccount() {
            name = "SuperSaver";
        }
    }

    public static class CustomerAB {
        public Collection<Account> aAll;
        public Collection<GeneralAccount> bGeneral;

        @Override
        public String toString() {
            return "CustomerAB";
        }
    }

    public static class CustomerBA {
        public Collection<GeneralAccount> aGeneral;
        public Collection<Account> bAll;
    }

    public static class CustomerAB_MapValue {
        public Collection<Account> aAll;
        public Map<String, GeneralAccount> bGeneralMap;

        @Override
        public String toString() {
            return "CustomerAB_MapValue";
        }
    }

    public static class CustomerAB_MapKey {
        public Collection<Account> aAll;
        public Map<GeneralAccount, String> bGeneralMap;

        @Override
        public String toString() {
            return "CustomerAB_MapKey";
        }
    }

    public void testAB() {
        SuperSaverAccount supersaver = new SuperSaverAccount();
        GeneralAccount generalAccount = new GeneralAccount();

        CustomerAB customerAB = new CustomerAB();
        ArrayList<Account> all = new ArrayList<Account>();
        all.add(supersaver);
        all.add(generalAccount);
        ArrayList<GeneralAccount> general = new ArrayList<GeneralAccount>();
        general.add(generalAccount);
        general.add(supersaver);

        customerAB.aAll = all;
        customerAB.bGeneral = general;

        Yaml yaml = new Yaml();
        String dump = yaml.dump(customerAB);
        // System.out.println(dump);
        CustomerAB parsed = (CustomerAB) yaml.load(dump);
        assertNotNull(parsed);
    }

    public void testAB_Set() {
        SuperSaverAccount supersaver = new SuperSaverAccount();
        GeneralAccount generalAccount = new GeneralAccount();

        CustomerAB customerAB = new CustomerAB();
        ArrayList<Account> all = new ArrayList<Account>();
        all.add(supersaver);
        all.add(generalAccount);
        Set<GeneralAccount> general = new HashSet<GeneralAccount>();
        general.add(generalAccount);
        general.add(supersaver);

        customerAB.aAll = all;
        customerAB.bGeneral = general;

        Yaml yaml = new Yaml();
        String dump = yaml.dump(customerAB);
        // System.out.println(dump);
        CustomerAB parsed = (CustomerAB) yaml.load(dump);
        assertNotNull(parsed);
    }

    public void testABWithCustomTag() {
        SuperSaverAccount supersaver = new SuperSaverAccount();
        GeneralAccount generalAccount = new GeneralAccount();

        CustomerAB customerAB = new CustomerAB();
        ArrayList<Account> all = new ArrayList<Account>();
        all.add(supersaver);
        all.add(generalAccount);
        ArrayList<GeneralAccount> general = new ArrayList<GeneralAccount>();
        general.add(generalAccount);
        general.add(supersaver);

        customerAB.aAll = all;
        customerAB.bGeneral = general;

        Constructor constructor = new Constructor();
        Representer representer = new Representer();
        Tag generalAccountTag = new Tag("!GA");
        constructor
                .addTypeDescription(new TypeDescription(GeneralAccount.class, generalAccountTag));
        representer.addClassTag(GeneralAccount.class, generalAccountTag);

        Yaml yaml = new Yaml(constructor, representer);
        String dump = yaml.dump(customerAB);
        // System.out.println(dump);
        CustomerAB parsed = (CustomerAB) yaml.load(dump);
        assertNotNull(parsed);
    }

    public void testABwithJavaBeanHelpers() {
        SuperSaverAccount supersaver = new SuperSaverAccount();
        GeneralAccount generalAccount = new GeneralAccount();

        CustomerAB customerAB = new CustomerAB();
        ArrayList<Account> all = new ArrayList<Account>();
        all.add(supersaver);
        all.add(generalAccount);
        ArrayList<GeneralAccount> general = new ArrayList<GeneralAccount>();
        general.add(generalAccount);
        general.add(supersaver);

        customerAB.aAll = all;
        customerAB.bGeneral = general;

        JavaBeanDumper dumper = new JavaBeanDumper();
        String dump2 = dumper.dump(customerAB);
        // System.out.println(dump2);
        JavaBeanLoader<CustomerAB> loader = new JavaBeanLoader<CustomerAB>(CustomerAB.class);
        CustomerAB parsed = loader.load(dump2);
        assertNotNull(parsed);
    }

    public void testAB_asMapValue() {
        SuperSaverAccount supersaver = new SuperSaverAccount();
        GeneralAccount generalAccount = new GeneralAccount();

        CustomerAB_MapValue customerAB_mapValue = new CustomerAB_MapValue();
        ArrayList<Account> all = new ArrayList<Account>();
        all.add(supersaver);
        all.add(generalAccount);
        Map<String, GeneralAccount> generalMap = new HashMap<String, GeneralAccount>();
        generalMap.put(generalAccount.name, generalAccount);
        generalMap.put(supersaver.name, supersaver);

        customerAB_mapValue.aAll = all;
        customerAB_mapValue.bGeneralMap = generalMap;

        Yaml yaml = new Yaml();
        String dump = yaml.dump(customerAB_mapValue);
        // System.out.println(dump);
        CustomerAB_MapValue parsed = (CustomerAB_MapValue) yaml.load(dump);
        assertNotNull(parsed);
    }

    public void testAB_asMapKey() {
        SuperSaverAccount supersaver = new SuperSaverAccount();
        GeneralAccount generalAccount = new GeneralAccount();

        CustomerAB_MapKey customerAB_mapKey = new CustomerAB_MapKey();
        ArrayList<Account> all = new ArrayList<Account>();
        all.add(supersaver);
        all.add(generalAccount);
        Map<GeneralAccount, String> generalMap = new HashMap<GeneralAccount, String>();
        generalMap.put(generalAccount, generalAccount.name);
        generalMap.put(supersaver, supersaver.name);

        customerAB_mapKey.aAll = all;
        customerAB_mapKey.bGeneralMap = generalMap;

        Yaml yaml = new Yaml();
        String dump = yaml.dump(customerAB_mapKey);
        // System.out.println(dump);
        CustomerAB_MapKey parsed = (CustomerAB_MapKey) yaml.load(dump);
        assertNotNull(parsed);
    }

    public void testBA() {
        SuperSaverAccount supersaver = new SuperSaverAccount();
        GeneralAccount generalAccount = new GeneralAccount();

        CustomerBA customerBA = new CustomerBA();
        ArrayList<Account> all = new ArrayList<Account>();
        all.add(supersaver);
        all.add(generalAccount);
        ArrayList<GeneralAccount> general = new ArrayList<GeneralAccount>();
        general.add(generalAccount);
        general.add(supersaver);

        customerBA.aGeneral = general;
        customerBA.bAll = all;

        Yaml yaml = new Yaml();
        String dump = yaml.dump(customerBA);
        // System.out.println(dump);
        //
        CustomerBA parsed = (CustomerBA) yaml.load(dump);
        assertEquals(2, parsed.bAll.size());
        assertEquals(2, parsed.aGeneral.size());
        assertFalse(parsed.bAll.equals(parsed.aGeneral));
        GeneralAccount[] array = parsed.aGeneral.toArray(new GeneralAccount[2]);
        assertEquals(GeneralAccount.class, array[0].getClass());
        assertEquals(SuperSaverAccount.class, array[1].getClass());
        assertEquals("SuperSaver", array[1].name);
    }
}
