Home | History | Annotate | Download | only in TestWebKitAPI
      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 
     31 namespace TestWebKitAPI {
     32 
     33 // Abstract base class that all tests inherit from.
     34 class Test {
     35 public:
     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 
     55 protected:
     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