/*
 * Copyright (c) 1998, 2020 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.framework;

import java.io.*;
import org.eclipse.persistence.sessions.Session;

/**
 * This Interface is used by Test Framework.
 */
public interface TestEntity extends junit.framework.Test, java.io.Serializable {
    public static final int INITIAL_VALUE = -1;

    /**
     * Append test summaries of the collection of tests.
     */
    public void appendTestResult(TestResultsSummary summary);

    /**
     * Computes the level for indentation.
     */
    public void computeNestedLevel();

    /**
     * The session is initialized to the default login from the Persistent System
     * if no explicit login is done for testing. This method must be overridden in
     * the subclasses if different login is required.
     */
    public Session defaultLogin();

    /**
     * Executes the test entity in the collection.
     */
    public void execute(TestExecutor executor) throws Throwable;

    /**
     * Return the test collection which contains this test
     */
    public TestEntity getContainer();

    /**
     * Return the name of the test
     */
    public String getName();

    public int getNestedCounter();

    /**
     * Return the test result.
     */
    public ResultInterface getReport();


    /**
     * Set the test result.
     */
    public void setReport(ResultInterface testResult);

    /**
     * Increment the nested counter
     */
    public void incrementNestedCounter();

    /**
     * Logs the test results to the print stream.
     * This mothed is added to migrate tests to Ora*Tst
     */
    public void logRegressionResult(Writer log);

    /**
     * Logs the test results to the print stream.
     */
    public void logResult(Writer log);

    /**
     * Logs the test results to the print stream.
     */
    public void logResult(Writer log, boolean shouldLogOnlyErrors);

    public boolean requiresDatabase();

    public void resetEntity();

    public void resetNestedCounter();

    /**
     * Set the test collection which contains this test
     */
    public void setContainer(TestEntity testEntity);

    public void setNestedCounter(int level);
}
