package com.ibatis.jpetstore.domain;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import junit.framework.TestCase;

import com.ibatis.common.beans.ClassInfo;
import com.ibatis.common.beans.Probe;
import com.ibatis.common.beans.ProbeFactory;
import com.ibatis.jpetstore.presentation.AccountBean;
import com.ibatis.jpetstore.presentation.CartBean;
import com.ibatis.jpetstore.presentation.CatalogBean;
import com.ibatis.jpetstore.presentation.OrderBean;

public class BeanTest extends TestCase {

    private Class[] classes = new Class[] { Account.class, Cart.class, CartItem.class, Category.class, Item.class,
            LineItem.class, Order.class, Product.class, Sequence.class, AccountBean.class, CartBean.class, CatalogBean.class,
            OrderBean.class };

    public void testAllReadWriteProperties() {
        try {
            for (int i = 0; i < classes.length; i++) {
                Object object = classes[i].newInstance();
                ClassInfo info = ClassInfo.getInstance(classes[i]);
                List writeables = Arrays.asList(info.getWriteablePropertyNames());
                List readables = Arrays.asList(info.getReadablePropertyNames());
                for (int j = 0; j < writeables.size(); j++) {
                    String writeable = (String) writeables.get(j);
                    if (readables.contains(writeable)) {
                        Class type = info.getGetterType(writeable);
                        Object sample = getSampleFor(type);
                        Probe probe = ProbeFactory.getProbe(object);
                        probe.setObject(object, writeable, sample);
                        assertEquals(sample, probe.getObject(object, writeable));
                    }
                }
            }
        } catch (Exception e) {
            throw new RuntimeException("Error. ", e);
        }
    }

    public Object getSampleFor(Class type) {
        Map sampleMap = new HashMap();
        sampleMap.put(String.class, "Hello");
        sampleMap.put(Integer.class, new Integer(1));
        sampleMap.put(int.class, new Integer(1));
        sampleMap.put(Long.class, new Long(1));
        sampleMap.put(long.class, new Long(1));
        sampleMap.put(Double.class, new Double(1));
        sampleMap.put(double.class, new Double(1));
        sampleMap.put(Float.class, new Float(1));
        sampleMap.put(float.class, new Float(1));
        sampleMap.put(Short.class, new Short((short) 1));
        sampleMap.put(short.class, new Short((short) 1));
        sampleMap.put(Character.class, new Integer(1));
        sampleMap.put(char.class, new Integer(1));
        sampleMap.put(Date.class, new Date());
        sampleMap.put(boolean.class, new Boolean(true));
        sampleMap.put(Boolean.class, new Boolean(true));
        sampleMap.put(BigDecimal.class, new BigDecimal("1.00"));
        sampleMap.put(BigInteger.class, new BigInteger("1"));
        sampleMap.put(List.class, new ArrayList());
        sampleMap.put(List.class, new ArrayList());
        if (!sampleMap.containsKey(type)) {
            try {
                sampleMap.put(type, type.newInstance());
            } catch (Exception e) {
                // ignore on purpose...we don't care if this fails
            }
        }
        return sampleMap.get(type);
    }

}
