/*******************************************************************************
 * Copyright (c) 1998, 2012 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Oracle - initial API and implementation from Oracle TopLink
 ******************************************************************************/  
package org.eclipse.persistence.testing.sdo.model.dataobject;

import commonj.sdo.Property;
import java.util.ArrayList;
import java.util.List;
import junit.textui.TestRunner;
import org.eclipse.persistence.sdo.SDOConstants;
import org.eclipse.persistence.sdo.SDODataObject;
import org.eclipse.persistence.sdo.SDOProperty;
import org.eclipse.persistence.sdo.SDOType;
import org.eclipse.persistence.exceptions.SDOException;

public class SDODataObjectGetListConversionTest extends SDODataObjectConversionWithPathTestCases {
    public SDODataObjectGetListConversionTest(String name) {
        super(name);
    }    
      
    public static void main(String[] args) {
        String[] arguments = { "-c", "org.eclipse.persistence.testing.sdo.model.dataobject.SDODataObjectGetListConversionTest" };
        TestRunner.main(arguments);
    }

    //6. purpose: getList(Path) with path length 1: "a"
    public void testGetListConversionWithPath() {
        property_a_pathLength_1.setType(SDOConstants.SDO_STRINGS);
        property_a_pathLength_1.setMany(true);
        List b = new ArrayList();

        dataObject_a_pathLength_1.setList("PName-a-length-1", b);

        this.assertEquals(b, dataObject_a_pathLength_1.getList("PName-a-length-1"));
    }

    //6. purpose: getList(Path) with path length 1: "a"
    public void testGetListConversionWithWrongPath() {
        SDOProperty property_undefined = new SDOProperty(aHelperContext);
        property_undefined.setName("PName-Undefined");
        property_undefined.setType(SDOConstants.SDO_STRINGS);
        property_undefined.setMany(true);

        try {
            dataObject_a_pathLength_1.getList("PName-Undefined");
        } catch (Exception e) {
            fail("No Exception expected, but caught " + e.getClass());            
        }
    }

    //6. purpose: getList(Path) with defined property
    public void testGetListConversionWithProperty() {
        property_a_pathLength_1.setType(SDOConstants.SDO_STRINGS);
        property_a_pathLength_1.setMany(true);
        List b = new ArrayList();

        dataObject_a_pathLength_1.setList(property_a_pathLength_1, b);

        this.assertEquals(b, dataObject_a_pathLength_1.getList(property_a_pathLength_1));
    }

    //6. purpose: getList(Path) with defined property
    public void testGetListConversionWithPropertyPositionalSetting() {
        type_a_pathLength_1.setOpen(true);
        property_a_pathLength_1.setType(SDOConstants.SDO_STRINGS);
        property_a_pathLength_1.setMany(true);
        List b = new ArrayList();

        dataObject_a_pathLength_1.setList(property_a_pathLength_1, b);
        dataObject_a_pathLength_1.set(PROPERTY_NAME_A_LENGTH_1 + ".0", "test");

        this.assertEquals(1, dataObject_a_pathLength_1.getList(property_a_pathLength_1).size());
    }

    //6. purpose: getList(Path) with defined property
    public void testGetListConversionWithPropertyPositionalSettingBracket() {
        type_a_pathLength_1.setOpen(true);
        property_a_pathLength_1.setType(SDOConstants.SDO_STRINGS);
        property_a_pathLength_1.setMany(true);
        List b = new ArrayList();

        dataObject_a_pathLength_1.setList(property_a_pathLength_1, b);
        dataObject_a_pathLength_1.set(PROPERTY_NAME_A_LENGTH_1 + "[1]", "test");

        this.assertEquals(1, dataObject_a_pathLength_1.getList(property_a_pathLength_1).size());
        this.assertEquals("test", dataObject_a_pathLength_1.getList(property_a_pathLength_1).get(0));
    }

    //6. purpose: getList(Path) with defined property value null
    public void testGetListConversionWithPropertyValueNull() {
        property_a_pathLength_1.setType(SDOConstants.SDO_STRINGS);
        property_a_pathLength_1.setMany(true);
        List b = null;

        dataObject_a_pathLength_1.setList(property_a_pathLength_1, b);

        this.assertNotNull(dataObject_a_pathLength_1.getList(property_a_pathLength_1));
    }

    //6. purpose: getList(Path) with path length 1: "a"
    public void testGetListConversionWithUndefinedProperty() {
        SDOProperty property_undefined = new SDOProperty(aHelperContext);
        property_undefined.setName("PName-Undefined");
        property_undefined.setType(SDOConstants.SDO_STRINGS);
        property_undefined.setMany(true);

        try {
            dataObject_a_pathLength_1.getList(property_undefined);
            fail("IllegalArgumentException should be thrown.");
        } catch (IllegalArgumentException e) {
        }
    }

    //6. purpose: getBoolean with Defined Boolean Property
    public void testGetListConversionWithIndex() {
        // dataObject's type add boolean property
        property_a_pathLength_1.setType(SDOConstants.SDO_STRINGS);
        property_a_pathLength_1.setMany(true);
        List b = new ArrayList();

        dataObject_a_pathLength_1.setList(0, b);

        this.assertEquals(b, dataObject_a_pathLength_1.getList(0));
    }

    //6. purpose: getBoolean with Undefined Boolean Property
    public void testGetListConversionWithUndefinedIndex() {
        // dataObject's type add boolean property        
        SDOType type_undefined = new SDOType(URINAME, TYPENAME_A);
        SDODataObject dataObject_undeinfed = (SDODataObject)dataFactory.create(type_undefined);
        
        SDOProperty property_undefined = new SDOProperty(aHelperContext);
        List b = new ArrayList();

        try {
            dataObject_undeinfed.getList(0);
            
        } catch (SDOException e) {
            assertEquals(SDOException.PROPERTY_NOT_FOUND_AT_INDEX ,e.getErrorCode());
            return;
        }
        fail("an SDOException should have occurred.");                
    }

    public void testGetListConversionWithNonManyProperty() {
        property_a_pathLength_1.setType(SDOConstants.SDO_STRINGS);
        property_a_pathLength_1.setMany(false);        
        try {
            dataObject_a_pathLength_1.getList("PName-a-length-1");            
        } catch (Exception e) {
            fail("No Exception expected, but caught " + e.getClass());            
        }
    }

    public void testGetListConversionWithNullValue() {
        property_a_pathLength_1.setType(SDOConstants.SDO_STRINGS);
        property_a_pathLength_1.setMany(true);

        List value = dataObject_a_pathLength_1.getList("PName-a-length-1");
        this.assertEquals(new ArrayList(), value);
    }

    public void testGetListConversionWithNullValueByProperty() {
        property_a_pathLength_1.setType(SDOConstants.SDO_STRINGS);
        property_a_pathLength_1.setMany(true);

        List value = dataObject_a_pathLength_1.getList(PROPERTY_NAME_A_LENGTH_1);
        this.assertEquals(new ArrayList(), value);
    }

    public void testSameListObject() {
        property_a_pathLength_1.setType(SDOConstants.SDO_STRING);
        property_a_pathLength_1.setMany(true);

        Object value = dataObject_a_pathLength_1.get(PROPERTY_NAME_A_LENGTH_1);
        Object value2 = dataObject_a_pathLength_1.getList(PROPERTY_NAME_A_LENGTH_1);

        boolean equals = value == value2;
        assertTrue(equals);

        dataObject_a_pathLength_1.unset(PROPERTY_NAME_A_LENGTH_1);
        Object value3 = dataObject_a_pathLength_1.get(PROPERTY_NAME_A_LENGTH_1);
        Object value4 = dataObject_a_pathLength_1.getList(PROPERTY_NAME_A_LENGTH_1);

        equals = value3 == value4;
        assertTrue(equals);

        equals = value2 == value3;
        assertTrue(equals);

        List myList = new ArrayList();
        myList.add("test");
        dataObject_a_pathLength_1.set(PROPERTY_NAME_A_LENGTH_1, myList);
        Object value5 = dataObject_a_pathLength_1.get(PROPERTY_NAME_A_LENGTH_1);
        Object value6 = dataObject_a_pathLength_1.getList(PROPERTY_NAME_A_LENGTH_1);

        equals = value5 == value6;
        assertTrue(equals);

        equals = value4 == value5;
        assertTrue(equals);

        List myList2 = new ArrayList();
        myList2.add("test2");
        dataObject_a_pathLength_1.set(PROPERTY_NAME_A_LENGTH_1, myList2);
        Object value7 = dataObject_a_pathLength_1.get(PROPERTY_NAME_A_LENGTH_1);
        Object value8 = dataObject_a_pathLength_1.getList(PROPERTY_NAME_A_LENGTH_1);

        equals = value7 == value8;
        assertTrue(equals);

        equals = value6 == value7;
        assertTrue(equals);
    }
}
