1d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein/*
2d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein * Copyright 2017 Google Inc.
3d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein *
4d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein * Use of this source code is governed by a BSD-style license that can be
5d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein * found in the LICENSE file.
6d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein */
7d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein
8d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein#include "ok.h"
9d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein#include "Test.h"
10d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein
11d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Kleinstruct TestStream : Stream {
12d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    const skiatest::TestRegistry* registry = skiatest::TestRegistry::Head();
136105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein    bool extended = false, verbose = false;
14d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein
156105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein    static std::unique_ptr<Stream> Create(Options options) {
16d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        TestStream stream;
176105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein        if (options("extended") != "") { stream.extended = true; }
186105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein        if (options("verbose" ) != "") { stream.verbose  = true; }
196105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein
20d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        return move_unique(stream);
21d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    }
22d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein
23d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    struct TestSrc : Src {
24d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        skiatest::Test test {"", false, nullptr};
256105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein        bool extended, verbose;
26d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein
27d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        std::string name() override { return test.name; }
28d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        SkISize     size() override { return {0,0}; }
29d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein
30d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        bool draw(SkCanvas*) override {
316105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein            // TODO(mtklein): GrContext
326105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein
336105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein            struct : public skiatest::Reporter {
346105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein                bool ok = true;
356105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein                const char* name;
366105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein                bool extended, verbose_;
376105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein
386105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein                void reportFailed(const skiatest::Failure& failure) override {
396105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein                    SkDebugf("%s: %s\n", name, failure.toString().c_str());
406105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein                    ok = false;
416105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein                }
426105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein                bool allowExtendedTest() const override { return extended; }
436105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein                bool           verbose() const override { return verbose_; }
446105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein            } reporter;
456105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein            reporter.name     = test.name;
466105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein            reporter.extended = extended;
476105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein            reporter.verbose_ = verbose;
486105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein
496105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein            test.proc(&reporter, nullptr);
506105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein            return reporter.ok;
51d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        }
52d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    };
53d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein
54d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    std::unique_ptr<Src> next() override {
55d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        if (!registry) {
56d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein            return nullptr;
57d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        }
58d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        TestSrc src;
59d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        src.test = registry->factory();
606105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein        src.extended = extended;
616105e4bf2da14d07d4c19576a67e000f51711c9dMike Klein        src.verbose  = verbose;
62d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        registry = registry->next();
63d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        return move_unique(src);
64d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    }
65d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein};
66d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Kleinstatic Register test{"test", TestStream::Create};
67d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein
68d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein// Hey, now why were these defined in DM.cpp?  That's kind of weird.
69d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Kleinnamespace skiatest {
70d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein#if SK_SUPPORT_GPU
71d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    bool IsGLContextType(sk_gpu_test::GrContextFactory::ContextType type) {
72d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        return kOpenGL_GrBackend == sk_gpu_test::GrContextFactory::ContextTypeBackend(type);
73d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    }
74d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    bool IsVulkanContextType(sk_gpu_test::GrContextFactory::ContextType type) {
75d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        return kVulkan_GrBackend == sk_gpu_test::GrContextFactory::ContextTypeBackend(type);
76d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    }
77d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    bool IsRenderingGLContextType(sk_gpu_test::GrContextFactory::ContextType type) {
78d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        return IsGLContextType(type) && sk_gpu_test::GrContextFactory::IsRenderingContext(type);
79d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    }
80d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    bool IsNullGLContextType(sk_gpu_test::GrContextFactory::ContextType type) {
81d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        return type == sk_gpu_test::GrContextFactory::kNullGL_ContextType;
82d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    }
83d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein#else
84d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    bool IsGLContextType         (int) { return false; }
85d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    bool IsVulkanContextType     (int) { return false; }
86d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    bool IsRenderingGLContextType(int) { return false; }
87d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    bool IsNullGLContextType     (int) { return false; }
88d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein#endif
89d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein
90d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    void RunWithGPUTestContexts(GrContextTestFn* test, GrContextTypeFilterFn* contextTypeFilter,
91d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein                                Reporter* reporter, sk_gpu_test::GrContextFactory* factory) {
92d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein        // TODO(bsalomon)
93d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein    }
94d63442d87c6d35af4b2771a30a80e67d6aa92b68Mike Klein}
95