/*
 * Copyright (c) 1998, 2021 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 v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.sdo.model.dataobject.xpathquery;

import commonj.sdo.Property;
import java.util.ArrayList;
import java.util.List;

import junit.framework.TestCase;
import junit.textui.TestRunner;
import org.eclipse.persistence.sdo.SDOConstants;
import org.eclipse.persistence.sdo.SDODataObject;
import org.eclipse.persistence.sdo.SDOProperty;

public class SDODataObjectUnsetIsSetByXPathQueryTest extends SDODataObjectGetByXPathQueryTestCases {
    public SDODataObjectUnsetIsSetByXPathQueryTest(String name) {
        super(name);
    }

    public static void main(String[] args) {
        String[] arguments = { "-c", "org.eclipse.persistence.testing.sdo.model.dataobject.xpathquery.SDODataObjectUnsetIsSetByXPathQueryTest" };
        TestRunner.main(arguments);
    }

    //purpose: if dataObject just been new and property has not been set, iset() return false
    public void testIsSetWithNotYetSetDefinedProperty_SingleValue() {
        //Property test = dataObject.getProperty(DEFINED_PROPERTY_NAME);
        //a/b[number=1]/c
        assertFalse(dataObject_a.isSet("PName-a0/PName-b0[number='1']/" + "PName-c0"));
    }

    //purpose: if dataObject just been new and property has not been set, iset() return false
    public void testIsSetWithNotYetSetDefinedProperty_SingleValue_Path() {
        //a/b.0/c
        assertFalse(dataObject_a.isSet("PName-a0/PName-b0.1/PName-c0"));
    }

    //purpose: if dataObject just been new and property has not been set, iset() return false
    public void testIsSetWithNotYetSetDefinedProperty_SingleValue_Index() {
        assertTrue(dataObject_a.isSet(propertyTest + "PName-c0"));
    }

    //purpose: if dataObject just been new and property has not been set, iset() return false
    public void testIsSetWithNotYetSetDefinedProperty_SingleValue_Path_a_b() {
        assertTrue(dataObject_a.isSet("PName-a0/PName-b0.0/PName-c0"));
    }

    //purpose: if property has been set and then unSet, isSet() return true first and false later
    public void testIsSetWithSetThenUnSetDefinedProperty_SingleValue1() {
        assertTrue(dataObject_a.isSet(propertyTest + "PName-c0"));
        dataObject_a.unset(propertyTest + "PName-c0");
        assertFalse(dataObject_a.isSet(propertyTest + "PName-c0"));
    }

    //purpose: if property has been set and then unSet, isSet() return true first and false later
    public void testIsSetWithSetThenUnSetDefinedProperty_SingleValue() {
        assertTrue(dataObject_a.isSet("PName-a0/PName-b0.0/PName-c0"));
        dataObject_a.unset("PName-a0/PName-b0.0/PName-c0");
        assertFalse(dataObject_a.isSet("PName-a0/PName-b0.0/PName-c0"));
    }

    //purpose: set a property's value, then unset it, get its value should now return defaule value.
    public void testUnSetWithDefinedProperty_SingleValue_Path_a_b1() {
        List deflt = new ArrayList();
        property_c0.setDefault(deflt);
        dataObject_a.unset(propertyTest + "PName-c0");

        assertEquals(deflt, dataObject_a.get(propertyTest + "PName-c0"));
    }

    //purpose: set a property's value, then unset it, get its value should now return defaule value.
    public void testUnSetWithDefinedProperty_SingleValue_Path_a_b() {
        List deflt = new ArrayList();
        property_c0.setDefault(deflt);
        dataObject_a.unset("PName-a0/PName-b0.0/PName-c0");

        assertEquals(deflt, dataObject_a.get("PName-a0/PName-b0.0/PName-c0"));
    }

    //case:a/b.0/c[number="123"] where number is a many type property, and no objects meets requirement
    public void testMultipleCaseOueryD1AliasName() {
        //List aliasNames = new ArrayList();
        //aliasNames.add("alias1");
        //aliasNames.add("alias2");
        //property_d_number.setAliasNames(aliasNames);
        dataObject_a.unset("schema:PName-a/PName-b.0/PName-c[alias1=\"1\"]");
        assertFalse(dataObject_a.isSet("schema:PName-a/PName-b.0/PName-c[alias1=\"1\"]"));
    }

    public void testunSetOpenContentPropertyAliasName() {
        SDOProperty property_open = new SDOProperty(aHelperContext);
        property_open.setName("openProperty");
        property_open.setType(SDOConstants.SDO_STRING);
        property_open.setMany(false);
        List aliasNames_ = new ArrayList();
        aliasNames_.add("alias1");
        aliasNames_.add("alias2");
        property_open.setAliasNames(aliasNames_);

        dataObject_c.set(property_open, "test");
        dataObject_a.unset("schema:PName-a/PName-b.0/alias2");

        assertFalse(dataObject_a.isSet("schema:PName-a/PName-b.0/alias1"));

    }

    //case:a/b.0/c[number="123"] where number is a many type property, and no objects meets requirement
    public void testMultipleCaseOueryD1AliasName1() {
        dataObject_a.unset("schema:PName-a/@alias2.0/PName-c[number=\"1\"]");
        assertFalse(dataObject_a.isSet("schema:PName-a/@alias2.0/PName-c[number=\"1\"]"));
    }

    /*//purpose: unset  undefined property should cause exception
    public void testUnSetWithUndefinedProperty_SingleValue() {
        Property test = dataObject.getProperty(UNDEFINED_PROPERTY_NAME);

        try {
            dataObject.unset(propertyTest+"undefined");
            fail("Should throw IllegalArgumentException.");
        } catch (IllegalArgumentException e) {
        }
    }*/

    //purpose: set undefined property should cause exception
    public void testSetWithUndefinedProperty_SingleValue1() {
        // Property test = dataObject.getProperty(UNDEFINED_PROPERTY_NAME);
        //try {
        assertFalse(dataObject_a.isSet(propertyTest + "undefined"));

        //fail("Should throw IllegalArgumentException.");
        //} catch (IllegalArgumentException e) {
        //}
    }

    //purpose: set undefined property should cause exception
    public void testSetWithUndefinedProperty_SingleValue() {
        // Property test = dataObject.getProperty(UNDEFINED_PROPERTY_NAME);
        //try {
        assertFalse(dataObject_a.isSet("PName-a0/PName-b0.0/undefined"));

        //fail("Should throw IllegalArgumentException.");
        //} catch (IllegalArgumentException e) {
        //}
    }

    //purpose: if dataObject just been new and property has not been set, iset() return false
    public void testUnSetEntireList() {
        SDODataObject dataObjectC1 = (SDODataObject)dataFactory.create(type_c);
        SDODataObject dataObjectC2 = (SDODataObject)dataFactory.create(type_c);
        SDODataObject dataObjectC3 = (SDODataObject)dataFactory.create(type_c);
        SDODataObject dataObjectC4 = (SDODataObject)dataFactory.create(type_c);

        List theList = new ArrayList();
        theList.add(dataObjectC1);
        theList.add(dataObjectC2);
        theList.add(dataObjectC3);
        theList.add(dataObjectC4);

        dataObject_a.set("PName-a0/PName-b0", theList);
        List dataObjectList = dataObject_a.getList("PName-a0/PName-b0");
        assertEquals(4, dataObjectList.size());


        dataObject_a.set("PName-a0/PName-b0", theList);

        dataObject_a.unset("PName-a0/PName-b0");

        dataObjectList = dataObject_a.getList("PName-a0/PName-b0");
        assertEquals(0, dataObjectList.size() );

    }

    public void testUnSetItemInList() {
        SDODataObject dataObjectC1 = (SDODataObject)dataFactory.create(type_c);
        SDODataObject dataObjectC2 = (SDODataObject)dataFactory.create(type_c);
        SDODataObject dataObjectC3 = (SDODataObject)dataFactory.create(type_c);
        SDODataObject dataObjectC4 = (SDODataObject)dataFactory.create(type_c);

        List theList = new ArrayList();
        theList.add(dataObjectC1);
        theList.add(dataObjectC2);
        theList.add(dataObjectC3);
        theList.add(dataObjectC4);

        dataObject_a.set("PName-a0/PName-b0", theList);
        List dataObjectList = dataObject_a.getList("PName-a0/PName-b0");
        assertEquals(4, dataObjectList.size() );

        dataObject_a.unset("PName-a0/PName-b0.1");

        dataObjectList = dataObject_a.getList("PName-a0/PName-b0");
        assertEquals(3, dataObjectList.size() );

    }

    public void testPathDoesNotExistJira8() {
        SDODataObject dataObjectC1 = (SDODataObject)dataFactory.create(type_c);
        boolean isSet = dataObjectC1.isSet("something/somethingelse");
        assertFalse(isSet);
    }
}
