|
14 | 14 |
|
15 | 15 | #include "gtest/gtest.h" |
16 | 16 | #include "src/amberscript/parser.h" |
| 17 | +#include "src/float16_helper.h" |
17 | 18 |
|
18 | 19 | namespace amber { |
19 | 20 | namespace amberscript { |
@@ -400,6 +401,34 @@ TEST_F(AmberScriptParserTest, BufferFillFloat) { |
400 | 401 | } |
401 | 402 | } |
402 | 403 |
|
| 404 | +TEST_F(AmberScriptParserTest, BufferFillFloat16) { |
| 405 | + std::string in = "BUFFER my_buffer DATA_TYPE float16 SIZE 5 FILL 5.5"; |
| 406 | + |
| 407 | + Parser parser; |
| 408 | + Result r = parser.Parse(in); |
| 409 | + ASSERT_TRUE(r.IsSuccess()) << r.Error(); |
| 410 | + |
| 411 | + auto script = parser.GetScript(); |
| 412 | + const auto& buffers = script->GetBuffers(); |
| 413 | + ASSERT_EQ(1U, buffers.size()); |
| 414 | + |
| 415 | + ASSERT_TRUE(buffers[0] != nullptr); |
| 416 | + |
| 417 | + auto* buffer = buffers[0].get(); |
| 418 | + EXPECT_EQ("my_buffer", buffer->GetName()); |
| 419 | + EXPECT_EQ(Format::Layout::kStd430, buffer->GetFormat()->GetLayout()); |
| 420 | + EXPECT_EQ(5U, buffer->ElementCount()); |
| 421 | + EXPECT_EQ(5U, buffer->ValueCount()); |
| 422 | + EXPECT_EQ(5U * sizeof(uint16_t), buffer->GetSizeInBytes()); |
| 423 | + |
| 424 | + const auto* data = buffer->GetValues<uint16_t>(); |
| 425 | + for (size_t i = 0; i < buffer->ValueCount(); ++i) { |
| 426 | + EXPECT_FLOAT_EQ( |
| 427 | + 5.5f, float16::HexFloatToFloat( |
| 428 | + reinterpret_cast<const uint8_t*>(&data[i]), 16)); |
| 429 | + } |
| 430 | +} |
| 431 | + |
403 | 432 | TEST_F(AmberScriptParserTest, BufferSeries) { |
404 | 433 | std::string in = |
405 | 434 | "BUFFER my_buffer DATA_TYPE uint8 SIZE 5 SERIES_FROM 2 INC_BY 1"; |
@@ -461,6 +490,38 @@ TEST_F(AmberScriptParserTest, BufferSeriesFloat) { |
461 | 490 | } |
462 | 491 | } |
463 | 492 |
|
| 493 | +TEST_F(AmberScriptParserTest, BufferSeriesFloat16) { |
| 494 | + std::string in = |
| 495 | + "BUFFER my_buffer DATA_TYPE float16 SIZE 5 SERIES_FROM 2.5 INC_BY " |
| 496 | + "0.5"; |
| 497 | + |
| 498 | + Parser parser; |
| 499 | + Result r = parser.Parse(in); |
| 500 | + ASSERT_TRUE(r.IsSuccess()) << r.Error(); |
| 501 | + |
| 502 | + auto script = parser.GetScript(); |
| 503 | + const auto& buffers = script->GetBuffers(); |
| 504 | + ASSERT_EQ(1U, buffers.size()); |
| 505 | + |
| 506 | + ASSERT_TRUE(buffers[0] != nullptr); |
| 507 | + |
| 508 | + auto* buffer = buffers[0].get(); |
| 509 | + EXPECT_EQ("my_buffer", buffer->GetName()); |
| 510 | + EXPECT_EQ(Format::Layout::kStd430, buffer->GetFormat()->GetLayout()); |
| 511 | + EXPECT_EQ(5U, buffer->ElementCount()); |
| 512 | + EXPECT_EQ(5U, buffer->ValueCount()); |
| 513 | + EXPECT_EQ(5U * sizeof(uint16_t), buffer->GetSizeInBytes()); |
| 514 | + |
| 515 | + std::vector<float> results = {2.5f, 3.0f, 3.5f, 4.0f, 4.5f}; |
| 516 | + const auto* data = buffer->GetValues<uint16_t>(); |
| 517 | + ASSERT_EQ(results.size(), buffer->ValueCount()); |
| 518 | + for (size_t i = 0; i < results.size(); ++i) { |
| 519 | + EXPECT_FLOAT_EQ( |
| 520 | + results[i], float16::HexFloatToFloat( |
| 521 | + reinterpret_cast<const uint8_t*>(&data[i]), 16)); |
| 522 | + } |
| 523 | +} |
| 524 | + |
464 | 525 | TEST_F(AmberScriptParserTest, BufferMultipleBuffers) { |
465 | 526 | std::string in = R"( |
466 | 527 | BUFFER color_buffer DATA_TYPE uint8 SIZE 5 FILL 5 |
|
0 commit comments