/*
 * Copyright (c) 2020, 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
package org.eclipse.persistence.testing.tests.jpa.datatypes;

import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.models.jpa.datatypes.*;

import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;

/**
 * Test case to select boolean values only according to bug fix for GitHub bug #716.
 */
public class BooleanJUnitTestCase extends JUnitTestCase {

    public BooleanJUnitTestCase() {
        super();
    }

    public BooleanJUnitTestCase(String name) {
        super(name);
    }

    public static Test suite() {
        TestSuite suite = new TestSuite("Boolean DataTypes");
        suite.addTest(new BooleanJUnitTestCase("testSetup"));
        suite.addTest(new BooleanJUnitTestCase("testCreateWrapperTypes"));
        suite.addTest(new BooleanJUnitTestCase("testBoolean"));

        return suite;
    }

    /**
     * The setup is done as a test, both to record its failure, and to allow execution in the server.
     */
    public void testSetup() {
        new DataTypesTableCreator().replaceTables(JUnitTestCase.getServerSession());
        clearCache();
    }

    /**
     * Creates the WrapperTypes instance used in later tests.
     */
    public void testCreateWrapperTypes() {
        EntityManager em = createEntityManager();

        beginTransaction(em);
        WrapperTypes[] wrapperTypes = new WrapperTypes[4];
        wrapperTypes[0] = new WrapperTypes(BigDecimal.ZERO, BigInteger.ZERO, Boolean.FALSE,
                            Byte.valueOf("0"), 'A', Short.valueOf("0"),
                0, 0L, Float.valueOf(0.0f), 0.0, "A String");
        wrapperTypes[1] = new WrapperTypes(BigDecimal.ONE, BigInteger.ONE, Boolean.TRUE,
                Byte.valueOf("1"), 'B', Short.valueOf("1"),
                1, 1L, Float.valueOf(1.0f), 1.0, "B String");
        wrapperTypes[2] = new WrapperTypes(new BigDecimal(2), new BigInteger("2"), Boolean.FALSE,
                Byte.valueOf("2"), 'C', Short.valueOf("2"),
                2, 2L, Float.valueOf(2.0f), 2.0, "C String");
        wrapperTypes[3] = new WrapperTypes(new BigDecimal(3), new BigInteger("3"), Boolean.TRUE,
                Byte.valueOf("3"), 'D', Short.valueOf("3"),
                3, 3L, Float.valueOf(3.0f), 3.0, "D String");
        for (WrapperTypes wrapperType: wrapperTypes) {
            em.persist(wrapperType);
        }
        commitTransaction(em);
    }

    /**
     * Tests to select boolean values only according to bug fix for GitHub bug #716.
     */
    public void testBoolean() {
        EntityManager em = createEntityManager();
        Query q;

        try {
            q = em.createQuery("SELECT wt.booleanData FROM WrapperTypes wt");
            List<Object> result = q.getResultList();
            assertTrue("Not all boolean rows are selected", result.size() == 4);
        } catch (RuntimeException e) {
            closeEntityManager(em);
            throw e;
        }
    }
}
