Test.h revision 1cc8f6f3c48b33430d0e39a4a36601ac0d1de04a
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2011 Google Inc.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file.
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) */
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef skiatest_Test_DEFINED
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define skiatest_Test_DEFINED
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "SkRefCnt.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "SkString.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "SkTRegistry.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GrContext;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkGLContext;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace skiatest {
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class Test;
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    class Reporter : public SkRefCnt {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public:
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Reporter();
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        enum Result {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            kPassed,    // must begin with 0
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            kFailed,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /////
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            kLastResult = kFailed
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        };
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void resetReporting();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int countTests() const { return fTestCount; }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int countResults(Result r) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SkASSERT((unsigned)r <= kLastResult);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return fResultCount[r];
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void startTest(Test*);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void report(const char testDesc[], Result);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void endTest(Test*);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // helpers for tests
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        void assertTrue(bool cond, const char desc[]) {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (!cond) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                this->report(desc, kFailed);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void assertFalse(bool cond, const char desc[]) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (cond) {
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                this->report(desc, kFailed);
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            }
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        }
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        void reportFailed(const char desc[]) {
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            this->report(desc, kFailed);
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        }
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        void reportFailed(const SkString& desc) {
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            this->report(desc.c_str(), kFailed);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        bool getCurrSuccess() const {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return fCurrTestSuccess;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protected:
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        virtual void onStart(Test*) {}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        virtual void onReport(const char desc[], Result) {}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        virtual void onEnd(Test*) {}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Test* fCurrTest;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int fTestCount;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int fResultCount[kLastResult+1];
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bool fCurrTestSuccess;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        typedef SkRefCnt INHERITED;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class Test {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public:
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Test();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        virtual ~Test();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Reporter* getReporter() const { return fReporter; }
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        void setReporter(Reporter*);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const char* getName();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bool run(); // returns true on success
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protected:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        virtual void onGetName(SkString*) = 0;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        virtual void onRun(Reporter*) = 0;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private:
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        Reporter*   fReporter;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SkString    fName;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    };
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    class GpuTest : public Test{
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public:
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GpuTest() : Test() {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fContext = GetContext();
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protected:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GrContext* fContext;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static GrContext* GetContext();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef SkTRegistry<Test*, void*> TestRegistry;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define REPORTER_ASSERT(r, cond)                                        \
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {                                                                \
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!(cond)) {                                                  \
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SkString desc;                                              \
118            desc.printf("%s:%d: %s", __FILE__, __LINE__, #cond);        \
119            r->reportFailed(desc);                                      \
120        }                                                               \
121    } while(0)
122
123#define REPORTER_ASSERT_MESSAGE(r, cond, message)                            \
124    do {                                                                     \
125        if (!(cond)) {                                                       \
126            SkString desc;                                                   \
127            desc.printf("%s %s:%d: %s", message, __FILE__, __LINE__, #cond); \
128            r->reportFailed(desc);                                           \
129        }                                                                    \
130    } while(0)
131
132
133#endif
134