#include <stddef.h>
#include <algorithm>
#include <vector>
#include "cc/base/tiling_data.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace cc {
namespace {
void TestSpiralIterate(int source_line_number,
const TilingData& tiling_data,
const gfx::Rect& consider,
const gfx::Rect& ignore,
const gfx::Rect& center,
const std::vector<std::pair<int, int>>& expected) {
std::vector<std::pair<int, int>> actual_forward;
for (TilingData::SpiralDifferenceIterator it(&tiling_data, consider, ignore,
center);
it; ++it) {
actual_forward.push_back(it.index());
}
EXPECT_EQ(expected.size(), actual_forward.size()) << "error from line "
<< source_line_number;
for (size_t i = 0; i < std::min(expected.size(), actual_forward.size());
++i) {
EXPECT_EQ(expected[i].first, actual_forward[i].first)
<< "i: " << i << " error from line: " << source_line_number;
EXPECT_EQ(expected[i].second, actual_forward[i].second)
<< "i: " << i << " error from line: " << source_line_number;
}
std::vector<std::pair<int, int>> actual_reverse;
for (TilingData::ReverseSpiralDifferenceIterator it(&tiling_data, consider,
ignore, center);
it; ++it) {
actual_reverse.push_back(it.index());
}
std::vector<std::pair<int, int>> reversed_expected = expected;
std::reverse(reversed_expected.begin(), reversed_expected.end());
EXPECT_EQ(reversed_expected.size(), actual_reverse.size())
<< "error from line " << source_line_number;
for (size_t i = 0;
i < std::min(reversed_expected.size(), actual_reverse.size()); ++i) {
EXPECT_EQ(reversed_expected[i].first, actual_reverse[i].first)
<< "i: " << i << " error from line: " << source_line_number;
EXPECT_EQ(reversed_expected[i].second, actual_reverse[i].second)
<< "i: " << i << " error from line: " << source_line_number;
}
}
TEST(SpiralIteratorTest, NoIgnoreFullConsider) {
TilingData tiling_data(gfx::Size(10, 10), gfx::Size(30, 30), false);
gfx::Rect consider(30, 30);
gfx::Rect ignore;
std::vector<std::pair<int, int>> expected;
gfx::Rect center(15, 15, 1, 1);
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 2));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(2, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
center = gfx::Rect(100, 15, 1, 1);
expected.clear();
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 2));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(1, 1));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
center = gfx::Rect(25, 25, 1, 1);
expected.clear();
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(1, 1));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
center = gfx::Rect(-60, -50, 1, 1);
expected.clear();
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(1, 1));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(0, 2));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(2, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
center = gfx::Rect(15, 15, 1, 10);
expected.clear();
expected.push_back(std::make_pair(2, 2));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
}
TEST(SpiralIteratorTest, SmallConsider) {
TilingData tiling_data(gfx::Size(10, 10), gfx::Size(50, 50), false);
gfx::Rect ignore;
std::vector<std::pair<int, int>> expected;
gfx::Rect center(15, 15, 1, 1);
gfx::Rect consider(1, 1);
expected.push_back(std::make_pair(0, 0));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
consider = gfx::Rect(25, 25, 10, 10);
expected.clear();
expected.push_back(std::make_pair(2, 2));
expected.push_back(std::make_pair(3, 2));
expected.push_back(std::make_pair(2, 3));
expected.push_back(std::make_pair(3, 3));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
consider = gfx::Rect(11, 0, 1, 100);
expected.clear();
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(1, 3));
expected.push_back(std::make_pair(1, 4));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
}
TEST(SpiralIteratorTest, HasIgnore) {
TilingData tiling_data(gfx::Size(10, 10), gfx::Size(50, 50), false);
gfx::Rect consider(50, 50);
std::vector<std::pair<int, int>> expected;
gfx::Rect center(15, 15, 1, 1);
gfx::Rect ignore(50, 50);
expected.clear();
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
ignore = gfx::Rect(15, 0, 20, 100);
expected.clear();
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 2));
expected.push_back(std::make_pair(0, 3));
expected.push_back(std::make_pair(4, 3));
expected.push_back(std::make_pair(4, 2));
expected.push_back(std::make_pair(4, 1));
expected.push_back(std::make_pair(4, 0));
expected.push_back(std::make_pair(0, 4));
expected.push_back(std::make_pair(4, 4));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
ignore = gfx::Rect(50, 25);
expected.clear();
expected.push_back(std::make_pair(0, 3));
expected.push_back(std::make_pair(1, 3));
expected.push_back(std::make_pair(2, 3));
expected.push_back(std::make_pair(3, 3));
expected.push_back(std::make_pair(4, 3));
expected.push_back(std::make_pair(0, 4));
expected.push_back(std::make_pair(1, 4));
expected.push_back(std::make_pair(2, 4));
expected.push_back(std::make_pair(3, 4));
expected.push_back(std::make_pair(4, 4));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
}
TEST(SpiralIteratorTest, RectangleCenter) {
TilingData tiling_data(gfx::Size(10, 10), gfx::Size(50, 50), false);
gfx::Rect consider(50, 50);
std::vector<std::pair<int, int>> expected;
gfx::Rect ignore;
gfx::Rect center(25, 25, 1, 10);
expected.clear();
expected.push_back(std::make_pair(3, 3));
expected.push_back(std::make_pair(3, 2));
expected.push_back(std::make_pair(3, 1));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(1, 1));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(1, 3));
expected.push_back(std::make_pair(1, 4));
expected.push_back(std::make_pair(2, 4));
expected.push_back(std::make_pair(3, 4));
expected.push_back(std::make_pair(4, 4));
expected.push_back(std::make_pair(4, 3));
expected.push_back(std::make_pair(4, 2));
expected.push_back(std::make_pair(4, 1));
expected.push_back(std::make_pair(4, 0));
expected.push_back(std::make_pair(3, 0));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 2));
expected.push_back(std::make_pair(0, 3));
expected.push_back(std::make_pair(0, 4));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
center = gfx::Rect(15, 25, 20, 10);
expected.clear();
expected.push_back(std::make_pair(4, 3));
expected.push_back(std::make_pair(4, 2));
expected.push_back(std::make_pair(4, 1));
expected.push_back(std::make_pair(3, 1));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(1, 1));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 2));
expected.push_back(std::make_pair(0, 3));
expected.push_back(std::make_pair(0, 4));
expected.push_back(std::make_pair(1, 4));
expected.push_back(std::make_pair(2, 4));
expected.push_back(std::make_pair(3, 4));
expected.push_back(std::make_pair(4, 4));
expected.push_back(std::make_pair(4, 0));
expected.push_back(std::make_pair(3, 0));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(0, 0));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
center = gfx::Rect(-50, 0, 30, 50);
expected.clear();
expected.push_back(std::make_pair(0, 4));
expected.push_back(std::make_pair(0, 3));
expected.push_back(std::make_pair(0, 2));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(1, 4));
expected.push_back(std::make_pair(1, 3));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(1, 1));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(2, 4));
expected.push_back(std::make_pair(2, 3));
expected.push_back(std::make_pair(2, 2));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(3, 4));
expected.push_back(std::make_pair(3, 3));
expected.push_back(std::make_pair(3, 2));
expected.push_back(std::make_pair(3, 1));
expected.push_back(std::make_pair(3, 0));
expected.push_back(std::make_pair(4, 4));
expected.push_back(std::make_pair(4, 3));
expected.push_back(std::make_pair(4, 2));
expected.push_back(std::make_pair(4, 1));
expected.push_back(std::make_pair(4, 0));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
}
TEST(SpiralIteratorTest, EdgeCases) {
TilingData tiling_data(gfx::Size(10, 10), gfx::Size(30, 30), false);
std::vector<std::pair<int, int>> expected;
gfx::Rect center;
gfx::Rect consider;
gfx::Rect ignore;
ignore = gfx::Rect(15, 0, 20, 30);
consider = gfx::Rect(20, 10, 10, 20);
center = gfx::Rect(25, 0, 5, 5);
expected.clear();
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
ignore = gfx::Rect();
center = gfx::Rect(0, 15, 30, 15);
consider = gfx::Rect(15, 30);
expected.clear();
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(0, 0));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
ignore = gfx::Rect(5, 30);
consider = gfx::Rect(25, 0, 5, 30);
center = gfx::Rect(15, 0, 1, 1);
expected.clear();
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
consider = gfx::Rect(30, 30);
center = gfx::Rect(15, 0, 1, 30);
ignore = gfx::Rect(0, 15, 30, 1);
expected.clear();
expected.push_back(std::make_pair(2, 2));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(0, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
consider = gfx::Rect(30, 30);
center = gfx::Rect(15, 0, 1, 30);
ignore = center;
expected.clear();
expected.push_back(std::make_pair(2, 2));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
TilingData empty_data(gfx::Size(0, 0), gfx::Size(0, 0), false);
expected.clear();
TestSpiralIterate(__LINE__, empty_data, consider, ignore, center, expected);
ignore = gfx::Rect();
center = gfx::Rect(1, 1, 1, 1);
consider = gfx::Rect();
expected.clear();
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
consider = gfx::Rect(30, 30);
ignore = gfx::Rect();
center = gfx::Rect();
expected.clear();
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(1, 1));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(0, 2));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(2, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
ignore = gfx::Rect();
center = gfx::Rect();
consider = gfx::Rect();
expected.clear();
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
consider = gfx::Rect(30, 30);
ignore = gfx::Rect();
center = gfx::Rect(-20, 0, 19, 30);
expected.clear();
expected.push_back(std::make_pair(0, 2));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(1, 1));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(2, 2));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 0));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
TilingData smaller_tiling(gfx::Size(10, 10), gfx::Size(1, 1), false);
consider = gfx::Rect(10, 10);
ignore = gfx::Rect();
center = gfx::Rect(2, 2, 10, 10);
expected.clear();
expected.push_back(std::make_pair(0, 0));
TestSpiralIterate(__LINE__, smaller_tiling, consider, ignore, center,
expected);
}
}
}