
/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
/*  This file is meant to be included by .cpp files, so it can spew out a
    customized class + global definition.

    e.g.
    #include "TestClassDef.h"
    DEFINE_TESTCLASS("MyTest", MyTestClass, MyTestFunction)

    where MyTestFunction is declared as

        void MyTestFunction(skiatest::Reporter*)
*/

// FIXME: replace all three param callers with the short one param version
#define DEFINE_TESTCLASS_SHORT(function)                                                 \
    namespace skiatest {                                                                 \
        class function##Class : public Test {                                            \
        public:                                                                          \
            static Test* Factory(void*) { return SkNEW(function##Class); }               \
        protected:                                                                       \
            virtual void onGetName(SkString* name) SK_OVERRIDE { name->set(#function); } \
            virtual void onRun(Reporter* reporter) SK_OVERRIDE { function(reporter); }   \
        };                                                                               \
        static TestRegistry gReg_##function##Class(function##Class::Factory);            \
    }

#define DEFINE_TESTCLASS(uiname, classname, function)                                   \
    namespace skiatest {                                                                \
        class classname : public Test {                                                 \
        public:                                                                         \
            static Test* Factory(void*) { return SkNEW(classname); }                    \
        protected:                                                                      \
            virtual void onGetName(SkString* name) SK_OVERRIDE { name->set(uiname); }   \
            virtual void onRun(Reporter* reporter) SK_OVERRIDE { function(reporter); }  \
        };                                                                              \
        static TestRegistry gReg_##classname(classname::Factory);                       \
    }

#define DEFINE_GPUTESTCLASS(uiname, classname, function)                                \
    namespace skiatest {                                                                \
        class classname : public GpuTest {                                              \
        public:                                                                         \
            static Test* Factory(void*) { return SkNEW(classname); }                    \
        protected:                                                                      \
            virtual void onGetName(SkString* name) SK_OVERRIDE { name->set(uiname); }   \
            virtual void onRun(Reporter* reporter) SK_OVERRIDE {                        \
                function(reporter, GetGrContextFactory());                              \
            }                                                                           \
        };                                                                              \
        static TestRegistry gReg_##classname(classname::Factory);                       \
    }
