/* * 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 "SkGraphics.h" #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 "Test.h" //////////////////////////////////////////////////////////////////////////////// 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 { if (!fTest.fGMFactory) { EXPECT_TRUE(gm_runner::BackendSupported(fTest.fBackend)); return; } std::vector pixels; GMK_ImageData imgData = gm_runner::Evaluate(fTest.fBackend, fTest.fGMFactory, &pixels); EXPECT_TRUE(imgData.pix); if (!imgData.pix) { return; } std::string gmName = gm_runner::GetGMName(fTest.fGMFactory); float result = GMK_Check(imgData, gmName.c_str()); 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); } }; //////////////////////////////////////////////////////////////////////////////// #if !SK_SUPPORT_GPU struct GrContextOptions {}; #endif struct UnitTest : public testing::Test { skiatest::TestProc fProc; UnitTest(skiatest::TestProc proc) : fProc(proc) {} void TestBody() override { struct : skiatest::Reporter { void reportFailed(const skiatest::Failure& failure) override { SkString desc = failure.toString(); SK_ABORT(""); GTEST_NONFATAL_FAILURE_(desc.c_str()); } } r; fProc(&r, GrContextOptions()); } }; struct UnitTestFactory : testing::internal::TestFactoryBase { skiatest::TestProc fProc; UnitTestFactory(skiatest::TestProc proc) : fProc(proc) {} testing::Test* CreateTest() override { return new UnitTest(fProc); } }; std::vector GetUnitTests() { // Unit Tests std::vector tests; for (const skiatest::TestRegistry* r = skiatest::TestRegistry::Head(); r; r = r->next()) { tests.push_back(&r->factory()); } struct { bool operator()(const skiatest::Test* u, const skiatest::Test* v) const { return strcmp(u->name, v->name) < 0; } } less; std::sort(tests.begin(), tests.end(), less); return tests; } //////////////////////////////////////////////////////////////////////////////// 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); } int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); SkGraphics::Init(); // Rendering Tests gm_runner::SkiaBackend backends[] = { #ifndef SK_BUILD_FOR_ANDROID gm_runner::SkiaBackend::kGL, // Used for testing on desktop machines. #endif gm_runner::SkiaBackend::kGLES, gm_runner::SkiaBackend::kVulkan, }; std::vector gms = gm_runner::GetGMFactories(); for (auto backend : backends) { const char* backendName = GetBackendName(backend); std::string test = std::string("SkiaGM_") + backendName; reg_test(test.c_str(), "BackendSupported", new GMTestFactory(GMTestCase{nullptr, backend})); if (!gm_runner::BackendSupported(backend)) { continue; } for (auto gmFactory : gms) { std::string gmName = gm_runner::GetGMName(gmFactory); if (!GMK_IsGoodGM(gmName.c_str())) { continue; } #ifdef SK_DEBUG // The following test asserts on my phone. // TODO(halcanary): fix this. if(gmName == std::string("complexclip3_simple") && backend == gm_runner::SkiaBackend::kGLES) { continue; } #endif reg_test(test.c_str(), gmName.c_str(), new GMTestFactory(GMTestCase{gmFactory, backend})); } } for (const skiatest::Test* test : GetUnitTests()) { reg_test("Skia_Unit_Tests", test->name, new UnitTestFactory(test->proc)); } return RUN_ALL_TESTS(); }