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