| // Copyright 2013 The Flutter 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 "flutter/testing/testing.h" |
| #include "gtest/gtest.h" |
| #include "impeller/geometry/path_builder.h" |
| #include "impeller/tessellator/tessellator.h" |
| |
| namespace impeller { |
| namespace testing { |
| |
| TEST(TessellatorTest, TessellatorBuilderReturnsCorrectResultStatus) { |
| // Zero points. |
| { |
| Tessellator t; |
| auto polyline = PathBuilder{}.TakePath().CreatePolyline(); |
| Tessellator::Result result = t.Tessellate( |
| FillType::kPositive, polyline, |
| [](const float* vertices, size_t vertices_size, const uint16_t* indices, |
| size_t indices_size) { return true; }); |
| |
| ASSERT_EQ(polyline.points.size(), 0u); |
| ASSERT_EQ(result, Tessellator::Result::kInputError); |
| } |
| |
| // One point. |
| { |
| Tessellator t; |
| auto polyline = PathBuilder{}.LineTo({0, 0}).TakePath().CreatePolyline(); |
| Tessellator::Result result = t.Tessellate( |
| FillType::kPositive, polyline, |
| [](const float* vertices, size_t vertices_size, const uint16_t* indices, |
| size_t indices_size) { return true; }); |
| ASSERT_EQ(polyline.points.size(), 1u); |
| ASSERT_EQ(result, Tessellator::Result::kSuccess); |
| } |
| |
| // Two points. |
| { |
| Tessellator t; |
| auto polyline = |
| PathBuilder{}.AddLine({0, 0}, {0, 1}).TakePath().CreatePolyline(); |
| Tessellator::Result result = t.Tessellate( |
| FillType::kPositive, polyline, |
| [](const float* vertices, size_t vertices_size, const uint16_t* indices, |
| size_t indices_size) { return true; }); |
| |
| ASSERT_EQ(polyline.points.size(), 2u); |
| ASSERT_EQ(result, Tessellator::Result::kSuccess); |
| } |
| |
| // Many points. |
| { |
| Tessellator t; |
| PathBuilder builder; |
| for (int i = 0; i < 1000; i++) { |
| auto coord = i * 1.0f; |
| builder.AddLine({coord, coord}, {coord + 1, coord + 1}); |
| } |
| auto polyline = builder.TakePath().CreatePolyline(); |
| Tessellator::Result result = t.Tessellate( |
| FillType::kPositive, polyline, |
| [](const float* vertices, size_t vertices_size, const uint16_t* indices, |
| size_t indices_size) { return true; }); |
| |
| ASSERT_EQ(polyline.points.size(), 2000u); |
| ASSERT_EQ(result, Tessellator::Result::kSuccess); |
| } |
| |
| // Closure fails. |
| { |
| Tessellator t; |
| auto polyline = |
| PathBuilder{}.AddLine({0, 0}, {0, 1}).TakePath().CreatePolyline(); |
| Tessellator::Result result = t.Tessellate( |
| FillType::kPositive, polyline, |
| [](const float* vertices, size_t vertices_size, const uint16_t* indices, |
| size_t indices_size) { return false; }); |
| |
| ASSERT_EQ(polyline.points.size(), 2u); |
| ASSERT_EQ(result, Tessellator::Result::kInputError); |
| } |
| } |
| |
| } // namespace testing |
| } // namespace impeller |