/*
 * 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.tests.types;

import java.util.*;

import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.testing.framework.*;

/**
 * Provide tests for all database types.
 */
public class TypeTestModel extends org.eclipse.persistence.testing.framework.TestModel {
    protected boolean useAccessors;

    public TypeTestModel() {
        this(true);
    }

    public TypeTestModel(boolean usingAccessors) {
        useAccessors = usingAccessors;
        setName(toString());
        if (useAccessors) {
            setDescription("Testing of all the JAVA types and their mappings in TopLink (using Accessors)");
        } else {
            setDescription("Testing of all the JAVA types and their mappings in TopLink (without Accessors)");
        }
    }

    @Override
    public void addRequiredSystems() {
        addRequiredSystem(new TypeTestSystem());
    }

    @Override
    public void addTests() {
        addTest(getBooleanTestSuite());
        addTest(getTimeDateTestSuite());
        addTest(getStringTestSuite());
        addTest(getNumericTestSuite());
        addTest(getBLOBTestSuite());
        addTest(getCLOBTestSuite());
    }

    public static TestSuite getBLOBTestSuite() {
        TestSuite suite = new TestSuite();
        Enumeration examples = BLOBTester.testInstances().elements();

        suite.setName("BLOB Types Test Suite");
        suite.setDescription("Tests the use of large byte arrays in JAVA with TopLink");

        while (examples.hasMoreElements()) {
            suite.addTest(new WriteTypeObjectTest((TypeTester)examples.nextElement()));
        }
        return suite;
    }

    public static TestSuite getBooleanTestSuite() {
        TestSuite suite = new TestSuite();
        Enumeration examples = BooleanTester.testInstances().elements();

        suite.setName("Boolean Types Test Suite");
        suite.setDescription("Tests the use of JAVA types boolean & Boolean");

        while (examples.hasMoreElements()) {
            suite.addTest(new WriteTypeObjectTest((TypeTester)examples.nextElement()));
        }
        return suite;
    }

    public static TestSuite getCLOBTestSuite() {
        TestSuite suite = new TestSuite();
        Enumeration examples = CLOBTester.testInstances().elements();

        suite.setName("CLOB Types Test Suite");
        suite.setDescription("Tests the use of long string with TopLink");

        while (examples.hasMoreElements()) {
            suite.addTest(new WriteTypeObjectTest((TypeTester)examples.nextElement()));
        }
        return suite;
    }

    public TestSuite getNumericTestSuite() {
        TestSuite suite = new TestSuite();
        Enumeration examples = NumericTester.testInstances(getSession()).elements();

        suite.setName("Numeric Types Test Suite");
        suite.setDescription("Tests the use of all the numeric types in JAVA with TopLink");

        while (examples.hasMoreElements()) {
            suite.addTest(new WriteTypeObjectTest((TypeTester)examples.nextElement()));
        }
        return suite;
    }

    public static TestSuite getStringTestSuite() {
        TestSuite suite = new TestSuite();
        Enumeration examples = StringTester.testInstances().elements();

        suite.setName("String Types Test Suite");
        suite.setDescription("Tests the use of fixed & variable length strings");

        while (examples.hasMoreElements()) {
            suite.addTest(new WriteTypeObjectTest((TypeTester)examples.nextElement()));
        }
        return suite;
    }

    public static TestSuite getTimeDateTestSuite() {
        TestSuite suite = new TestSuite();
        Enumeration examples = TimeDateTester.testInstances().elements();

        suite.setName("Date & Time Types Test Suite");
        suite.setDescription("Tests the use of Date(s)/Time/Timestamp with TopLink");

        while (examples.hasMoreElements()) {
            suite.addTest(new WriteTypeObjectTest((TypeTester)examples.nextElement()));
        }
        return suite;
    }

    @Override
    public void setup() {
        DatabaseSession session = (DatabaseSession)getSession();
        if (useAccessors) {
            (session).addDescriptor(BooleanTester.descriptorWithAccessors());
            session.addDescriptor(TimeDateTester.descriptorWithAccessors());
            session.addDescriptor(NumericTester.descriptorWithAccessors());
            session.addDescriptor(StringTester.descriptorWithAccessors());
            session.addDescriptor(CLOBTester.descriptorWithAccessors());
            session.addDescriptor(BLOBTester.descriptorWithAccessors());
        } else {
            session.addDescriptor(BooleanTester.descriptor());
            session.addDescriptor(TimeDateTester.descriptor());
            session.addDescriptor(NumericTester.descriptor());
            session.addDescriptor(StringTester.descriptor());
            session.addDescriptor(CLOBTester.descriptor());
            session.addDescriptor(BLOBTester.descriptor());
        }
    }

    public String toString() {
        if (useAccessors) {
            return super.toString() + " with Accessors";
        } else {
            return super.toString() + " without Accessors";
        }
    }
}
