1/*
2 * Copyright 2017 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "ok.h"
9#include "Test.h"
10
11struct TestStream : Stream {
12    const skiatest::TestRegistry* registry = skiatest::TestRegistry::Head();
13    bool extended = false, verbose = false;
14
15    static std::unique_ptr<Stream> Create(Options options) {
16        TestStream stream;
17        if (options("extended") != "") { stream.extended = true; }
18        if (options("verbose" ) != "") { stream.verbose  = true; }
19
20        return move_unique(stream);
21    }
22
23    struct TestSrc : Src {
24        skiatest::Test test {"", false, nullptr};
25        bool extended, verbose;
26
27        std::string name() override { return test.name; }
28        SkISize     size() override { return {0,0}; }
29
30        bool draw(SkCanvas*) override {
31            // TODO(mtklein): GrContext
32
33            struct : public skiatest::Reporter {
34                bool ok = true;
35                const char* name;
36                bool extended, verbose_;
37
38                void reportFailed(const skiatest::Failure& failure) override {
39                    SkDebugf("%s: %s\n", name, failure.toString().c_str());
40                    ok = false;
41                }
42                bool allowExtendedTest() const override { return extended; }
43                bool           verbose() const override { return verbose_; }
44            } reporter;
45            reporter.name     = test.name;
46            reporter.extended = extended;
47            reporter.verbose_ = verbose;
48
49            test.proc(&reporter, nullptr);
50            return reporter.ok;
51        }
52    };
53
54    std::unique_ptr<Src> next() override {
55        if (!registry) {
56            return nullptr;
57        }
58        TestSrc src;
59        src.test = registry->factory();
60        src.extended = extended;
61        src.verbose  = verbose;
62        registry = registry->next();
63        return move_unique(src);
64    }
65};
66static Register test{"test", TestStream::Create};
67
68// Hey, now why were these defined in DM.cpp?  That's kind of weird.
69namespace skiatest {
70#if SK_SUPPORT_GPU
71    bool IsGLContextType(sk_gpu_test::GrContextFactory::ContextType type) {
72        return kOpenGL_GrBackend == sk_gpu_test::GrContextFactory::ContextTypeBackend(type);
73    }
74    bool IsVulkanContextType(sk_gpu_test::GrContextFactory::ContextType type) {
75        return kVulkan_GrBackend == sk_gpu_test::GrContextFactory::ContextTypeBackend(type);
76    }
77    bool IsRenderingGLContextType(sk_gpu_test::GrContextFactory::ContextType type) {
78        return IsGLContextType(type) && sk_gpu_test::GrContextFactory::IsRenderingContext(type);
79    }
80    bool IsNullGLContextType(sk_gpu_test::GrContextFactory::ContextType type) {
81        return type == sk_gpu_test::GrContextFactory::kNullGL_ContextType;
82    }
83#else
84    bool IsGLContextType         (int) { return false; }
85    bool IsVulkanContextType     (int) { return false; }
86    bool IsRenderingGLContextType(int) { return false; }
87    bool IsNullGLContextType     (int) { return false; }
88#endif
89
90    void RunWithGPUTestContexts(GrContextTestFn* test, GrContextTypeFilterFn* contextTypeFilter,
91                                Reporter* reporter, sk_gpu_test::GrContextFactory* factory) {
92        // TODO(bsalomon)
93    }
94}
95