#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace mbgl; TEST(API, RepeatedRender) { util::RunLoop loop; const auto style = util::read_file("test/fixtures/api/water.json"); HeadlessBackend backend; BackendScope scope { backend }; OffscreenView view { backend.getContext(), { 512, 512 } }; float pixelRatio { 1 }; DefaultFileSource fileSource(":memory:", "test/fixtures/api/assets"); ThreadPool threadPool(4); StubRendererFrontend rendererFrontend { std::make_unique(backend, pixelRatio, fileSource, threadPool), view }; Log::setObserver(std::make_unique()); Map map(rendererFrontend, MapObserver::nullObserver(), view.getSize(), pixelRatio, fileSource, threadPool, MapMode::Still); { map.getStyle().loadJSON(style); PremultipliedImage result; map.renderStill([&](std::exception_ptr) { result = view.readStillImage(); }); while (!result.valid()) { loop.runOnce(); } ASSERT_EQ(512u, result.size.width); ASSERT_EQ(512u, result.size.height); test::checkImage("test/fixtures/api/repeated_render", result, 0.0003, 0.1); } { map.getStyle().loadJSON(style); PremultipliedImage result; map.renderStill([&](std::exception_ptr) { result = view.readStillImage(); }); while (!result.valid()) { loop.runOnce(); } ASSERT_EQ(512u, result.size.width); ASSERT_EQ(512u, result.size.height); test::checkImage("test/fixtures/api/repeated_render", result, 0.0003, 0.1); } auto observer = Log::removeObserver(); auto flo = dynamic_cast(observer.get()); auto unchecked = flo->unchecked(); EXPECT_TRUE(unchecked.empty()) << unchecked; }