diff options
author | Hal Canary <halcanary@google.com> | 2017-12-11 17:46:26 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-12-15 17:23:48 +0000 |
commit | d7b3845f3d3f3498c2adc542b4b20003ac7d3ab0 (patch) | |
tree | 11ed4db86efb28f344255a6cc44f0c19d926c8ef /tools/skqp/skqp.cpp | |
parent | 0215e39d7e415d0530231df6ad20d5f215c72152 (diff) |
SkQP: make_gmkb, gm_knowledge (GM Knowledgebase)
Add a real implementation for gm_knowledge.h This depends on
the presence of files in the form $GMK_DIR/foo/{max,min}.png
The implementation also writes out failures in a report directory.
Add a utility: experimental/make_gmkb which is a stand-alone
go executable that generates the foo/{max,min}.png data.
tools/skqp/README.md has instructions on running SkQP.
Also: add SkFontMgrPriv.h
Change-Id: Ibe1e9a7e7de143d14eee3877f5f2d2d8713f7f49
Reviewed-on: https://skia-review.googlesource.com/65380
Reviewed-by: Yuqian Li <liyuqian@google.com>
Commit-Queue: Hal Canary <halcanary@google.com>
Diffstat (limited to 'tools/skqp/skqp.cpp')
-rw-r--r-- | tools/skqp/skqp.cpp | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/tools/skqp/skqp.cpp b/tools/skqp/skqp.cpp new file mode 100644 index 0000000000..b9864cd1d1 --- /dev/null +++ b/tools/skqp/skqp.cpp @@ -0,0 +1,140 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "gm_runner.h" + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wused-but-marked-unused" +#endif + +#include "gtest/gtest.h" + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +#include "SkStream.h" +#include "SkString.h" + +//////////////////////////////////////////////////////////////////////////////// + +static std::string gReportDirectoryPath; +static std::unique_ptr<skqp::AssetManager> gAssetMgr; + +//////////////////////////////////////////////////////////////////////////////// + +struct GMTestCase { + gm_runner::GMFactory fGMFactory; + gm_runner::SkiaBackend fBackend; +}; + +struct GMTest : public testing::Test { + GMTestCase fTest; + GMTest(GMTestCase t) : fTest(t) {} + void TestBody() override { + float result; + gm_runner::Error error; + std::tie(result, error) = + gm_runner::EvaluateGM(fTest.fBackend, fTest.fGMFactory, + gAssetMgr.get(), gReportDirectoryPath.c_str()); + EXPECT_EQ(error, gm_runner::Error::None); + if (gm_runner::Error::None == error) { + EXPECT_EQ(result, 0); + } + } +}; + +struct GMTestFactory : public testing::internal::TestFactoryBase { + GMTestCase fTest; + GMTestFactory(GMTestCase t) : fTest(t) {} + testing::Test* CreateTest() override { return new GMTest(fTest); } +}; + +//////////////////////////////////////////////////////////////////////////////// + +struct UnitTestTest : public testing::Test { + gm_runner::UnitTest fTest; + UnitTestTest(gm_runner::UnitTest test) : fTest(test) {} + void TestBody() override { + std::vector<std::string> errors = gm_runner::ExecuteTest(fTest); + for (const std::string& error : errors) { + GTEST_NONFATAL_FAILURE_(error.c_str()); + } + } +}; + +struct UnitTestFactory : public testing::internal::TestFactoryBase { + gm_runner::UnitTest fTest; + UnitTestFactory(gm_runner::UnitTest test) : fTest(test) {} + testing::Test* CreateTest() override { return new UnitTestTest(fTest); } +}; + +//////////////////////////////////////////////////////////////////////////////// + +static void reg_test(const char* test, const char* testCase, + testing::internal::TestFactoryBase* fact) { + testing::internal::MakeAndRegisterTestInfo(test, + testCase, + nullptr, + nullptr, + testing::internal::CodeLocation(__FILE__, __LINE__), + testing::internal::GetTestTypeId(), + testing::Test::SetUpTestCase, + testing::Test::TearDownTestCase, + fact); +} + + +void register_skia_tests() { + gm_runner::InitSkia(); + + // Rendering Tests + std::vector<gm_runner::SkiaBackend> backends = gm_runner::GetSupportedBackends(); + std::vector<gm_runner::GMFactory> gms = gm_runner::GetGMFactories(gAssetMgr.get()); + for (auto backend : backends) { + const char* backendName = GetBackendName(backend); + std::string test = std::string("SkiaGM_") + backendName; + for (auto gmFactory : gms) { + std::string gmName = gm_runner::GetGMName(gmFactory); + reg_test(test.c_str(), gmName.c_str(), + new GMTestFactory(GMTestCase{gmFactory, backend})); + } + } + + for (gm_runner::UnitTest test : gm_runner::GetUnitTests()) { + reg_test("Skia_Unit_Tests", gm_runner::GetUnitTestName(test), new UnitTestFactory{test}); + } +} + +namespace { +struct StdAssetManager : public skqp::AssetManager { + SkString fPrefix; + StdAssetManager(const char* p) : fPrefix(p) {} + std::unique_ptr<SkStreamAsset> open(const char* path) override { + SkString fullPath = fPrefix.isEmpty() + ? SkString(path) + : SkStringPrintf("%s/%s", fPrefix.c_str(), path); + return SkStream::MakeFromFile(fullPath.c_str()); + } +}; +} + +int main(int argc, char** argv) { + testing::InitGoogleTest(&argc, argv); + if (argc < 2) { + std::cerr << "Usage:\n " << argv[0] + << " [GTEST_ARGUMENTS] GMKB_DIRECTORY_PATH GMKB_REPORT_PATH\n\n"; + return 1; + } + gAssetMgr.reset(new StdAssetManager(argv[1])); + if (argc > 2) { + gReportDirectoryPath = argv[2]; + } + register_skia_tests(); + return RUN_ALL_TESTS(); +} |