/*
 * Copyright (c) 2011, 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 = 2.2 - Initial implementation
package org.eclipse.persistence.testing.jaxb.annotations.xmlproperty;

import java.util.Map;

import org.eclipse.persistence.descriptors.ClassDescriptor;
import org.eclipse.persistence.jaxb.JAXBContext;
import org.eclipse.persistence.jaxb.JAXBContextFactory;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.oxm.XMLDescriptor;
import org.eclipse.persistence.sessions.Project;

import junit.framework.TestCase;

public class XmlPropertyTestCases extends TestCase {
    static final String CLASS_PROPERTY_1_NAME = "property1";
    static final String CLASS_PROPERTY_2_NAME = "property2";
    static final String FIELD_PROPERTY_1_NAME = "barProp";
    static final String FIELD_PROPERTY_2_NAME = "bar2Prop";


    Project project;

    @Override
    public void setUp() throws Exception {
        JAXBContext ctx = (JAXBContext)JAXBContextFactory.createContext(new Class<?>[]{Foo.class}, null);
        this.project = ctx.getXMLContext().getSession(0).getProject();
    }

    public void testClassProperties() {
        ClassDescriptor descriptor = project.getClassDescriptor(Foo.class);
        Map<Object, Object> properties = descriptor.getProperties();
        assertTrue("Incorrect number of properties", properties.size() == 2);
        Object property = properties.get(CLASS_PROPERTY_1_NAME);
        assertNotNull(property);
        assertTrue("Incorrect value for property", property.equals("value1"));
        property = properties.get(CLASS_PROPERTY_2_NAME);
        assertNotNull(property);
        assertTrue("Incorrect value for property", property.equals(Integer.valueOf("121")));
    }

    public void testXmlPropertyOnField() {
        ClassDescriptor descriptor = project.getClassDescriptor(Foo.class);
        DatabaseMapping mapping = descriptor.getMappingForAttributeName("bar");
        Map<Object, Object> properties = mapping.getProperties();
        assertTrue("Incorrect number of properties", properties.size() == 1);
        Object property = properties.get(FIELD_PROPERTY_1_NAME);
        assertNotNull(property);
        assertTrue("Incorrect value for property", property.equals("barValue"));
    }

    public void testXmlPropertiesOnField() {
        ClassDescriptor descriptor = project.getClassDescriptor(Foo.class);
        DatabaseMapping mapping = descriptor.getMappingForAttributeName("bar2");
        Map<Object, Object> properties = mapping.getProperties();
        assertTrue("Incorrect number of properties", properties.size() == 1);
        Object property = properties.get(FIELD_PROPERTY_2_NAME);
        assertNotNull(property);
        assertTrue("Incorrect value for property", property.equals("bar2Value"));

    }

}
