#ifdef UNSAFE_BUFFERS_BUILD
# pragma allow_unsafe_buffers
#endif
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "common/utilities.h"
namespace
{
TEST(ParseResourceName, ArrayIndex)
{
std::vector<unsigned int> indices;
EXPECT_EQ("foo", gl::ParseResourceName("foo[123]", &indices));
ASSERT_EQ(1u, indices.size());
EXPECT_EQ(123u, indices[0]);
EXPECT_EQ("bar", gl::ParseResourceName("bar[0]", &indices));
ASSERT_EQ(1u, indices.size());
EXPECT_EQ(0u, indices[0]);
}
TEST(ParseResourceName, NegativeArrayIndex)
{
std::vector<unsigned int> indices;
EXPECT_EQ("foo", gl::ParseResourceName("foo[-1]", &indices));
ASSERT_EQ(1u, indices.size());
EXPECT_EQ(GL_INVALID_INDEX, indices.back());
}
TEST(ParseResourceName, LetterArrayIndex)
{
std::vector<unsigned int> indices;
EXPECT_EQ("foo", gl::ParseResourceName("foo[a]", &indices));
ASSERT_EQ(1u, indices.size());
EXPECT_EQ(GL_INVALID_INDEX, indices.back());
}
TEST(ParseResourceName, NoArrayIndex)
{
std::vector<unsigned int> indices;
EXPECT_EQ("foo", gl::ParseResourceName("foo", &indices));
EXPECT_TRUE(indices.empty());
EXPECT_EQ("foo[]", gl::ParseResourceName("foo[]", &indices));
EXPECT_TRUE(indices.empty());
}
TEST(ParseResourceName, NULLArrayIndices)
{
EXPECT_EQ("foo", gl::ParseResourceName("foo[10]", nullptr));
}
TEST(ParseResourceName, MultipleArrayIndices)
{
std::vector<unsigned int> indices;
EXPECT_EQ("foo", gl::ParseResourceName("foo[12][34][56]", &indices));
ASSERT_EQ(3u, indices.size());
EXPECT_EQ(56u, indices[0]);
EXPECT_EQ(34u, indices[1]);
EXPECT_EQ(12u, indices[2]);
}
TEST(ParseResourceName, TrailingWhitespace)
{
std::vector<unsigned int> indices;
EXPECT_EQ("foo ", gl::ParseResourceName("foo ", &indices));
EXPECT_TRUE(indices.empty());
EXPECT_EQ("foo[10] ", gl::ParseResourceName("foo[10] ", &indices));
EXPECT_TRUE(indices.empty());
EXPECT_EQ("foo[10][20] ", gl::ParseResourceName("foo[10][20] ", &indices));
EXPECT_TRUE(indices.empty());
}
TEST(ParseArrayIndex, NoArrayIndex)
{
size_t nameLengthWithoutArrayIndex;
EXPECT_EQ(GL_INVALID_INDEX, gl::ParseArrayIndex("foo", &nameLengthWithoutArrayIndex));
EXPECT_EQ(3u, nameLengthWithoutArrayIndex);
}
TEST(ParseArrayIndex, EmptyString)
{
size_t nameLengthWithoutArrayIndex;
EXPECT_EQ(GL_INVALID_INDEX, gl::ParseArrayIndex("", &nameLengthWithoutArrayIndex));
EXPECT_EQ(0u, nameLengthWithoutArrayIndex);
}
TEST(ParseArrayIndex, ArrayIndex)
{
size_t nameLengthWithoutArrayIndex;
EXPECT_EQ(123u, gl::ParseArrayIndex("foo[123]", &nameLengthWithoutArrayIndex));
EXPECT_EQ(3u, nameLengthWithoutArrayIndex);
}
TEST(ParseArrayIndex, ArrayIndexInMiddle)
{
size_t nameLengthWithoutArrayIndex;
EXPECT_EQ(GL_INVALID_INDEX, gl::ParseArrayIndex("foo[123].bar", &nameLengthWithoutArrayIndex));
EXPECT_EQ(12u, nameLengthWithoutArrayIndex);
}
TEST(ParseArrayIndex, TrailingWhitespace)
{
size_t nameLengthWithoutArrayIndex;
EXPECT_EQ(GL_INVALID_INDEX, gl::ParseArrayIndex("foo[123] ", &nameLengthWithoutArrayIndex));
EXPECT_EQ(9u, nameLengthWithoutArrayIndex);
}
TEST(ParseArrayIndex, MultipleArrayIndices)
{
size_t nameLengthWithoutArrayIndex;
EXPECT_EQ(34u, gl::ParseArrayIndex("foo[12][34]", &nameLengthWithoutArrayIndex));
EXPECT_EQ(7u, nameLengthWithoutArrayIndex);
}
TEST(ParseArrayIndex, HexArrayIndex)
{
size_t nameLengthWithoutArrayIndex;
EXPECT_EQ(GL_INVALID_INDEX, gl::ParseArrayIndex("foo[0xff]", &nameLengthWithoutArrayIndex));
EXPECT_EQ(9u, nameLengthWithoutArrayIndex);
}
TEST(ParseArrayIndex, ArrayIndexLeadingPlus)
{
size_t nameLengthWithoutArrayIndex;
EXPECT_EQ(GL_INVALID_INDEX, gl::ParseArrayIndex("foo[+1]", &nameLengthWithoutArrayIndex));
EXPECT_EQ(7u, nameLengthWithoutArrayIndex);
}
TEST(ParseArrayIndex, ArrayIndexLeadingWhiteSpace)
{
size_t nameLengthWithoutArrayIndex;
EXPECT_EQ(GL_INVALID_INDEX, gl::ParseArrayIndex("foo[ 0]", &nameLengthWithoutArrayIndex));
EXPECT_EQ(7u, nameLengthWithoutArrayIndex);
}
TEST(ParseArrayIndex, ArrayIndexTrailingWhiteSpace)
{
size_t nameLengthWithoutArrayIndex;
EXPECT_EQ(GL_INVALID_INDEX, gl::ParseArrayIndex("foo[0 ]", &nameLengthWithoutArrayIndex));
EXPECT_EQ(7u, nameLengthWithoutArrayIndex);
}
TEST(ParseArrayIndex, ArrayIndexBogus)
{
size_t nameLengthWithoutArrayIndex;
EXPECT_EQ(GL_INVALID_INDEX, gl::ParseArrayIndex("foo[0bogus]", &nameLengthWithoutArrayIndex));
EXPECT_EQ(11u, nameLengthWithoutArrayIndex);
}
TEST(ParseArrayIndex, ArrayIndexOutOfRange)
{
size_t nameLengthWithoutArrayIndex;
EXPECT_EQ(GL_INVALID_INDEX,
gl::ParseArrayIndex("foo[4294967296]", &nameLengthWithoutArrayIndex));
EXPECT_EQ(15u, nameLengthWithoutArrayIndex);
}
TEST(Utilities, ConstStrLen)
{
constexpr auto v1 = angle::ConstStrLen(nullptr);
EXPECT_EQ(0u, v1);
constexpr auto v2 = angle::ConstStrLen("");
EXPECT_EQ(0u, v2);
constexpr auto v3 = angle::ConstStrLen("a");
EXPECT_EQ(1u, v3);
constexpr char c[5] = "cc\0c";
constexpr auto v4 = angle::ConstStrLen(c);
EXPECT_EQ(2u, v4);
constexpr char d[] = "dddd";
constexpr auto v5 = angle::ConstStrLen(d);
EXPECT_EQ(4u, v5);
constexpr char *e = nullptr;
constexpr auto v6 = angle::ConstStrLen(e);
EXPECT_EQ(0u, v6);
const char cc[5] = "cc\0c";
auto n1 = angle::ConstStrLen(cc);
EXPECT_EQ(2u, n1);
const char *dd = "ddd";
auto n2 = angle::ConstStrLen(dd);
EXPECT_EQ(3u, n2);
}
TEST(Utilities, IndexRanges)
{
constexpr auto b = gl::DrawElementsType::UnsignedByte;
uint8_t vertices1[] = {1, 2, 3, 4, 0xff, 6, 5, 7, 10, 0xff, 0xff, 0xff, 9, 8, 0xff};
EXPECT_EQ(ComputeIndexRange(b, vertices1, 0, true), gl::IndexRange());
EXPECT_EQ(ComputeIndexRange(b, vertices1, 0, false), gl::IndexRange());
EXPECT_EQ(ComputeIndexRange(b, vertices1, 1, true), gl::IndexRange(1, 1));
EXPECT_EQ(ComputeIndexRange(b, vertices1, 1, false), gl::IndexRange(1, 1));
EXPECT_EQ(ComputeIndexRange(b, vertices1, 2, true), gl::IndexRange(1, 2));
EXPECT_EQ(ComputeIndexRange(b, vertices1, 2, false), gl::IndexRange(1, 2));
EXPECT_EQ(ComputeIndexRange(b, vertices1, 4, true), gl::IndexRange(1, 4));
EXPECT_EQ(ComputeIndexRange(b, vertices1, 4, false), gl::IndexRange(1, 4));
EXPECT_EQ(ComputeIndexRange(b, vertices1, 5, true), gl::IndexRange(1, 4));
EXPECT_EQ(ComputeIndexRange(b, vertices1, 5, false), gl::IndexRange(1, 255));
EXPECT_EQ(ComputeIndexRange(b, vertices1, 15, true), gl::IndexRange(1, 10));
EXPECT_EQ(ComputeIndexRange(b, vertices1, 15, false), gl::IndexRange(1, 255));
EXPECT_EQ(ComputeIndexRange(b, vertices1, 15, false), gl::IndexRange(1, 255));
EXPECT_EQ(ComputeIndexRange(b, vertices1 + 9, 3, false), gl::IndexRange(255, 255));
EXPECT_EQ(ComputeIndexRange(b, vertices1 + 9, 3, true), gl::IndexRange());
EXPECT_EQ(ComputeIndexRange(b, vertices1 + 9, 4, false), gl::IndexRange(9, 255));
EXPECT_EQ(ComputeIndexRange(b, vertices1 + 9, 4, true), gl::IndexRange(9, 9));
EXPECT_EQ(ComputeIndexRange(b, vertices1 + 8, 4, false), gl::IndexRange(10, 255));
EXPECT_EQ(ComputeIndexRange(b, vertices1 + 8, 4, true), gl::IndexRange(10, 10));
uint8_t vertices2[] = {
0xff,
0xff,
2,
};
EXPECT_EQ(ComputeIndexRange(b, vertices2, 1, true), gl::IndexRange());
EXPECT_EQ(ComputeIndexRange(b, vertices2, 1, false), gl::IndexRange(255, 255));
EXPECT_EQ(ComputeIndexRange(b, vertices2, 2, true), gl::IndexRange());
EXPECT_EQ(ComputeIndexRange(b, vertices2, 2, false), gl::IndexRange(255, 255));
EXPECT_EQ(ComputeIndexRange(b, vertices2, 3, true), gl::IndexRange(2, 2));
EXPECT_EQ(ComputeIndexRange(b, vertices2, 3, false), gl::IndexRange(2, 255));
}
}