/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef PatternistSDK_TestCase_H
#define PatternistSDK_TestCase_H

#include <QtXmlPatterns/QXmlQuery>

#include <private/qexternalvariableloader_p.h>

#include "ErrorHandler.h"
#include "TestBaseLine.h"
#include "Global.h"

#include "TestItem.h"

QT_BEGIN_NAMESPACE

class QDate;
class QString;
class QUrl;

namespace QPatternistSDK
{
    class XMLWriter;

    /**
     * @short A generic abstract base class for test cases.
     *
     * @ingroup PatternistSDK
     * @author Frans Englich <frans.englich@nokia.com>
     */
    class TestCase : public TestItem
    {
    public:
        /**
         * Corresponds to the simpleType test:scenarios-enum
         */
        enum Scenario
        {
            /**
             * The test case should evaluate normally and that the output
             * should match the supplied base line.
             */
            Standard        = 1,

            /**
             * The test case should result in a static error, a parser error.
             */
            ParseError      = 2,

            /**
             * The test case should result in a dynamic error, a runtime error.
             */
            RuntimeError    = 4,

            Trivial         = 8,

            /**
             * ParseError and RuntimeError OR'd.
             */
            AnyError        = RuntimeError | ParseError

        };

        TestCase();
        virtual ~TestCase();

        /**
         * Executes the test, and returns the result. The returned list
         * will always contain exactly one TestResult.
         *
         * @p stage is ignored when running out-of-process.
         */
        virtual TestResult::List execute(const ExecutionStage stage,
                                         TestSuite *ts);

        /**
         * Determines the corresponding Scenario enumerator from the string
         * representation @p string.
         *
         * The following mappings are in effect:
         * @arg @c Standard "standard"
         * @arg @c ParseError "parse-error"
         * @arg @c RuntimeError "runtime-error"
         */
        static Scenario scenarioFromString(const QString &string);

        /**
         * @return always @c true
         */
        virtual bool isFinalNode() const;

        /**
         * Calling this function makes no sense, so it always
         * performs an Q_ASSERT check.
         */
        virtual void appendChild(TreeItem *);

        /**
         * Calling this function makes no sense, so it always
         * performs an Q_ASSERT check.
         */
        virtual TreeItem *child(const unsigned int) const;

        /**
         * @return always zero
         */
        virtual unsigned int childCount() const;

        /**
         * @return always an empty list.
         */
        virtual TreeItem::List children() const;

        /**
         * A description of the test case for human consumption.
         */
        virtual QString description() const = 0;

        /**
         * The title of the test. This can be the identifier of the test, for example.
         */
        virtual QString title() const = 0;

        /**
         * Whether this test case only make use of XPath features.
         *
         * @returns @c false if the test case exercises any XQuery feature
         * which is not available in XPath 2.0.
         */
        virtual bool isXPath() const = 0;

        /**
         * The full name of the creator of the test case. For example, "Frans Englich".
         */
        virtual QString creator() const = 0;

        /**
         * The date of when the test case was created or last modified.
         */
        virtual QDate lastModified() const = 0;

        /**
         * The test's source code. That is, the XPath/XQuery code for the test.
         *
         * @param ok the function sets this value to @c false if loading the query
         * failed, and returns a description of the error for human consumption. If
         * everything went ok, @p ok is set to @c true, and the query is returned.
         */
        virtual QString sourceCode(bool &ok) const = 0;

        /**
         * The path to the file containing the code of the test case.
         */
        virtual QUrl testCasePath() const = 0;

        /**
         * The test case's identifier. For example, "Literals001".
         */
        virtual QString name() const = 0;

        /**
         * What kind of test this is. For example, whether the test case
         * should result in a parser error or should evaluate without errors.
         *
         * The vast common case is that one Scenario is returned; the bit signifiance
         * is for the TestCase sub-class UserTestCase.
         */
        virtual Scenario scenario() const = 0;

        static QString displayName(const Scenario scen);

        /**
         * @returns the valid test baselines for this test case. If only
         * one outcome is valid, the returned list only contains
         * that baseline.
         */
        virtual TestBaseLine::List baseLines() const = 0;

        virtual TestResult *testResult() const;

        virtual ResultSummary resultSummary() const;

        void toXML(XMLWriter &receiver) const;

        virtual QPatternist::ExternalVariableLoader::Ptr externalVariableLoader() const = 0;

        /**
         * @short The XML document that should be used as focus. If none should
         * be used, and hence the focus be undefined, a default constructed
         * QUrl is returned.
         */
        virtual QUrl contextItemSource() const = 0;

        /**
         * Returns by default QXmlQuery::XQuery10.
         */
        virtual QXmlQuery::QueryLanguage language() const;

        virtual QXmlName initialTemplateName() const;
    private:
        TestResult::List execute(const ExecutionStage stage);
        TestResult *createTestResult(const TestResult::Status status,
                                           const QString &comment) const;

        QPointer<TestResult>    m_result;
    };
}

QT_END_NAMESPACE

#endif
// vim: et:ts=4:sw=4:sts=4
