blob: 47b537ac2149a07e6f31d711efcb8351c9dcd951 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/ui/lib/escher/flatland/rectangle_renderable.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "src/ui/lib/escher/defaults/default_shader_program_factory.h"
#include "src/ui/lib/escher/flatland/flatland_static_config.h"
#include "src/ui/lib/escher/flatland/rectangle_compositor.h"
#include "src/ui/lib/escher/renderer/batch_gpu_uploader.h"
#include "src/ui/lib/escher/renderer/frame.h"
#include "src/ui/lib/escher/renderer/render_funcs.h"
#include "src/ui/lib/escher/resources/resource.h"
#include "src/ui/lib/escher/resources/resource_manager.h"
#include "src/ui/lib/escher/test/fixtures/readback_test.h"
#include "src/ui/lib/escher/test/gtest_escher.h"
#include "src/ui/lib/escher/types/color.h"
#include "src/ui/lib/escher/types/color_histogram.h"
#include "src/ui/lib/escher/vk/texture.h"
namespace escher {
TEST(RectangleRenderableTest, ValidityTest) {
// A default renderable with no texture is invalid.
RectangleRenderable renderable;
EXPECT_FALSE(RectangleRenderable::IsValid(renderable));
// Is valid except for texture.
EXPECT_TRUE(RectangleRenderable::IsValid(renderable, true));
// Check each of the color components: they should fail if above 1 or less than 0.
for (uint32_t i = 0; i < 4; i++) {
renderable.color[i] = 1.5;
EXPECT_FALSE(RectangleRenderable::IsValid(renderable, true));
renderable.color[i] = -0.5;
EXPECT_FALSE(RectangleRenderable::IsValid(renderable, true));
renderable.color = vec4(1.f);
}
// Should be valid again here, since we reset the color to vec4(1).
EXPECT_TRUE(RectangleRenderable::IsValid(renderable, true));
// Check to see that the rectangle is not valid if the uv coordinates are
// outside of the range [0,1].
for (uint32_t i = 0; i < 4; i++) {
auto old_uv = renderable.source.uv_coordinates_clockwise[i];
renderable.source.uv_coordinates_clockwise[i] = vec2(1.1);
EXPECT_FALSE(RectangleRenderable::IsValid(renderable, true));
renderable.source.uv_coordinates_clockwise[i] = vec2(-0.5);
EXPECT_FALSE(RectangleRenderable::IsValid(renderable, true));
renderable.source.uv_coordinates_clockwise[i] = old_uv;
}
// Should be valid again here since we reset the uv coordinates.
EXPECT_TRUE(RectangleRenderable::IsValid(renderable, true));
// The extent cannot be negative.
renderable.dest.extent = vec2(-1, -1);
EXPECT_FALSE(RectangleRenderable::IsValid(renderable, true));
renderable.dest.extent = vec2(0);
EXPECT_TRUE(RectangleRenderable::IsValid(renderable, true));
}
TEST(RectangleRenderableTest, Rotate90Test) {
const vec2 kInitialExtent(100, 200);
const vec2 kSwappedExtent(200, 100);
RectangleRenderable renderable;
renderable.dest.extent = kInitialExtent;
RectangleRenderable::Rotate(&renderable, 90U);
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[0], vec2(0, 1));
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[1], vec2(0, 0));
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[2], vec2(1, 0));
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[3], vec2(1, 1));
EXPECT_EQ(renderable.dest.extent, kSwappedExtent);
}
TEST(RectangleRenderableTest, Rotate180Test) {
const vec2 kInitialExtent(100, 200);
RectangleRenderable renderable;
renderable.dest.extent = kInitialExtent;
RectangleRenderable::Rotate(&renderable, 180U);
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[0], vec2(1, 1));
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[1], vec2(0, 1));
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[2], vec2(0, 0));
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[3], vec2(1, 0));
EXPECT_EQ(renderable.dest.extent, kInitialExtent);
}
TEST(RectangleRenderableTest, Rotate270Test) {
const vec2 kInitialExtent(100, 200);
const vec2 kSwappedExtent(200, 100);
RectangleRenderable renderable;
renderable.dest.extent = kInitialExtent;
RectangleRenderable::Rotate(&renderable, 270U);
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[0], vec2(1, 0));
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[1], vec2(1, 1));
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[2], vec2(0, 1));
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[3], vec2(0, 0));
EXPECT_EQ(renderable.dest.extent, kSwappedExtent);
}
TEST(RectangleRenderableTest, FlipHorizontalTest) {
const vec2 kInitialExtent(100, 200);
RectangleRenderable renderable;
renderable.dest.extent = kInitialExtent;
RectangleRenderable::FlipHorizontally(&renderable);
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[0], vec2(1, 0));
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[1], vec2(0, 0));
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[2], vec2(0, 1));
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[3], vec2(1, 1));
EXPECT_EQ(renderable.dest.extent, kInitialExtent);
}
TEST(RectangleRenderableTest, FlipVerticalTest) {
const vec2 kInitialExtent(100, 200);
RectangleRenderable renderable;
renderable.dest.extent = kInitialExtent;
RectangleRenderable::FlipVertically(&renderable);
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[0], vec2(0, 1));
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[1], vec2(1, 1));
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[2], vec2(1, 0));
EXPECT_EQ(renderable.source.uv_coordinates_clockwise[3], vec2(0, 0));
EXPECT_EQ(renderable.dest.extent, kInitialExtent);
}
} // namespace escher