/*
 * 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;

import commonj.sdo.Property;
import java.lang.System;

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

public class SDODataObjectUnsetIsSetTest extends SDODataObjectTestCases {
    public SDODataObjectUnsetIsSetTest(String name) {
        super(name);
    }

    public static void main(String[] args) {
        String[] arguments = { "-c", "org.eclipse.persistence.testing.sdo.model.dataobject.SDODataObjectUnsetIsSetTest" };
        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.getInstanceProperty(DEFINED_PROPERTY_NAME);
        assertFalse(dataObject.isSet(test));
    }

    //purpose: if dataObject just been new and property has not been set, iset() return false
    public void testIsSetWithNotYetSetDefinedProperty_SingleValue_Path() {
        assertFalse(dataObject.isSet(DEFINED_PROPERTY_NAME));
    }

    //purpose: if dataObject just been new and property has not been set, iset() return false
    public void testIsSetWithNotYetSetDefinedProperty_SingleValue_Index() {
        assertFalse(dataObject.isSet(0));
    }

    //purpose: if dataObject just been new and property has not been set, iset() return false
    public void testIsSetWithNotYetSetDefinedProperty_SingleValue_Path_a_b() {
        assertFalse(dataObject_Path_a_b.isSet(DEFINED_PROPERTY_NAME_A_B));
    }

    //purpose: if property has not been unSet, iset() return false
    public void testIsSetWithUnSetDefinedProperty_SingleValue() {
        Property test = dataObject.getInstanceProperty(DEFINED_PROPERTY_NAME);
        dataObject.unset(test);
        assertFalse(dataObject.isSet(test));
    }

    //purpose: if property has been set and then unSet, isSet() return true first and false later
    public void testIsSetWithSetThenUnSetDefinedProperty_SingleValue() {
        Property test = dataObject.getInstanceProperty(DEFINED_PROPERTY_NAME);
        dataObject.set(test, CONTROL_STRING_1);
        assertTrue(dataObject.isSet(test));
        dataObject.unset(test);
        assertFalse(dataObject.isSet(test));
    }

    //purpose: if current value isn't default value, iset() return false
    public void testIsSetWithCurrentAsDefinedPropertyDefault_SingleValue() {
        Property test = dataObject.getInstanceProperty(DEFINED_PROPERTY_NAME);
        dataObject.set(test, CONTROL_STRING_2);
        assertFalse(dataObject.get(test).equals(DEFAULT_VALUE));
        assertTrue(dataObject.isSet(test));
    }

    //purpose: if property has been set to default value, iset() return true.
    //SDO Specification 2.1:
    //"Any call to set() without a call to unset() will cause isSet() to return true, regardless of the value being set. "(Page 16)
    public void testIsSetWithSetDefinedPropertyAsDefault_SingleValue() {
        Property test = dataObject.getInstanceProperty(DEFINED_PROPERTY_NAME);
        dataObject.set(test, test.getDefault());
        assertTrue(dataObject.get(test).equals(DEFAULT_VALUE));
        assertTrue(dataObject.isSet(test));
    }

    //purpose: if property has been set, iset() return true
    public void testIsSetWithDefinedPropertyJustSet_SingleValue() {
        Property test = dataObject.getInstanceProperty(DEFINED_PROPERTY_NAME);

        dataObject.set(test, CONTROL_STRING_1);

        assertTrue(dataObject.isSet(test));
    }

    //purpose: set a property's value, then unset it, get its value should now return defaule value.
    public void testUnSetWithDefinedProperty_SingleValue() {
        Property test = dataObject.getInstanceProperty(DEFINED_PROPERTY_NAME);

        dataObject.set(test, CONTROL_STRING_1);

        dataObject.unset(test);
        // TODO: Verify ValueStore refactor does not change behavior
        assertEquals(DEFAULT_VALUE, (String)dataObject.get(test));
    }

    //purpose: set a property's value, then unset it, get its value should now return defaule value.
    public void testUnSetWithDefinedProperty_SingleValue_Path() {
        dataObject.set(DEFINED_PROPERTY_NAME, CONTROL_STRING_1);

        dataObject.unset(DEFINED_PROPERTY_NAME);
        // TODO: Verify ValueStore refactor does not change behavior
        assertEquals(DEFAULT_VALUE, (String)dataObject.get(DEFINED_PROPERTY_NAME));
    }

    //purpose: set a property's value, then unset it, get its value should now return defaule value.
    public void testUnSetWithDefinedProperty_SingleValue_Index() {
        dataObject.set(DEFINED_PROPERTY_NAME, CONTROL_STRING_1);

        dataObject.unset(0);

        assertEquals(DEFAULT_VALUE, (String)dataObject.get(DEFINED_PROPERTY_NAME));
    }

    //purpose: set a property's value, then unset it, get its value should now return defaule value.
    public void testUnSetWithDefinedProperty_SingleValue_Path_a_b() {
        dataObject_Path_a_b.unset(DEFINED_PROPERTY_NAME_A_B);

        assertEquals(DEFAULT_VALUE, (String)dataObject_Path_a_b.get(DEFINED_PROPERTY_NAME_A_B));
    }

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

        try {
            dataObject.unset(test);
        } catch (SDOException e) {
            assertEquals(SDOException.CANNOT_PERFORM_OPERATION_ON_NULL_ARGUMENT ,e.getErrorCode());
            return;
        }
        fail("an SDOException should have occurred.");
    }

    //purpose: set undefined property should cause exception
    public void testSetWithUndefinedProperty_SingleValue() {
        Property test = dataObject.getInstanceProperty(UNDEFINED_PROPERTY_NAME);

        try {
            dataObject.isSet(test);
        } catch (SDOException e) {
          assertEquals(SDOException.CANNOT_PERFORM_OPERATION_ON_NULL_ARGUMENT ,e.getErrorCode());
          return;
        }
        fail("An SDOException should have occurred.");
    }

    //bug 5770518
    public void testUnsetUndefinedByProp() {
        SDOProperty prop = new SDOProperty(getHelperContext());
        prop.setName("nonExistant");
        prop.setType(SDOConstants.SDO_STRING);
        dataObject.unset(prop);
    }

    //bug 5770518
    public void testUnsetUndefinedByPath() {
        dataObject.unset("nonExistant");
        //nothing should happen ie: no exception
    }

    //bug 5770518
    public void testUnsetUndefinedByIndex() {
        int totalSize = dataObject.getInstanceProperties().size();
        try {
            dataObject.unset(totalSize + 1);
        } catch (SDOException e) {
            assertEquals(SDOException.PROPERTY_NOT_FOUND_AT_INDEX, e.getErrorCode());
            return;
        }
        fail("An SDOException should have occurred.");
    }

    //purpose: set a non-nullable property's value to null - this should result in an unset op
    public void testSetNonNullablePropertyToNull() {
        Property test = dataObject.getInstanceProperty(DEFINED_PROPERTY_NAME);
        dataObject.set(test, null);
        // TODO: Verify ValueStore refactor does not change behavior
        assertTrue("Set non-nullable property to null didn't result in an unset operation being performed as expected", dataObject.isSet(test) == false);
    }

    //purpose: set a non-nullable many property's value to null - this should result in an unset op
    public void testSetNonNullableManyPropertyToNull() {
        Property test = dataObject.getInstanceProperty(DEFINED_MANY_PROPERTY_NAME);
        dataObject.set(test, null);
        // TODO: Verify ValueStore refactor does not change behavior
        assertTrue("Set non-nullable many property to null didn't result in an unset operation being performed as expected", dataObject.isSet(test) == false);
    }
}
