aboutsummaryrefslogtreecommitdiff
path: root/src/amberscript/parser_buffer_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/amberscript/parser_buffer_test.cc')
-rw-r--r--src/amberscript/parser_buffer_test.cc419
1 files changed, 378 insertions, 41 deletions
diff --git a/src/amberscript/parser_buffer_test.cc b/src/amberscript/parser_buffer_test.cc
index 1381ec8..aeac2cb 100644
--- a/src/amberscript/parser_buffer_test.cc
+++ b/src/amberscript/parser_buffer_test.cc
@@ -20,6 +20,34 @@ namespace amberscript {
using AmberScriptParserTest = testing::Test;
+class DummyDelegate : public amber::Delegate {
+ public:
+ DummyDelegate() = default;
+ ~DummyDelegate() override = default;
+
+ void Log(const std::string&) override {}
+ bool LogGraphicsCalls() const override { return false; }
+ void SetLogGraphicsCalls(bool) {}
+ bool LogExecuteCalls() const override { return false; }
+ void SetLogExecuteCalls(bool) {}
+ bool LogGraphicsCallsTime() const override { return false; }
+ void SetLogGraphicsCallsTime(bool) {}
+ uint64_t GetTimestampNs() const override { return 0; }
+ void SetScriptPath(std::string) {}
+
+ amber::Result LoadBufferData(const std::string,
+ amber::BufferDataFileType type,
+ amber::BufferInfo* buffer) const override {
+ amber::Value v;
+ v.SetIntValue(static_cast<uint64_t>(type));
+ buffer->values.push_back(v);
+ buffer->width = 1;
+ buffer->height = 1;
+
+ return {};
+ }
+};
+
TEST_F(AmberScriptParserTest, BufferData) {
std::string in = R"(
BUFFER my_buffer DATA_TYPE uint32 DATA
@@ -184,6 +212,72 @@ END)";
}
}
+TEST_F(AmberScriptParserTest, BufferDataArrayStd140) {
+ std::string in = R"(
+BUFFER my_buffer DATA_TYPE uint32[] STD140 DATA
+1 2 3 4
+55 99 1234
+END)";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_TRUE(r.IsSuccess()) << r.Error();
+
+ auto script = parser.GetScript();
+ const auto& buffers = script->GetBuffers();
+ ASSERT_EQ(1U, buffers.size());
+
+ ASSERT_TRUE(buffers[0] != nullptr);
+ EXPECT_EQ("my_buffer", buffers[0]->GetName());
+
+ auto* buffer = buffers[0].get();
+ EXPECT_TRUE(buffer->GetFormat()->IsUint32());
+ EXPECT_EQ(Format::Layout::kStd140, buffer->GetFormat()->GetLayout());
+ EXPECT_EQ(7U, buffer->ElementCount());
+ EXPECT_EQ(28U * sizeof(uint32_t), buffer->GetSizeInBytes());
+
+ std::vector<uint32_t> results = {1, 0, 0, 0, 2, 0, 0, 0, 3, 0,
+ 0, 0, 4, 0, 0, 0, 55, 0, 0, 0,
+ 99, 0, 0, 0, 1234, 0, 0, 0};
+ const auto* data = buffer->GetValues<uint32_t>();
+ for (size_t i = 0; i < results.size(); ++i) {
+ EXPECT_EQ(results[i], data[i]);
+ }
+}
+
+TEST_F(AmberScriptParserTest, BufferDataArrayStd430) {
+ std::string in = R"(
+BUFFER my_buffer DATA_TYPE uint32[] STD430 DATA
+1 2 3 4
+55 99 1234
+END)";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_TRUE(r.IsSuccess()) << r.Error();
+
+ auto script = parser.GetScript();
+ const auto& buffers = script->GetBuffers();
+ ASSERT_EQ(1U, buffers.size());
+
+ ASSERT_TRUE(buffers[0] != nullptr);
+ EXPECT_EQ("my_buffer", buffers[0]->GetName());
+
+ auto* buffer = buffers[0].get();
+ EXPECT_TRUE(buffer->GetFormat()->IsUint32());
+ EXPECT_EQ(Format::Layout::kStd430, buffer->GetFormat()->GetLayout());
+ EXPECT_EQ(7U, buffer->ElementCount());
+ EXPECT_EQ(7U, buffer->ValueCount());
+ EXPECT_EQ(7U * sizeof(uint32_t), buffer->GetSizeInBytes());
+
+ std::vector<uint32_t> results = {1, 2, 3, 4, 55, 99, 1234};
+ const auto* data = buffer->GetValues<uint32_t>();
+ ASSERT_EQ(results.size(), buffer->ValueCount());
+ for (size_t i = 0; i < results.size(); ++i) {
+ EXPECT_EQ(results[i], data[i]);
+ }
+}
+
TEST_F(AmberScriptParserTest, BufferDataOneLine) {
std::string in = "BUFFER my_buffer DATA_TYPE uint32 DATA 1 2 3 4 END";
@@ -568,12 +662,29 @@ TEST_F(AmberScriptParserTest, BufferFormat) {
ASSERT_EQ(4U, segs.size());
for (size_t i = 0; i < 4; ++i) {
- EXPECT_EQ(segs[i].GetNumBits(), 32);
+ EXPECT_EQ(segs[i].GetNumBits(), 32u);
EXPECT_EQ(segs[i].GetFormatMode(), FormatMode::kSInt);
EXPECT_EQ(segs[i].GetName(), static_cast<FormatComponentType>(i));
}
}
+TEST_F(AmberScriptParserTest, BufferSamples) {
+ std::string in = "BUFFER my_buf FORMAT R8G8B8A8_UNORM SAMPLES 2";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_TRUE(r.IsSuccess()) << r.Error();
+
+ auto script = parser.GetScript();
+ const auto& buffers = script->GetBuffers();
+ ASSERT_EQ(1U, buffers.size());
+
+ ASSERT_TRUE(buffers[0] != nullptr);
+ auto* buffer = buffers[0].get();
+ EXPECT_EQ("my_buf", buffer->GetName());
+ EXPECT_EQ(2u, buffer->GetSamples());
+}
+
struct BufferParseError {
const char* in;
const char* err;
@@ -594,11 +705,11 @@ INSTANTIATE_TEST_SUITE_P(
AmberScriptParserBufferParseErrorTest,
testing::Values(
BufferParseError{"BUFFER my_buf FORMAT 123",
- "1: BUFFER FORMAT must be a string"},
+ "1: BUFFER FORMAT must be an identifier"},
BufferParseError{"BUFFER my_buf FORMAT A23A32",
"1: invalid BUFFER FORMAT"},
BufferParseError{"BUFFER my_buf FORMAT",
- "1: BUFFER FORMAT must be a string"},
+ "1: BUFFER FORMAT must be an identifier"},
BufferParseError{"BUFFER my_buffer FORMAT R32G32B32A32_SFLOAT EXTRA",
"1: unknown token: EXTRA"},
BufferParseError{"BUFFER 1234 DATA_TYPE uint8 SIZE 5 FILL 5",
@@ -650,18 +761,23 @@ INSTANTIATE_TEST_SUITE_P(
BufferParseError{
"BUFFER my_index_buffer DATA_TYPE int32 DATA INVALID\n123\nEND",
"1: invalid BUFFER data value: INVALID"},
- BufferParseError{"BUFFER my_index_buffer DATA_TYPE int32 SIZE 256 FILL "
- "5 INVALID\n123\nEND",
- "1: extra parameters after BUFFER fill command"},
+ BufferParseError{
+ "BUFFER my_index_buffer DATA_TYPE int32 SIZE 256 FILL "
+ "5 INVALID\n123\nEND",
+ "1: extra parameters after BUFFER fill command: INVALID"},
BufferParseError{
"BUFFER my_buffer DATA_TYPE int32 SIZE 256 SERIES_FROM 2 "
"INC_BY 5 "
"INVALID",
- "1: extra parameters after BUFFER series_from command"},
+ "1: extra parameters after BUFFER series_from command: INVALID"},
BufferParseError{"BUFFER my_buf DATA_TYPE int32 SIZE 5 FILL 5\nBUFFER "
"my_buf DATA_TYPE int16 SIZE 5 FILL 2",
// NOLINTNEXTLINE(whitespace/parens)
- "2: duplicate buffer name provided"}));
+ "2: duplicate buffer name provided"},
+ BufferParseError{"BUFFER my_buf FORMAT R8G8B8A8_UNORM SAMPLES 9",
+ "1: invalid sample count: 9"},
+ BufferParseError{"BUFFER my_buf FORMAT R8G8B8A8_UNORM SAMPLES foo",
+ "1: expected integer value for SAMPLES"}));
struct BufferData {
const char* name;
@@ -669,6 +785,7 @@ struct BufferData {
size_t num_bits;
size_t row_count;
size_t column_count;
+ bool is_array;
};
using AmberScriptParserBufferDataTypeTest = testing::TestWithParam<BufferData>;
@@ -693,30 +810,55 @@ TEST_P(AmberScriptParserBufferDataTypeTest, BufferTypes) {
EXPECT_EQ(test_data.row_count, fmt->GetType()->RowCount());
EXPECT_EQ(test_data.column_count, fmt->GetType()->ColumnCount());
- EXPECT_EQ(test_data.type, fmt->GetSegments()[0].GetFormatMode());
- EXPECT_EQ(test_data.num_bits, fmt->GetSegments()[0].GetNumBits());
+ auto& seg = fmt->GetSegments()[0];
+ EXPECT_EQ(test_data.type, seg.GetFormatMode());
+ EXPECT_EQ(test_data.num_bits, seg.GetNumBits());
+ EXPECT_EQ(test_data.is_array, fmt->GetType()->IsArray());
}
INSTANTIATE_TEST_SUITE_P(
AmberScriptParserTestsDataType,
AmberScriptParserBufferDataTypeTest,
- testing::Values(BufferData{"int8", FormatMode::kSInt, 8, 1, 1},
- BufferData{"int16", FormatMode::kSInt, 16, 1, 1},
- BufferData{"int32", FormatMode::kSInt, 32, 1, 1},
- BufferData{"int64", FormatMode::kSInt, 64, 1, 1},
- BufferData{"uint8", FormatMode::kUInt, 8, 1, 1},
- BufferData{"uint16", FormatMode::kUInt, 16, 1, 1},
- BufferData{"uint32", FormatMode::kUInt, 32, 1, 1},
- BufferData{"uint64", FormatMode::kUInt, 64, 1, 1},
- BufferData{"vec2<int8>", FormatMode::kSInt, 8, 2, 1},
- BufferData{"vec4<uint32>", FormatMode::kUInt, 32, 4, 1},
- BufferData{"mat2x4<int32>", FormatMode::kSInt, 32, 4, 2},
- BufferData{"mat4x2<uint16>", FormatMode::kUInt, 16, 2, 4},
- BufferData{"B8G8R8_UNORM", FormatMode::kUNorm, 8, 3, 1},
- BufferData{"float", FormatMode::kSFloat, 32, 1, 1},
- BufferData{"double", FormatMode::kSFloat, 64, 1, 1},
- BufferData{"vec3<float>", FormatMode::kSFloat, 32, 3, 1},
- BufferData{"mat3x3<float>", FormatMode::kSFloat, 32, 3,
- 3})); // NOLINT(whitespace/parens)
+ testing::Values(
+ BufferData{"int8", FormatMode::kSInt, 8, 1, 1, false},
+ BufferData{"int16", FormatMode::kSInt, 16, 1, 1, false},
+ BufferData{"int32", FormatMode::kSInt, 32, 1, 1, false},
+ BufferData{"int64", FormatMode::kSInt, 64, 1, 1, false},
+ BufferData{"uint8", FormatMode::kUInt, 8, 1, 1, false},
+ BufferData{"uint16", FormatMode::kUInt, 16, 1, 1, false},
+ BufferData{"uint32", FormatMode::kUInt, 32, 1, 1, false},
+ BufferData{"uint64", FormatMode::kUInt, 64, 1, 1, false},
+ BufferData{"float", FormatMode::kSFloat, 32, 1, 1, false},
+ BufferData{"double", FormatMode::kSFloat, 64, 1, 1, false},
+ BufferData{"vec2<int8>", FormatMode::kSInt, 8, 2, 1, false},
+ BufferData{"vec3<float>", FormatMode::kSFloat, 32, 3, 1, false},
+ BufferData{"vec4<uint32>", FormatMode::kUInt, 32, 4, 1, false},
+ BufferData{"mat2x4<int32>", FormatMode::kSInt, 32, 4, 2, false},
+ BufferData{"mat3x3<float>", FormatMode::kSFloat, 32, 3, 3, false},
+ BufferData{"mat4x2<uint16>", FormatMode::kUInt, 16, 2, 4, false},
+ BufferData{"B8G8R8_UNORM", FormatMode::kUNorm, 8, 3, 1,
+ false})); // NOLINT(whitespace/parens)
+
+INSTANTIATE_TEST_SUITE_P(
+ AmberScriptParserTestsDataType2,
+ AmberScriptParserBufferDataTypeTest,
+ testing::Values(
+ BufferData{"int8[]", FormatMode::kSInt, 8, 1, 1, true},
+ BufferData{"int16[]", FormatMode::kSInt, 16, 1, 1, true},
+ BufferData{"int32[]", FormatMode::kSInt, 32, 1, 1, true},
+ BufferData{"int64[]", FormatMode::kSInt, 64, 1, 1, true},
+ BufferData{"uint8[]", FormatMode::kUInt, 8, 1, 1, true},
+ BufferData{"uint16[]", FormatMode::kUInt, 16, 1, 1, true},
+ BufferData{"uint32[]", FormatMode::kUInt, 32, 1, 1, true},
+ BufferData{"uint64[]", FormatMode::kUInt, 64, 1, 1, true},
+ BufferData{"float[]", FormatMode::kSFloat, 32, 1, 1, true},
+ BufferData{"double[]", FormatMode::kSFloat, 64, 1, 1, true},
+ BufferData{"vec2<int8>[]", FormatMode::kSInt, 8, 2, 1, true},
+ BufferData{"vec3<float>[]", FormatMode::kSFloat, 32, 3, 1, true},
+ BufferData{"vec4<uint32>[]", FormatMode::kUInt, 32, 4, 1, true},
+ BufferData{"mat2x4<int32>[]", FormatMode::kSInt, 32, 4, 2, true},
+ BufferData{"mat3x3<float>[]", FormatMode::kSFloat, 32, 3, 3, true},
+ BufferData{"mat4x2<uint16>[]", FormatMode::kUInt, 16, 2, 4,
+ true})); // NOLINT(whitespace/parens)
struct NameData {
const char* name;
@@ -742,6 +884,9 @@ INSTANTIATE_TEST_SUITE_P(
AmberScriptParserBufferDataTypeInvalidTestSamples,
AmberScriptParserBufferDataTypeInvalidTest,
testing::Values(NameData{"int17"},
+ NameData{"int["},
+ NameData{"int]"},
+ NameData{"B8G8R8_UNORM[]"},
NameData{"uintt0"},
NameData{"vec7<uint8>"},
NameData{"vec27<uint8>"},
@@ -805,12 +950,12 @@ END)";
const auto* data = buffer->GetValues<uint8_t>();
EXPECT_FLOAT_EQ(1.f, *reinterpret_cast<const float*>(data + 0));
- EXPECT_EQ(64,
+ EXPECT_EQ(64u,
*reinterpret_cast<const uint32_t*>(data + 4 /* sizeof(float) */));
- EXPECT_EQ(128,
+ EXPECT_EQ(128u,
*reinterpret_cast<const uint32_t*>(data + 16 /* 8 round -> 16 */));
- EXPECT_EQ(220, *reinterpret_cast<const uint32_t*>(
- data + 20 /* 8 round -> 16 + 4 */));
+ EXPECT_EQ(220u, *reinterpret_cast<const uint32_t*>(
+ data + 20 /* 8 round -> 16 + 4 */));
}
TEST_F(AmberScriptParserTest, BufferWithStructStd430) {
@@ -853,9 +998,9 @@ END)";
const auto* data = buffer->GetValues<uint8_t>();
EXPECT_FLOAT_EQ(1.f, *reinterpret_cast<const float*>(data + 0));
- EXPECT_EQ(64, *reinterpret_cast<const uint32_t*>(data + 4));
- EXPECT_EQ(128, *reinterpret_cast<const uint32_t*>(data + 8));
- EXPECT_EQ(220, *reinterpret_cast<const uint32_t*>(data + 12));
+ EXPECT_EQ(64u, *reinterpret_cast<const uint32_t*>(data + 4));
+ EXPECT_EQ(128u, *reinterpret_cast<const uint32_t*>(data + 8));
+ EXPECT_EQ(220u, *reinterpret_cast<const uint32_t*>(data + 12));
}
TEST_F(AmberScriptParserTest, BufferWithStructAndPaddingStd430) {
@@ -898,9 +1043,9 @@ END)";
const auto* data = buffer->GetValues<uint8_t>();
EXPECT_FLOAT_EQ(1.f, *reinterpret_cast<const float*>(data + 8));
- EXPECT_EQ(64, *reinterpret_cast<const uint32_t*>(data + 16));
- EXPECT_EQ(128, *reinterpret_cast<const uint32_t*>(data + 28));
- EXPECT_EQ(220, *reinterpret_cast<const uint32_t*>(data + 36));
+ EXPECT_EQ(64u, *reinterpret_cast<const uint32_t*>(data + 16));
+ EXPECT_EQ(128u, *reinterpret_cast<const uint32_t*>(data + 28));
+ EXPECT_EQ(220u, *reinterpret_cast<const uint32_t*>(data + 36));
}
TEST_F(AmberScriptParserTest, BufferWithStructPartialInitialization) {
@@ -956,9 +1101,201 @@ END)";
const auto* data = buffer->GetValues<uint8_t>();
EXPECT_FLOAT_EQ(1.f, *reinterpret_cast<const float*>(data + 0));
- EXPECT_FLOAT_EQ(64, *reinterpret_cast<const float*>(data + 16));
- EXPECT_FLOAT_EQ(128, *reinterpret_cast<const float*>(data + 20));
- EXPECT_FLOAT_EQ(220, *reinterpret_cast<const float*>(data + 24));
+ EXPECT_FLOAT_EQ(64u, *reinterpret_cast<const float*>(data + 16));
+ EXPECT_FLOAT_EQ(128u, *reinterpret_cast<const float*>(data + 20));
+ EXPECT_FLOAT_EQ(220u, *reinterpret_cast<const float*>(data + 24));
+}
+
+TEST_F(AmberScriptParserTest, InvalidBufferWidth) {
+ std::string in = R"(
+BUFFER buf DATA_TYPE vec4<float> WIDTH a
+)";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_FALSE(r.IsSuccess());
+ EXPECT_EQ("2: expected an integer for WIDTH", r.Error());
+}
+
+TEST_F(AmberScriptParserTest, ZeroBufferWidth) {
+ std::string in = R"(
+BUFFER buf DATA_TYPE vec4<float> WIDTH 0
+)";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_FALSE(r.IsSuccess());
+ EXPECT_EQ("2: expected WIDTH to be positive", r.Error());
+}
+
+TEST_F(AmberScriptParserTest, MissingBufferHeight) {
+ std::string in = R"(
+BUFFER buf DATA_TYPE vec4<float> WIDTH 1
+)";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_FALSE(r.IsSuccess());
+ EXPECT_EQ("3: BUFFER HEIGHT missing", r.Error());
+}
+
+TEST_F(AmberScriptParserTest, InvalidBufferHeight) {
+ std::string in = R"(
+BUFFER buf DATA_TYPE vec4<float> WIDTH 1 HEIGHT 1.0
+)";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_FALSE(r.IsSuccess());
+ EXPECT_EQ("2: expected an integer for HEIGHT", r.Error());
+}
+
+TEST_F(AmberScriptParserTest, ZeroBufferHeight) {
+ std::string in = R"(
+BUFFER buf DATA_TYPE vec4<float> WIDTH 1 HEIGHT 0
+)";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_FALSE(r.IsSuccess());
+
+ EXPECT_EQ("2: expected HEIGHT to be positive", r.Error());
+}
+
+TEST_F(AmberScriptParserTest, BufferWidthAndHeight) {
+ std::string in = R"(
+BUFFER buf DATA_TYPE vec4<float> WIDTH 2 HEIGHT 3
+)";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_TRUE(r.IsSuccess());
+
+ auto script = parser.GetScript();
+ const auto& buffers = script->GetBuffers();
+ ASSERT_EQ(1U, buffers.size());
+ ASSERT_TRUE(buffers[0] != nullptr);
+ EXPECT_EQ("buf", buffers[0]->GetName());
+
+ auto* buffer = buffers[0].get();
+ EXPECT_EQ(2u, buffer->GetWidth());
+ EXPECT_EQ(3u, buffer->GetHeight());
+ EXPECT_EQ(6u, buffer->ElementCount());
+}
+
+TEST_F(AmberScriptParserTest, BufferMipLevels) {
+ std::string in = "BUFFER my_buffer FORMAT R8G8B8A8_UNORM MIP_LEVELS 3";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_TRUE(r.IsSuccess()) << r.Error();
+
+ auto script = parser.GetScript();
+ const auto& buffers = script->GetBuffers();
+ ASSERT_EQ(1U, buffers.size());
+
+ ASSERT_TRUE(buffers[0] != nullptr);
+ EXPECT_EQ("my_buffer", buffers[0]->GetName());
+
+ auto* buffer = buffers[0].get();
+ EXPECT_EQ(3U, buffer->GetMipLevels());
+}
+
+TEST_F(AmberScriptParserTest, BufferMissingMipLevels) {
+ std::string in = "BUFFER my_buffer FORMAT R8G8B8A8_UNORM MIP_LEVELS";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_FALSE(r.IsSuccess());
+
+ EXPECT_EQ("1: invalid value for MIP_LEVELS", r.Error());
+}
+
+TEST_F(AmberScriptParserTest, BufferMissingDataFile) {
+ std::string in = "BUFFER my_buffer FORMAT R8G8B8A8_UNORM FILE";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_FALSE(r.IsSuccess());
+
+ EXPECT_EQ("1: invalid value for FILE", r.Error());
+}
+
+TEST_F(AmberScriptParserTest, BufferMissingDataFilePng) {
+ std::string in = "BUFFER my_buffer FORMAT R8G8B8A8_UNORM FILE PNG";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_FALSE(r.IsSuccess());
+
+ EXPECT_EQ("1: missing file name for FILE", r.Error());
+}
+
+TEST_F(AmberScriptParserTest, BufferDataFilePng) {
+ std::string in = "BUFFER my_buffer FORMAT R8G8B8A8_UNORM FILE PNG foo.png";
+
+ DummyDelegate delegate;
+ Parser parser(&delegate);
+ Result r = parser.Parse(in);
+ ASSERT_TRUE(r.IsSuccess());
+ auto script = parser.GetScript();
+ const auto& buffers = script->GetBuffers();
+ ASSERT_EQ(1U, buffers.size());
+ ASSERT_TRUE(buffers[0] != nullptr);
+ ASSERT_EQ(static_cast<uint8_t>(amber::BufferDataFileType::kPng),
+ buffers[0]->GetValues<uint8_t>()[0]);
+}
+
+TEST_F(AmberScriptParserTest, BufferMissingDataFileBinary) {
+ std::string in = "BUFFER my_buffer DATA_TYPE float SIZE 10 FILE BINARY";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_FALSE(r.IsSuccess());
+
+ EXPECT_EQ("1: missing file name for FILE", r.Error());
+}
+
+TEST_F(AmberScriptParserTest, BufferDataFileBinary) {
+ std::string in =
+ "BUFFER my_buffer DATA_TYPE int32 SIZE 10 FILE BINARY data.bin";
+
+ DummyDelegate delegate;
+ Parser parser(&delegate);
+ Result r = parser.Parse(in);
+ ASSERT_TRUE(r.IsSuccess());
+ auto script = parser.GetScript();
+ const auto& buffers = script->GetBuffers();
+ ASSERT_EQ(1U, buffers.size());
+ ASSERT_TRUE(buffers[0] != nullptr);
+ ASSERT_EQ(static_cast<uint8_t>(amber::BufferDataFileType::kBinary),
+ buffers[0]->GetValues<uint8_t>()[0]);
+}
+
+TEST_F(AmberScriptParserTest, BufferMissingDataFileText) {
+ std::string in = "BUFFER my_buffer DATA_TYPE float SIZE 10 FILE TEXT";
+
+ Parser parser;
+ Result r = parser.Parse(in);
+ ASSERT_FALSE(r.IsSuccess());
+
+ EXPECT_EQ("1: missing file name for FILE", r.Error());
+}
+
+TEST_F(AmberScriptParserTest, BufferDataFileText) {
+ std::string in =
+ "BUFFER my_buffer DATA_TYPE int32 SIZE 10 FILE TEXT data.txt";
+
+ DummyDelegate delegate;
+ Parser parser(&delegate);
+ Result r = parser.Parse(in);
+ ASSERT_TRUE(r.IsSuccess());
+ auto script = parser.GetScript();
+ const auto& buffers = script->GetBuffers();
+ ASSERT_EQ(1U, buffers.size());
+ ASSERT_TRUE(buffers[0] != nullptr);
+ ASSERT_EQ(static_cast<uint8_t>(amber::BufferDataFileType::kText),
+ buffers[0]->GetValues<uint8_t>()[0]);
}
} // namespace amberscript