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

import org.eclipse.persistence.internal.helper.Helper;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.multipletable.Cow;
import org.eclipse.persistence.testing.models.multipletable.Horse;
import org.eclipse.persistence.testing.models.multipletable.Human;
import org.eclipse.persistence.testing.models.multipletable.SuperCow;
import org.eclipse.persistence.testing.models.multipletable.SuperHorse;
import org.eclipse.persistence.testing.models.multipletable.SuperSwan;
import org.eclipse.persistence.testing.models.multipletable.Swan;
import org.eclipse.persistence.testing.models.multipletable.MultipleTableSystem;

/**
 * Testing model for multiple table tests
 *
 * @author Guy Pelletier
 * @version 1.0
 * @date May 28, 2007
 */
public class MultipleTableModel extends TestModel {
    public MultipleTableModel() {
        setDescription("This model tests multiple tables.");
    }

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

    @Override
    public void addTests() {
        addTestsToTestCollection(this);
    }
    public static void addTestsToTestCollection(TestCollection collection) {
        collection.addTest(new ReadAllTest(Cow.class));
        collection.addTest(new ReadAllTest(SuperCow.class));
        collection.addTest(new ReadAllTest(Horse.class));
        collection.addTest(new ReadAllTest(SuperHorse.class));
        collection.addTest(new ReadAllTest(Swan.class));
        collection.addTest(new ReadAllTest(SuperSwan.class));

        collection.addTest(getCowTest());
        collection.addTest(getSuperCowTest());
        collection.addTest(getHorseTest());
        collection.addTest(getSuperHorseTest());
        collection.addTest(getSwanTest());
        collection.addTest(getSuperSwanTest());
        collection.addTest(getHumanTest());
    }

    public static MultipleTableTest getCowTest() {
        Cow cow = new Cow();
        cow.setCalfCountId(101);
        cow.setCalfCount(18);
        cow.setAgeId(102);
        cow.setAge(10);
        cow.setWeightId(103);
        cow.setWeight(500);
        cow.setName("Lucky");

        return new MultipleTableTest(cow);
    }

    public static MultipleTableTest getSuperCowTest() {
        SuperCow cow = new SuperCow();
        cow.setCalfCountId(201);
        cow.setCalfCount(18);
        cow.setAgeId(202);
        cow.setAge(10);
        cow.setWeightId(203);
        cow.setWeight(500);
        cow.setSpeed(25);
        cow.setName("SuperLucky");

        return new MultipleTableTest(cow);
    }

    public static MultipleTableTest getHorseTest() {
        Horse horse = new Horse();
        horse.setFoalCount(9);
        horse.setAge(10);
        horse.setWeight(500);
        horse.setName("Pinky");

        return new MultipleTableTest(horse);
    }

    public static MultipleTableTest getSuperHorseTest() {
        SuperHorse horse = new SuperHorse();
        horse.setFoalCount(9);
        horse.setAge(10);
        horse.setWeight(500);
        horse.setSpeed(25);
        horse.setName("SuperPinky");

        return new MultipleTableTest(horse);
    }

    public static MultipleTableTest getSwanTest() {
        Swan swan = new Swan();
        swan.setCygnetCount(24);
        swan.setAge(10);
        swan.setWeight(500);
        swan.setName("Naws");

        return new MultipleTableTest(swan);
    }

    public static MultipleTableTest getSuperSwanTest() {
        SuperSwan swan = new SuperSwan();
        swan.setCygnetCount(24);
        swan.setAge(10);
        swan.setWeight(500);
        swan.setSpeed(25);
        swan.setName("RepusNaws");

        return new MultipleTableTest(swan);
    }

    public static MultipleTableTest getHumanTest() {
        Human human = new Human();
        human.setKidCount(2);
        human.setName("Wayne");

        return new MultipleTableTest(human);
    }

    public static class ReadAllTest extends TestCase {
        Class cls;
        public ReadAllTest(Class cls) {
            super();
            setName(Helper.getShortClassName(cls) + "ReadAllTest");
            this.cls = cls;
        }
        @Override
        public void test() {
            getSession().readAllObjects(cls);
        }
    }
}
