blob: bc140d4e0efa8348c2c2c358ead9f3ac972d299d [file] [log] [blame]
// Copyright 2019 The Amber Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "src/type.h"
#include "gtest/gtest.h"
namespace amber {
namespace type {
using TypeTest = testing::Test;
TEST_F(TypeTest, IsArray) {
Number i(FormatMode::kSInt, 16);
EXPECT_FALSE(i.IsArray());
EXPECT_FALSE(i.IsRuntimeArray());
EXPECT_FALSE(i.IsSizedArray());
i.SetIsRuntimeArray();
EXPECT_TRUE(i.IsArray());
EXPECT_TRUE(i.IsRuntimeArray());
EXPECT_FALSE(i.IsSizedArray());
i.SetIsSizedArray(3);
EXPECT_TRUE(i.IsArray());
EXPECT_FALSE(i.IsRuntimeArray());
EXPECT_TRUE(i.IsSizedArray());
EXPECT_EQ(3, i.ArraySize());
}
TEST_F(TypeTest, IsStruct) {
EXPECT_FALSE(Number(FormatMode::kSInt).IsStruct());
EXPECT_TRUE(Struct().IsStruct());
EXPECT_FALSE(List().IsStruct());
}
TEST_F(TypeTest, IsNumber) {
EXPECT_TRUE(Number(FormatMode::kSInt).IsNumber());
EXPECT_FALSE(Struct().IsNumber());
EXPECT_FALSE(List().IsNumber());
}
TEST_F(TypeTest, IsList) {
EXPECT_FALSE(Number(FormatMode::kSInt).IsList());
EXPECT_FALSE(Struct().IsList());
EXPECT_TRUE(List().IsList());
}
TEST_F(TypeTest, Vectors) {
Number i(FormatMode::kSInt, 16);
i.SetRowCount(2);
EXPECT_EQ(2, i.RowCount());
EXPECT_TRUE(i.IsVec());
EXPECT_FALSE(i.IsVec3());
EXPECT_FALSE(i.IsMatrix());
i.SetColumnCount(3);
EXPECT_FALSE(i.IsVec3());
}
TEST_F(TypeTest, Matrix) {
Number i(FormatMode::kSInt, 16);
i.SetColumnCount(2);
i.SetRowCount(2);
EXPECT_EQ(2, i.ColumnCount());
EXPECT_EQ(2, i.RowCount());
EXPECT_FALSE(i.IsVec());
EXPECT_TRUE(i.IsMatrix());
}
TEST_F(TypeTest, SizeInBytesForVector) {
Number i(FormatMode::kSInt, 32);
uint32_t bytes = i.SizeInBytes();
i.SetRowCount(3);
EXPECT_EQ(bytes, i.SizeInBytes());
}
TEST_F(TypeTest, SizeInBytesForMatrix) {
Number i(FormatMode::kSInt, 32);
uint32_t bytes = i.SizeInBytes();
i.SetColumnCount(3);
i.SetRowCount(3);
EXPECT_EQ(bytes, i.SizeInBytes());
}
TEST_F(TypeTest, SizeInBytesForArray) {
Number i(FormatMode::kSInt, 32);
uint32_t bytes = i.SizeInBytes();
i.SetIsSizedArray(3);
EXPECT_EQ(bytes, i.SizeInBytes());
}
TEST_F(TypeTest, NumberEqual) {
Number n1(FormatMode::kSFloat, 32);
Number n2(FormatMode::kSFloat, 32);
Number n3(FormatMode::kSFloat, 16);
Number n4(FormatMode::kSInt, 32);
List l;
Struct s;
EXPECT_TRUE(n1.Equal(&n2));
EXPECT_FALSE(n1.Equal(&n3));
EXPECT_FALSE(n1.Equal(&n4));
EXPECT_FALSE(n1.Equal(&l));
EXPECT_FALSE(n1.Equal(&s));
}
TEST_F(TypeTest, ListPacked) {
List l;
EXPECT_FALSE(l.IsPacked());
EXPECT_EQ(0U, l.PackSizeInBits());
l.SetPackSizeInBits(32);
EXPECT_TRUE(l.IsPacked());
EXPECT_EQ(32U, l.PackSizeInBits());
}
TEST_F(TypeTest, ListEqual) {
List l1;
List l2;
l1.AddMember(FormatComponentType::kR, FormatMode::kSFloat, 32);
l2.AddMember(FormatComponentType::kR, FormatMode::kSFloat, 32);
EXPECT_TRUE(l1.Equal(&l2));
l2.SetPackSizeInBits(24);
EXPECT_FALSE(l1.Equal(&l2));
List l3;
l3.AddMember(FormatComponentType::kR, FormatMode::kSFloat, 16);
EXPECT_FALSE(l1.Equal(&l3));
List l4;
l4.AddMember(FormatComponentType::kR, FormatMode::kSInt, 16);
EXPECT_FALSE(l1.Equal(&l4));
List l5;
l5.AddMember(FormatComponentType::kG, FormatMode::kSFloat, 32);
EXPECT_FALSE(l1.Equal(&l5));
List l6;
l6.AddMember(FormatComponentType::kR, FormatMode::kSFloat, 32);
l6.AddMember(FormatComponentType::kG, FormatMode::kSFloat, 32);
EXPECT_FALSE(l1.Equal(&l6));
}
TEST_F(TypeTest, StructStride) {
Struct s;
EXPECT_FALSE(s.HasStride());
EXPECT_EQ(0U, s.StrideInBytes());
s.SetStrideInBytes(32);
EXPECT_TRUE(s.HasStride());
EXPECT_EQ(32U, s.StrideInBytes());
}
TEST_F(TypeTest, StructEqual) {
Struct s1;
Struct s2;
auto num32 = Number::Float(32);
auto m1 = s1.AddMember(num32.get());
s2.AddMember(num32.get());
EXPECT_TRUE(s1.Equal(&s2));
s2.SetStrideInBytes(20);
EXPECT_FALSE(s1.Equal(&s2));
Struct s3;
auto num16 = Number::Float(16);
s3.AddMember(num16.get());
EXPECT_FALSE(s1.Equal(&s3));
Struct s4;
auto m = s4.AddMember(num16.get());
m->offset_in_bytes = 20;
EXPECT_FALSE(s1.Equal(&s4));
m->offset_in_bytes = m1->offset_in_bytes;
m->array_stride_in_bytes = 20;
EXPECT_FALSE(s1.Equal(&s4));
m->array_stride_in_bytes = m1->array_stride_in_bytes;
m->matrix_stride_in_bytes = 20;
EXPECT_FALSE(s1.Equal(&s4));
}
TEST_F(TypeTest, NumberDefault32Bits) {
EXPECT_EQ(4, Number(FormatMode::kUNorm).SizeInBytes());
}
TEST_F(TypeTest, NumberInBytes) {
EXPECT_EQ(1, Number(FormatMode::kSInt, 8).SizeInBytes());
EXPECT_EQ(2, Number(FormatMode::kSInt, 16).SizeInBytes());
EXPECT_EQ(4, Number(FormatMode::kSInt, 32).SizeInBytes());
EXPECT_EQ(8, Number(FormatMode::kSInt, 64).SizeInBytes());
}
TEST_F(TypeTest, IsInt) {
EXPECT_TRUE(Type::IsInt(FormatMode::kSInt));
EXPECT_TRUE(Type::IsInt(FormatMode::kSNorm));
EXPECT_TRUE(Type::IsInt(FormatMode::kSScaled));
EXPECT_TRUE(Type::IsInt(FormatMode::kSRGB));
EXPECT_TRUE(Type::IsInt(FormatMode::kUNorm));
EXPECT_TRUE(Type::IsInt(FormatMode::kUInt));
EXPECT_TRUE(Type::IsInt(FormatMode::kUScaled));
EXPECT_FALSE(Type::IsInt(FormatMode::kSFloat));
EXPECT_FALSE(Type::IsInt(FormatMode::kUFloat));
}
TEST_F(TypeTest, IsSignedInt) {
EXPECT_TRUE(Type::IsSignedInt(FormatMode::kSInt));
EXPECT_TRUE(Type::IsSignedInt(FormatMode::kSNorm));
EXPECT_TRUE(Type::IsSignedInt(FormatMode::kSScaled));
EXPECT_FALSE(Type::IsSignedInt(FormatMode::kSRGB));
EXPECT_FALSE(Type::IsSignedInt(FormatMode::kUNorm));
EXPECT_FALSE(Type::IsSignedInt(FormatMode::kUInt));
EXPECT_FALSE(Type::IsSignedInt(FormatMode::kUScaled));
EXPECT_FALSE(Type::IsSignedInt(FormatMode::kSFloat));
EXPECT_FALSE(Type::IsSignedInt(FormatMode::kUFloat));
}
TEST_F(TypeTest, IsUnsignedInt) {
EXPECT_FALSE(Type::IsUnsignedInt(FormatMode::kSInt));
EXPECT_FALSE(Type::IsUnsignedInt(FormatMode::kSNorm));
EXPECT_FALSE(Type::IsUnsignedInt(FormatMode::kSScaled));
EXPECT_TRUE(Type::IsUnsignedInt(FormatMode::kSRGB));
EXPECT_TRUE(Type::IsUnsignedInt(FormatMode::kUNorm));
EXPECT_TRUE(Type::IsUnsignedInt(FormatMode::kUInt));
EXPECT_TRUE(Type::IsUnsignedInt(FormatMode::kUScaled));
EXPECT_FALSE(Type::IsUnsignedInt(FormatMode::kSFloat));
EXPECT_FALSE(Type::IsUnsignedInt(FormatMode::kUFloat));
}
TEST_F(TypeTest, IsFloat) {
EXPECT_FALSE(Type::IsFloat(FormatMode::kSInt));
EXPECT_FALSE(Type::IsFloat(FormatMode::kSNorm));
EXPECT_FALSE(Type::IsFloat(FormatMode::kSScaled));
EXPECT_FALSE(Type::IsFloat(FormatMode::kSRGB));
EXPECT_FALSE(Type::IsFloat(FormatMode::kUNorm));
EXPECT_FALSE(Type::IsFloat(FormatMode::kUInt));
EXPECT_FALSE(Type::IsFloat(FormatMode::kUScaled));
EXPECT_TRUE(Type::IsFloat(FormatMode::kSFloat));
EXPECT_TRUE(Type::IsFloat(FormatMode::kUFloat));
}
TEST_F(TypeTest, IsInt8) {
EXPECT_TRUE(Type::IsInt8(FormatMode::kSInt, 8));
EXPECT_TRUE(Type::IsInt8(FormatMode::kSNorm, 8));
EXPECT_TRUE(Type::IsInt8(FormatMode::kSScaled, 8));
EXPECT_FALSE(Type::IsInt8(FormatMode::kSRGB, 8));
EXPECT_FALSE(Type::IsInt8(FormatMode::kUNorm, 8));
EXPECT_FALSE(Type::IsInt8(FormatMode::kUInt, 8));
EXPECT_FALSE(Type::IsInt8(FormatMode::kUScaled, 8));
EXPECT_FALSE(Type::IsInt8(FormatMode::kUFloat, 8));
EXPECT_FALSE(Type::IsInt8(FormatMode::kSFloat, 8));
}
TEST_F(TypeTest, IsInt16) {
EXPECT_TRUE(Type::IsInt16(FormatMode::kSInt, 16));
EXPECT_TRUE(Type::IsInt16(FormatMode::kSNorm, 16));
EXPECT_TRUE(Type::IsInt16(FormatMode::kSScaled, 16));
EXPECT_FALSE(Type::IsInt16(FormatMode::kSRGB, 16));
EXPECT_FALSE(Type::IsInt16(FormatMode::kUNorm, 16));
EXPECT_FALSE(Type::IsInt16(FormatMode::kUInt, 16));
EXPECT_FALSE(Type::IsInt16(FormatMode::kUScaled, 16));
EXPECT_FALSE(Type::IsInt16(FormatMode::kUFloat, 16));
EXPECT_FALSE(Type::IsInt16(FormatMode::kSFloat, 16));
}
TEST_F(TypeTest, IsInt32) {
EXPECT_TRUE(Type::IsInt32(FormatMode::kSInt, 32));
EXPECT_TRUE(Type::IsInt32(FormatMode::kSNorm, 32));
EXPECT_TRUE(Type::IsInt32(FormatMode::kSScaled, 32));
EXPECT_FALSE(Type::IsInt32(FormatMode::kSRGB, 32));
EXPECT_FALSE(Type::IsInt32(FormatMode::kUNorm, 32));
EXPECT_FALSE(Type::IsInt32(FormatMode::kUInt, 32));
EXPECT_FALSE(Type::IsInt32(FormatMode::kUScaled, 32));
EXPECT_FALSE(Type::IsInt32(FormatMode::kUFloat, 32));
EXPECT_FALSE(Type::IsInt32(FormatMode::kSFloat, 32));
}
TEST_F(TypeTest, IsInt64) {
EXPECT_TRUE(Type::IsInt64(FormatMode::kSInt, 64));
EXPECT_TRUE(Type::IsInt64(FormatMode::kSNorm, 64));
EXPECT_TRUE(Type::IsInt64(FormatMode::kSScaled, 64));
EXPECT_FALSE(Type::IsInt64(FormatMode::kSRGB, 64));
EXPECT_FALSE(Type::IsInt64(FormatMode::kUNorm, 64));
EXPECT_FALSE(Type::IsInt64(FormatMode::kUInt, 64));
EXPECT_FALSE(Type::IsInt64(FormatMode::kUScaled, 64));
EXPECT_FALSE(Type::IsInt64(FormatMode::kUFloat, 64));
EXPECT_FALSE(Type::IsInt64(FormatMode::kSFloat, 64));
}
TEST_F(TypeTest, IsUint8) {
EXPECT_FALSE(Type::IsUint8(FormatMode::kSInt, 8));
EXPECT_FALSE(Type::IsUint8(FormatMode::kSNorm, 8));
EXPECT_FALSE(Type::IsUint8(FormatMode::kSScaled, 8));
EXPECT_TRUE(Type::IsUint8(FormatMode::kSRGB, 8));
EXPECT_TRUE(Type::IsUint8(FormatMode::kUNorm, 8));
EXPECT_TRUE(Type::IsUint8(FormatMode::kUInt, 8));
EXPECT_TRUE(Type::IsUint8(FormatMode::kUScaled, 8));
EXPECT_FALSE(Type::IsUint8(FormatMode::kUFloat, 8));
EXPECT_FALSE(Type::IsUint8(FormatMode::kSFloat, 8));
}
TEST_F(TypeTest, IsUint16) {
EXPECT_FALSE(Type::IsUint16(FormatMode::kSInt, 16));
EXPECT_FALSE(Type::IsUint16(FormatMode::kSNorm, 16));
EXPECT_FALSE(Type::IsUint16(FormatMode::kSScaled, 16));
EXPECT_TRUE(Type::IsUint16(FormatMode::kSRGB, 16));
EXPECT_TRUE(Type::IsUint16(FormatMode::kUNorm, 16));
EXPECT_TRUE(Type::IsUint16(FormatMode::kUInt, 16));
EXPECT_TRUE(Type::IsUint16(FormatMode::kUScaled, 16));
EXPECT_FALSE(Type::IsUint16(FormatMode::kUFloat, 16));
EXPECT_FALSE(Type::IsUint16(FormatMode::kSFloat, 16));
}
TEST_F(TypeTest, IsUint32) {
EXPECT_FALSE(Type::IsUint32(FormatMode::kSInt, 32));
EXPECT_FALSE(Type::IsUint32(FormatMode::kSNorm, 32));
EXPECT_FALSE(Type::IsUint32(FormatMode::kSScaled, 32));
EXPECT_TRUE(Type::IsUint32(FormatMode::kSRGB, 32));
EXPECT_TRUE(Type::IsUint32(FormatMode::kUNorm, 32));
EXPECT_TRUE(Type::IsUint32(FormatMode::kUInt, 32));
EXPECT_TRUE(Type::IsUint32(FormatMode::kUScaled, 32));
EXPECT_FALSE(Type::IsUint32(FormatMode::kUFloat, 32));
EXPECT_FALSE(Type::IsUint32(FormatMode::kSFloat, 32));
}
TEST_F(TypeTest, IsUint64) {
EXPECT_FALSE(Type::IsUint64(FormatMode::kSInt, 64));
EXPECT_FALSE(Type::IsUint64(FormatMode::kSNorm, 64));
EXPECT_FALSE(Type::IsUint64(FormatMode::kSScaled, 64));
EXPECT_TRUE(Type::IsUint64(FormatMode::kSRGB, 64));
EXPECT_TRUE(Type::IsUint64(FormatMode::kUNorm, 64));
EXPECT_TRUE(Type::IsUint64(FormatMode::kUInt, 64));
EXPECT_TRUE(Type::IsUint64(FormatMode::kUScaled, 64));
EXPECT_FALSE(Type::IsUint64(FormatMode::kUFloat, 64));
EXPECT_FALSE(Type::IsUint64(FormatMode::kSFloat, 64));
}
TEST_F(TypeTest, IsFloat16) {
EXPECT_TRUE(Type::IsFloat16(FormatMode::kSFloat, 16));
EXPECT_TRUE(Type::IsFloat16(FormatMode::kUFloat, 16));
EXPECT_FALSE(Type::IsFloat16(FormatMode::kSInt, 16));
EXPECT_FALSE(Type::IsFloat16(FormatMode::kSNorm, 16));
EXPECT_FALSE(Type::IsFloat16(FormatMode::kSScaled, 16));
EXPECT_FALSE(Type::IsFloat16(FormatMode::kSRGB, 16));
EXPECT_FALSE(Type::IsFloat16(FormatMode::kUNorm, 16));
EXPECT_FALSE(Type::IsFloat16(FormatMode::kUInt, 16));
EXPECT_FALSE(Type::IsFloat16(FormatMode::kUScaled, 16));
}
TEST_F(TypeTest, IsFloat32) {
EXPECT_TRUE(Type::IsFloat32(FormatMode::kSFloat, 32));
EXPECT_TRUE(Type::IsFloat32(FormatMode::kUFloat, 32));
EXPECT_FALSE(Type::IsFloat32(FormatMode::kSInt, 32));
EXPECT_FALSE(Type::IsFloat32(FormatMode::kSNorm, 32));
EXPECT_FALSE(Type::IsFloat32(FormatMode::kSScaled, 32));
EXPECT_FALSE(Type::IsFloat32(FormatMode::kSRGB, 32));
EXPECT_FALSE(Type::IsFloat32(FormatMode::kUNorm, 32));
EXPECT_FALSE(Type::IsFloat32(FormatMode::kUInt, 32));
EXPECT_FALSE(Type::IsFloat32(FormatMode::kUScaled, 32));
}
TEST_F(TypeTest, IsFloat64) {
EXPECT_TRUE(Type::IsFloat64(FormatMode::kSFloat, 64));
EXPECT_TRUE(Type::IsFloat64(FormatMode::kUFloat, 64));
EXPECT_FALSE(Type::IsFloat64(FormatMode::kSInt, 64));
EXPECT_FALSE(Type::IsFloat64(FormatMode::kSNorm, 64));
EXPECT_FALSE(Type::IsFloat64(FormatMode::kSScaled, 64));
EXPECT_FALSE(Type::IsFloat64(FormatMode::kSRGB, 64));
EXPECT_FALSE(Type::IsFloat64(FormatMode::kUNorm, 64));
EXPECT_FALSE(Type::IsFloat64(FormatMode::kUInt, 64));
EXPECT_FALSE(Type::IsFloat64(FormatMode::kUScaled, 64));
}
} // namespace type
} // namespace amber