1/*
2 * Copyright (C) 2010 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef Test_h
27#define Test_h
28
29#include "TestsController.h"
30
31namespace TestWebKitAPI {
32
33// Abstract base class that all tests inherit from.
34class Test {
35public:
36    virtual ~Test() { }
37
38    virtual void run() = 0;
39    std::string name() const { return m_identifier; }
40
41    template<typename TestClassTy> class Register {
42    public:
43        Register(const std::string& testSuite, const std::string& testCase)
44        {
45            TestsController::shared().registerCreateTestFunction(testSuite + "/" + testCase, Register::create);
46        }
47
48    private:
49        static Test* create(const std::string& identifier)
50        {
51            return new TestClassTy(identifier);
52        }
53    };
54
55protected:
56    Test(const std::string& identifier)
57        : m_identifier(identifier)
58    {
59    }
60
61    std::string m_identifier;
62};
63
64#define TEST_CLASS_NAME(testSuite, testCaseName) testSuite##testCaseName##_Test
65#define TEST_REGISTRAR_NAME(testSuite, testCaseName) testSuite##testCaseName##_Registrar
66
67// Use this to define a new test.
68#define TEST(testSuite, testCaseName) \
69    class TEST_CLASS_NAME(testSuite, testCaseName) : public Test { \
70    public: \
71        TEST_CLASS_NAME(testSuite, testCaseName)(const std::string& identifier) \
72            : Test(identifier) \
73        { \
74        } \
75        virtual void run(); \
76    }; \
77    \
78    static Test::Register<TEST_CLASS_NAME(testSuite, testCaseName)> TEST_REGISTRAR_NAME(testSuite, testCaseName)(#testSuite, #testCaseName); \
79    \
80    void TEST_CLASS_NAME(testSuite, testCaseName)::run()
81
82#define _TEST_ASSERT_HELPER(expression, returnStatement) do { if (!(expression)) { TestsController::shared().testFailed(__FILE__, __LINE__, #expression); returnStatement; } } while (0)
83#define TEST_ASSERT(expression) _TEST_ASSERT_HELPER(expression, return)
84#define TEST_ASSERT_RETURN(expression, returnValue) _TEST_ASSERT_HELPER(expression, return (returnValue))
85
86} // namespace TestWebKitAPI
87
88#endif // Test_h
89