Home | History | Annotate | Download | only in test
      1 // Copyright (c) 2015-2016 The Khronos Group Inc.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //     http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 #include <limits>
     16 #include <string>
     17 #include <vector>
     18 
     19 #include "gmock/gmock.h"
     20 #include "source/util/parse_number.h"
     21 #include "spirv-tools/libspirv.h"
     22 
     23 namespace spvtools {
     24 namespace utils {
     25 namespace {
     26 
     27 using testing::Eq;
     28 using testing::IsNull;
     29 using testing::NotNull;
     30 
     31 TEST(ParseNarrowSignedIntegers, Sample) {
     32   int16_t i16;
     33 
     34   EXPECT_FALSE(ParseNumber(nullptr, &i16));
     35   EXPECT_FALSE(ParseNumber("", &i16));
     36   EXPECT_FALSE(ParseNumber("0=", &i16));
     37 
     38   EXPECT_TRUE(ParseNumber("0", &i16));
     39   EXPECT_EQ(0, i16);
     40   EXPECT_TRUE(ParseNumber("32767", &i16));
     41   EXPECT_EQ(32767, i16);
     42   EXPECT_TRUE(ParseNumber("-32768", &i16));
     43   EXPECT_EQ(-32768, i16);
     44   EXPECT_TRUE(ParseNumber("-0", &i16));
     45   EXPECT_EQ(0, i16);
     46 
     47   // These are out of range, so they should return an error.
     48   // The error code depends on whether this is an optional value.
     49   EXPECT_FALSE(ParseNumber("32768", &i16));
     50   EXPECT_FALSE(ParseNumber("65535", &i16));
     51 
     52   // Check hex parsing.
     53   EXPECT_TRUE(ParseNumber("0x7fff", &i16));
     54   EXPECT_EQ(32767, i16);
     55   // This is out of range.
     56   EXPECT_FALSE(ParseNumber("0xffff", &i16));
     57 }
     58 
     59 TEST(ParseNarrowUnsignedIntegers, Sample) {
     60   uint16_t u16;
     61 
     62   EXPECT_FALSE(ParseNumber(nullptr, &u16));
     63   EXPECT_FALSE(ParseNumber("", &u16));
     64   EXPECT_FALSE(ParseNumber("0=", &u16));
     65 
     66   EXPECT_TRUE(ParseNumber("0", &u16));
     67   EXPECT_EQ(0, u16);
     68   EXPECT_TRUE(ParseNumber("65535", &u16));
     69   EXPECT_EQ(65535, u16);
     70   EXPECT_FALSE(ParseNumber("65536", &u16));
     71 
     72   // We don't care about -0 since it's rejected at a higher level.
     73   EXPECT_FALSE(ParseNumber("-1", &u16));
     74   EXPECT_TRUE(ParseNumber("0xffff", &u16));
     75   EXPECT_EQ(0xffff, u16);
     76   EXPECT_FALSE(ParseNumber("0x10000", &u16));
     77 }
     78 
     79 TEST(ParseSignedIntegers, Sample) {
     80   int32_t i32;
     81 
     82   // Invalid parse.
     83   EXPECT_FALSE(ParseNumber(nullptr, &i32));
     84   EXPECT_FALSE(ParseNumber("", &i32));
     85   EXPECT_FALSE(ParseNumber("0=", &i32));
     86 
     87   // Decimal values.
     88   EXPECT_TRUE(ParseNumber("0", &i32));
     89   EXPECT_EQ(0, i32);
     90   EXPECT_TRUE(ParseNumber("2147483647", &i32));
     91   EXPECT_EQ(std::numeric_limits<int32_t>::max(), i32);
     92   EXPECT_FALSE(ParseNumber("2147483648", &i32));
     93   EXPECT_TRUE(ParseNumber("-0", &i32));
     94   EXPECT_EQ(0, i32);
     95   EXPECT_TRUE(ParseNumber("-1", &i32));
     96   EXPECT_EQ(-1, i32);
     97   EXPECT_TRUE(ParseNumber("-2147483648", &i32));
     98   EXPECT_EQ(std::numeric_limits<int32_t>::min(), i32);
     99 
    100   // Hex values.
    101   EXPECT_TRUE(ParseNumber("0x7fffffff", &i32));
    102   EXPECT_EQ(std::numeric_limits<int32_t>::max(), i32);
    103   EXPECT_FALSE(ParseNumber("0x80000000", &i32));
    104   EXPECT_TRUE(ParseNumber("-0x000", &i32));
    105   EXPECT_EQ(0, i32);
    106   EXPECT_TRUE(ParseNumber("-0x001", &i32));
    107   EXPECT_EQ(-1, i32);
    108   EXPECT_TRUE(ParseNumber("-0x80000000", &i32));
    109   EXPECT_EQ(std::numeric_limits<int32_t>::min(), i32);
    110 }
    111 
    112 TEST(ParseUnsignedIntegers, Sample) {
    113   uint32_t u32;
    114 
    115   // Invalid parse.
    116   EXPECT_FALSE(ParseNumber(nullptr, &u32));
    117   EXPECT_FALSE(ParseNumber("", &u32));
    118   EXPECT_FALSE(ParseNumber("0=", &u32));
    119 
    120   // Valid values.
    121   EXPECT_TRUE(ParseNumber("0", &u32));
    122   EXPECT_EQ(0u, u32);
    123   EXPECT_TRUE(ParseNumber("4294967295", &u32));
    124   EXPECT_EQ(std::numeric_limits<uint32_t>::max(), u32);
    125   EXPECT_FALSE(ParseNumber("4294967296", &u32));
    126 
    127   // Hex values.
    128   EXPECT_TRUE(ParseNumber("0xffffffff", &u32));
    129   EXPECT_EQ(std::numeric_limits<uint32_t>::max(), u32);
    130 
    131   // We don't care about -0 since it's rejected at a higher level.
    132   EXPECT_FALSE(ParseNumber("-1", &u32));
    133 }
    134 
    135 TEST(ParseWideSignedIntegers, Sample) {
    136   int64_t i64;
    137   EXPECT_FALSE(ParseNumber(nullptr, &i64));
    138   EXPECT_FALSE(ParseNumber("", &i64));
    139   EXPECT_FALSE(ParseNumber("0=", &i64));
    140   EXPECT_TRUE(ParseNumber("0", &i64));
    141   EXPECT_EQ(0, i64);
    142   EXPECT_TRUE(ParseNumber("0x7fffffffffffffff", &i64));
    143   EXPECT_EQ(0x7fffffffffffffff, i64);
    144   EXPECT_TRUE(ParseNumber("-0", &i64));
    145   EXPECT_EQ(0, i64);
    146   EXPECT_TRUE(ParseNumber("-1", &i64));
    147   EXPECT_EQ(-1, i64);
    148 }
    149 
    150 TEST(ParseWideUnsignedIntegers, Sample) {
    151   uint64_t u64;
    152   EXPECT_FALSE(ParseNumber(nullptr, &u64));
    153   EXPECT_FALSE(ParseNumber("", &u64));
    154   EXPECT_FALSE(ParseNumber("0=", &u64));
    155   EXPECT_TRUE(ParseNumber("0", &u64));
    156   EXPECT_EQ(0u, u64);
    157   EXPECT_TRUE(ParseNumber("0xffffffffffffffff", &u64));
    158   EXPECT_EQ(0xffffffffffffffffULL, u64);
    159 
    160   // We don't care about -0 since it's rejected at a higher level.
    161   EXPECT_FALSE(ParseNumber("-1", &u64));
    162 }
    163 
    164 TEST(ParseFloat, Sample) {
    165   float f;
    166 
    167   EXPECT_FALSE(ParseNumber(nullptr, &f));
    168   EXPECT_FALSE(ParseNumber("", &f));
    169   EXPECT_FALSE(ParseNumber("0=", &f));
    170 
    171   // These values are exactly representatble.
    172   EXPECT_TRUE(ParseNumber("0", &f));
    173   EXPECT_EQ(0.0f, f);
    174   EXPECT_TRUE(ParseNumber("42", &f));
    175   EXPECT_EQ(42.0f, f);
    176   EXPECT_TRUE(ParseNumber("2.5", &f));
    177   EXPECT_EQ(2.5f, f);
    178   EXPECT_TRUE(ParseNumber("-32.5", &f));
    179   EXPECT_EQ(-32.5f, f);
    180   EXPECT_TRUE(ParseNumber("1e38", &f));
    181   EXPECT_EQ(1e38f, f);
    182   EXPECT_TRUE(ParseNumber("-1e38", &f));
    183   EXPECT_EQ(-1e38f, f);
    184 }
    185 
    186 TEST(ParseFloat, Overflow) {
    187   // The assembler parses using HexFloat<FloatProxy<float>>.  Make
    188   // sure that succeeds for in-range values, and fails for out of
    189   // range values.  When it does overflow, the value is set to the
    190   // nearest finite value, matching C++11 behavior for operator>>
    191   // on floating point.
    192   HexFloat<FloatProxy<float>> f(0.0f);
    193 
    194   EXPECT_TRUE(ParseNumber("1e38", &f));
    195   EXPECT_EQ(1e38f, f.value().getAsFloat());
    196   EXPECT_TRUE(ParseNumber("-1e38", &f));
    197   EXPECT_EQ(-1e38f, f.value().getAsFloat());
    198   EXPECT_FALSE(ParseNumber("1e40", &f));
    199   EXPECT_FALSE(ParseNumber("-1e40", &f));
    200   EXPECT_FALSE(ParseNumber("1e400", &f));
    201   EXPECT_FALSE(ParseNumber("-1e400", &f));
    202 }
    203 
    204 TEST(ParseDouble, Sample) {
    205   double f;
    206 
    207   EXPECT_FALSE(ParseNumber(nullptr, &f));
    208   EXPECT_FALSE(ParseNumber("", &f));
    209   EXPECT_FALSE(ParseNumber("0=", &f));
    210 
    211   // These values are exactly representatble.
    212   EXPECT_TRUE(ParseNumber("0", &f));
    213   EXPECT_EQ(0.0, f);
    214   EXPECT_TRUE(ParseNumber("42", &f));
    215   EXPECT_EQ(42.0, f);
    216   EXPECT_TRUE(ParseNumber("2.5", &f));
    217   EXPECT_EQ(2.5, f);
    218   EXPECT_TRUE(ParseNumber("-32.5", &f));
    219   EXPECT_EQ(-32.5, f);
    220   EXPECT_TRUE(ParseNumber("1e38", &f));
    221   EXPECT_EQ(1e38, f);
    222   EXPECT_TRUE(ParseNumber("-1e38", &f));
    223   EXPECT_EQ(-1e38, f);
    224   // These are out of range for 32-bit float, but in range for 64-bit float.
    225   EXPECT_TRUE(ParseNumber("1e40", &f));
    226   EXPECT_EQ(1e40, f);
    227   EXPECT_TRUE(ParseNumber("-1e40", &f));
    228   EXPECT_EQ(-1e40, f);
    229 }
    230 
    231 TEST(ParseDouble, Overflow) {
    232   // The assembler parses using HexFloat<FloatProxy<double>>.  Make
    233   // sure that succeeds for in-range values, and fails for out of
    234   // range values.  When it does overflow, the value is set to the
    235   // nearest finite value, matching C++11 behavior for operator>>
    236   // on floating point.
    237   HexFloat<FloatProxy<double>> f(0.0);
    238 
    239   EXPECT_TRUE(ParseNumber("1e38", &f));
    240   EXPECT_EQ(1e38, f.value().getAsFloat());
    241   EXPECT_TRUE(ParseNumber("-1e38", &f));
    242   EXPECT_EQ(-1e38, f.value().getAsFloat());
    243   EXPECT_TRUE(ParseNumber("1e40", &f));
    244   EXPECT_EQ(1e40, f.value().getAsFloat());
    245   EXPECT_TRUE(ParseNumber("-1e40", &f));
    246   EXPECT_EQ(-1e40, f.value().getAsFloat());
    247   EXPECT_FALSE(ParseNumber("1e400", &f));
    248   EXPECT_FALSE(ParseNumber("-1e400", &f));
    249 }
    250 
    251 TEST(ParseFloat16, Overflow) {
    252   // The assembler parses using HexFloat<FloatProxy<Float16>>.  Make
    253   // sure that succeeds for in-range values, and fails for out of
    254   // range values.  When it does overflow, the value is set to the
    255   // nearest finite value, matching C++11 behavior for operator>>
    256   // on floating point.
    257   HexFloat<FloatProxy<Float16>> f(0);
    258 
    259   EXPECT_FALSE(ParseNumber(nullptr, &f));
    260   EXPECT_TRUE(ParseNumber("-0.0", &f));
    261   EXPECT_EQ(uint16_t{0x8000}, f.value().getAsFloat().get_value());
    262   EXPECT_TRUE(ParseNumber("1.0", &f));
    263   EXPECT_EQ(uint16_t{0x3c00}, f.value().getAsFloat().get_value());
    264 
    265   // Overflows 16-bit but not 32-bit
    266   EXPECT_FALSE(ParseNumber("1e38", &f));
    267   EXPECT_FALSE(ParseNumber("-1e38", &f));
    268 
    269   // Overflows 32-bit but not 64-bit
    270   EXPECT_FALSE(ParseNumber("1e40", &f));
    271   EXPECT_FALSE(ParseNumber("-1e40", &f));
    272 
    273   // Overflows 64-bit
    274   EXPECT_FALSE(ParseNumber("1e400", &f));
    275   EXPECT_FALSE(ParseNumber("-1e400", &f));
    276 }
    277 
    278 void AssertEmitFunc(uint32_t) {
    279   ASSERT_FALSE(true)
    280       << "Should not call emit() function when the number can not be parsed.";
    281   return;
    282 }
    283 
    284 TEST(ParseAndEncodeNarrowSignedIntegers, Invalid) {
    285   // The error message should be overwritten after each parsing call.
    286   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    287   std::string err_msg;
    288   NumberType type = {16, SPV_NUMBER_SIGNED_INT};
    289 
    290   rc = ParseAndEncodeIntegerNumber(nullptr, type, AssertEmitFunc, &err_msg);
    291   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    292   EXPECT_EQ("The given text is a nullptr", err_msg);
    293   rc = ParseAndEncodeIntegerNumber("", type, AssertEmitFunc, &err_msg);
    294   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    295   EXPECT_EQ("Invalid unsigned integer literal: ", err_msg);
    296   rc = ParseAndEncodeIntegerNumber("=", type, AssertEmitFunc, &err_msg);
    297   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    298   EXPECT_EQ("Invalid unsigned integer literal: =", err_msg);
    299   rc = ParseAndEncodeIntegerNumber("-", type, AssertEmitFunc, &err_msg);
    300   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    301   EXPECT_EQ("Invalid signed integer literal: -", err_msg);
    302   rc = ParseAndEncodeIntegerNumber("0=", type, AssertEmitFunc, &err_msg);
    303   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    304   EXPECT_EQ("Invalid unsigned integer literal: 0=", err_msg);
    305 }
    306 
    307 TEST(ParseAndEncodeNarrowSignedIntegers, Overflow) {
    308   // The error message should be overwritten after each parsing call.
    309   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    310   std::string err_msg;
    311   NumberType type = {16, SPV_NUMBER_SIGNED_INT};
    312 
    313   rc = ParseAndEncodeIntegerNumber("32768", type, AssertEmitFunc, &err_msg);
    314   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    315   EXPECT_EQ("Integer 32768 does not fit in a 16-bit signed integer", err_msg);
    316   rc = ParseAndEncodeIntegerNumber("-32769", type, AssertEmitFunc, &err_msg);
    317   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    318   EXPECT_EQ("Integer -32769 does not fit in a 16-bit signed integer", err_msg);
    319 }
    320 
    321 TEST(ParseAndEncodeNarrowSignedIntegers, Success) {
    322   // Don't care the error message in this case.
    323   EncodeNumberStatus rc = EncodeNumberStatus::kInvalidText;
    324   NumberType type = {16, SPV_NUMBER_SIGNED_INT};
    325 
    326   // Zero, maximum, and minimum value
    327   rc = ParseAndEncodeIntegerNumber(
    328       "0", type, [](uint32_t word) { EXPECT_EQ(0u, word); }, nullptr);
    329   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    330   rc = ParseAndEncodeIntegerNumber(
    331       "-0", type, [](uint32_t word) { EXPECT_EQ(0u, word); }, nullptr);
    332   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    333   rc = ParseAndEncodeIntegerNumber(
    334       "32767", type, [](uint32_t word) { EXPECT_EQ(0x00007fffu, word); },
    335       nullptr);
    336   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    337   rc = ParseAndEncodeIntegerNumber(
    338       "-32768", type, [](uint32_t word) { EXPECT_EQ(0xffff8000u, word); },
    339       nullptr);
    340   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    341 
    342   // Hex parsing
    343   rc = ParseAndEncodeIntegerNumber(
    344       "0x7fff", type, [](uint32_t word) { EXPECT_EQ(0x00007fffu, word); },
    345       nullptr);
    346   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    347   rc = ParseAndEncodeIntegerNumber(
    348       "0xffff", type, [](uint32_t word) { EXPECT_EQ(0xffffffffu, word); },
    349       nullptr);
    350   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    351 }
    352 
    353 TEST(ParseAndEncodeNarrowUnsignedIntegers, Invalid) {
    354   // The error message should be overwritten after each parsing call.
    355   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    356   std::string err_msg;
    357   NumberType type = {16, SPV_NUMBER_UNSIGNED_INT};
    358 
    359   rc = ParseAndEncodeIntegerNumber(nullptr, type, AssertEmitFunc, &err_msg);
    360   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    361   EXPECT_EQ("The given text is a nullptr", err_msg);
    362   rc = ParseAndEncodeIntegerNumber("", type, AssertEmitFunc, &err_msg);
    363   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    364   EXPECT_EQ("Invalid unsigned integer literal: ", err_msg);
    365   rc = ParseAndEncodeIntegerNumber("=", type, AssertEmitFunc, &err_msg);
    366   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    367   EXPECT_EQ("Invalid unsigned integer literal: =", err_msg);
    368   rc = ParseAndEncodeIntegerNumber("-", type, AssertEmitFunc, &err_msg);
    369   EXPECT_EQ(EncodeNumberStatus::kInvalidUsage, rc);
    370   EXPECT_EQ("Cannot put a negative number in an unsigned literal", err_msg);
    371   rc = ParseAndEncodeIntegerNumber("0=", type, AssertEmitFunc, &err_msg);
    372   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    373   EXPECT_EQ("Invalid unsigned integer literal: 0=", err_msg);
    374   rc = ParseAndEncodeIntegerNumber("-0", type, AssertEmitFunc, &err_msg);
    375   EXPECT_EQ(EncodeNumberStatus::kInvalidUsage, rc);
    376   EXPECT_EQ("Cannot put a negative number in an unsigned literal", err_msg);
    377   rc = ParseAndEncodeIntegerNumber("-1", type, AssertEmitFunc, &err_msg);
    378   EXPECT_EQ(EncodeNumberStatus::kInvalidUsage, rc);
    379   EXPECT_EQ("Cannot put a negative number in an unsigned literal", err_msg);
    380 }
    381 
    382 TEST(ParseAndEncodeNarrowUnsignedIntegers, Overflow) {
    383   // The error message should be overwritten after each parsing call.
    384   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    385   std::string err_msg("random content");
    386   NumberType type = {16, SPV_NUMBER_UNSIGNED_INT};
    387 
    388   // Overflow
    389   rc = ParseAndEncodeIntegerNumber("65536", type, AssertEmitFunc, &err_msg);
    390   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    391   EXPECT_EQ("Integer 65536 does not fit in a 16-bit unsigned integer", err_msg);
    392 }
    393 
    394 TEST(ParseAndEncodeNarrowUnsignedIntegers, Success) {
    395   // Don't care the error message in this case.
    396   EncodeNumberStatus rc = EncodeNumberStatus::kInvalidText;
    397   NumberType type = {16, SPV_NUMBER_UNSIGNED_INT};
    398 
    399   // Zero, maximum, and minimum value
    400   rc = ParseAndEncodeIntegerNumber(
    401       "0", type, [](uint32_t word) { EXPECT_EQ(0u, word); }, nullptr);
    402   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    403   rc = ParseAndEncodeIntegerNumber(
    404       "65535", type, [](uint32_t word) { EXPECT_EQ(0x0000ffffu, word); },
    405       nullptr);
    406   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    407 
    408   // Hex parsing
    409   rc = ParseAndEncodeIntegerNumber(
    410       "0xffff", type, [](uint32_t word) { EXPECT_EQ(0x0000ffffu, word); },
    411       nullptr);
    412   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    413 }
    414 
    415 TEST(ParseAndEncodeSignedIntegers, Invalid) {
    416   // The error message should be overwritten after each parsing call.
    417   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    418   std::string err_msg;
    419   NumberType type = {32, SPV_NUMBER_SIGNED_INT};
    420 
    421   rc = ParseAndEncodeIntegerNumber(nullptr, type, AssertEmitFunc, &err_msg);
    422   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    423   EXPECT_EQ("The given text is a nullptr", err_msg);
    424   rc = ParseAndEncodeIntegerNumber("", type, AssertEmitFunc, &err_msg);
    425   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    426   EXPECT_EQ("Invalid unsigned integer literal: ", err_msg);
    427   rc = ParseAndEncodeIntegerNumber("=", type, AssertEmitFunc, &err_msg);
    428   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    429   EXPECT_EQ("Invalid unsigned integer literal: =", err_msg);
    430   rc = ParseAndEncodeIntegerNumber("-", type, AssertEmitFunc, &err_msg);
    431   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    432   EXPECT_EQ("Invalid signed integer literal: -", err_msg);
    433   rc = ParseAndEncodeIntegerNumber("0=", type, AssertEmitFunc, &err_msg);
    434   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    435   EXPECT_EQ("Invalid unsigned integer literal: 0=", err_msg);
    436 }
    437 
    438 TEST(ParseAndEncodeSignedIntegers, Overflow) {
    439   // The error message should be overwritten after each parsing call.
    440   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    441   std::string err_msg;
    442   NumberType type = {32, SPV_NUMBER_SIGNED_INT};
    443 
    444   rc =
    445       ParseAndEncodeIntegerNumber("2147483648", type, AssertEmitFunc, &err_msg);
    446   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    447   EXPECT_EQ("Integer 2147483648 does not fit in a 32-bit signed integer",
    448             err_msg);
    449   rc = ParseAndEncodeIntegerNumber("-2147483649", type, AssertEmitFunc,
    450                                    &err_msg);
    451   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    452   EXPECT_EQ("Integer -2147483649 does not fit in a 32-bit signed integer",
    453             err_msg);
    454 }
    455 
    456 TEST(ParseAndEncodeSignedIntegers, Success) {
    457   // Don't care the error message in this case.
    458   EncodeNumberStatus rc = EncodeNumberStatus::kInvalidText;
    459   NumberType type = {32, SPV_NUMBER_SIGNED_INT};
    460 
    461   // Zero, maximum, and minimum value
    462   rc = ParseAndEncodeIntegerNumber(
    463       "0", type, [](uint32_t word) { EXPECT_EQ(0u, word); }, nullptr);
    464   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    465   rc = ParseAndEncodeIntegerNumber(
    466       "-0", type, [](uint32_t word) { EXPECT_EQ(0u, word); }, nullptr);
    467   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    468   rc = ParseAndEncodeIntegerNumber(
    469       "2147483647", type, [](uint32_t word) { EXPECT_EQ(0x7fffffffu, word); },
    470       nullptr);
    471   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    472   rc = ParseAndEncodeIntegerNumber(
    473       "-2147483648", type, [](uint32_t word) { EXPECT_EQ(0x80000000u, word); },
    474       nullptr);
    475   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    476 
    477   // Hex parsing
    478   rc = ParseAndEncodeIntegerNumber(
    479       "0x7fffffff", type, [](uint32_t word) { EXPECT_EQ(0x7fffffffu, word); },
    480       nullptr);
    481   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    482   rc = ParseAndEncodeIntegerNumber(
    483       "0xffffffff", type, [](uint32_t word) { EXPECT_EQ(0xffffffffu, word); },
    484       nullptr);
    485   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    486 }
    487 
    488 TEST(ParseAndEncodeUnsignedIntegers, Invalid) {
    489   // The error message should be overwritten after each parsing call.
    490   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    491   std::string err_msg;
    492   NumberType type = {32, SPV_NUMBER_UNSIGNED_INT};
    493 
    494   rc = ParseAndEncodeIntegerNumber(nullptr, type, AssertEmitFunc, &err_msg);
    495   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    496   EXPECT_EQ("The given text is a nullptr", err_msg);
    497   rc = ParseAndEncodeIntegerNumber("", type, AssertEmitFunc, &err_msg);
    498   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    499   EXPECT_EQ("Invalid unsigned integer literal: ", err_msg);
    500   rc = ParseAndEncodeIntegerNumber("=", type, AssertEmitFunc, &err_msg);
    501   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    502   EXPECT_EQ("Invalid unsigned integer literal: =", err_msg);
    503   rc = ParseAndEncodeIntegerNumber("-", type, AssertEmitFunc, &err_msg);
    504   EXPECT_EQ(EncodeNumberStatus::kInvalidUsage, rc);
    505   EXPECT_EQ("Cannot put a negative number in an unsigned literal", err_msg);
    506   rc = ParseAndEncodeIntegerNumber("0=", type, AssertEmitFunc, &err_msg);
    507   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    508   EXPECT_EQ("Invalid unsigned integer literal: 0=", err_msg);
    509   rc = ParseAndEncodeIntegerNumber("-0", type, AssertEmitFunc, &err_msg);
    510   EXPECT_EQ(EncodeNumberStatus::kInvalidUsage, rc);
    511   EXPECT_EQ("Cannot put a negative number in an unsigned literal", err_msg);
    512   rc = ParseAndEncodeIntegerNumber("-1", type, AssertEmitFunc, &err_msg);
    513   EXPECT_EQ(EncodeNumberStatus::kInvalidUsage, rc);
    514   EXPECT_EQ("Cannot put a negative number in an unsigned literal", err_msg);
    515 }
    516 
    517 TEST(ParseAndEncodeUnsignedIntegers, Overflow) {
    518   // The error message should be overwritten after each parsing call.
    519   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    520   std::string err_msg("random content");
    521   NumberType type = {32, SPV_NUMBER_UNSIGNED_INT};
    522 
    523   // Overflow
    524   rc =
    525       ParseAndEncodeIntegerNumber("4294967296", type, AssertEmitFunc, &err_msg);
    526   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    527   EXPECT_EQ("Integer 4294967296 does not fit in a 32-bit unsigned integer",
    528             err_msg);
    529 }
    530 
    531 TEST(ParseAndEncodeUnsignedIntegers, Success) {
    532   // Don't care the error message in this case.
    533   EncodeNumberStatus rc = EncodeNumberStatus::kInvalidText;
    534   NumberType type = {32, SPV_NUMBER_UNSIGNED_INT};
    535 
    536   // Zero, maximum, and minimum value
    537   rc = ParseAndEncodeIntegerNumber(
    538       "0", type, [](uint32_t word) { EXPECT_EQ(0u, word); }, nullptr);
    539   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    540   rc = ParseAndEncodeIntegerNumber(
    541       "4294967295", type, [](uint32_t word) { EXPECT_EQ(0xffffffffu, word); },
    542       nullptr);
    543   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    544 
    545   // Hex parsing
    546   rc = ParseAndEncodeIntegerNumber(
    547       "0xffffffff", type, [](uint32_t word) { EXPECT_EQ(0xffffffffu, word); },
    548       nullptr);
    549   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    550 }
    551 
    552 TEST(ParseAndEncodeWideSignedIntegers, Invalid) {
    553   // The error message should be overwritten after each parsing call.
    554   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    555   std::string err_msg;
    556   NumberType type = {64, SPV_NUMBER_SIGNED_INT};
    557 
    558   rc = ParseAndEncodeIntegerNumber(nullptr, type, AssertEmitFunc, &err_msg);
    559   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    560   EXPECT_EQ("The given text is a nullptr", err_msg);
    561   rc = ParseAndEncodeIntegerNumber("", type, AssertEmitFunc, &err_msg);
    562   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    563   EXPECT_EQ("Invalid unsigned integer literal: ", err_msg);
    564   rc = ParseAndEncodeIntegerNumber("=", type, AssertEmitFunc, &err_msg);
    565   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    566   EXPECT_EQ("Invalid unsigned integer literal: =", err_msg);
    567   rc = ParseAndEncodeIntegerNumber("-", type, AssertEmitFunc, &err_msg);
    568   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    569   EXPECT_EQ("Invalid signed integer literal: -", err_msg);
    570   rc = ParseAndEncodeIntegerNumber("0=", type, AssertEmitFunc, &err_msg);
    571   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    572   EXPECT_EQ("Invalid unsigned integer literal: 0=", err_msg);
    573 }
    574 
    575 TEST(ParseAndEncodeWideSignedIntegers, Overflow) {
    576   // The error message should be overwritten after each parsing call.
    577   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    578   std::string err_msg;
    579   NumberType type = {64, SPV_NUMBER_SIGNED_INT};
    580 
    581   rc = ParseAndEncodeIntegerNumber("9223372036854775808", type, AssertEmitFunc,
    582                                    &err_msg);
    583   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    584   EXPECT_EQ(
    585       "Integer 9223372036854775808 does not fit in a 64-bit signed integer",
    586       err_msg);
    587   rc = ParseAndEncodeIntegerNumber("-9223372036854775809", type, AssertEmitFunc,
    588                                    &err_msg);
    589   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    590   EXPECT_EQ("Invalid signed integer literal: -9223372036854775809", err_msg);
    591 }
    592 
    593 TEST(ParseAndEncodeWideSignedIntegers, Success) {
    594   // Don't care the error message in this case.
    595   EncodeNumberStatus rc = EncodeNumberStatus::kInvalidText;
    596   NumberType type = {64, SPV_NUMBER_SIGNED_INT};
    597   std::vector<uint32_t> word_buffer;
    598   auto emit = [&word_buffer](uint32_t word) {
    599     if (word_buffer.size() == 2) word_buffer.clear();
    600     word_buffer.push_back(word);
    601   };
    602 
    603   // Zero, maximum, and minimum value
    604   rc = ParseAndEncodeIntegerNumber("0", type, emit, nullptr);
    605   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    606   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0u, 0u}));
    607   rc = ParseAndEncodeIntegerNumber("-0", type, emit, nullptr);
    608   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    609   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0u, 0u}));
    610   rc = ParseAndEncodeIntegerNumber("9223372036854775807", type, emit, nullptr);
    611   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    612   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0xffffffffu, 0x7fffffffu}));
    613   rc = ParseAndEncodeIntegerNumber("-9223372036854775808", type, emit, nullptr);
    614   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    615   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0u, 0x80000000u}));
    616   rc = ParseAndEncodeIntegerNumber("-1", type, emit, nullptr);
    617   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    618   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0xffffffffu, 0xffffffffu}));
    619 
    620   // Hex parsing
    621   rc = ParseAndEncodeIntegerNumber("0x7fffffffffffffff", type, emit, nullptr);
    622   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    623   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0xffffffffu, 0x7fffffffu}));
    624   rc = ParseAndEncodeIntegerNumber("0xffffffffffffffff", type, emit, nullptr);
    625   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    626   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0xffffffffu, 0xffffffffu}));
    627 }
    628 
    629 TEST(ParseAndEncodeWideUnsignedIntegers, Invalid) {
    630   // The error message should be overwritten after each parsing call.
    631   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    632   std::string err_msg;
    633   NumberType type = {64, SPV_NUMBER_UNSIGNED_INT};
    634 
    635   // Invalid
    636   rc = ParseAndEncodeIntegerNumber(nullptr, type, AssertEmitFunc, &err_msg);
    637   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    638   EXPECT_EQ("The given text is a nullptr", err_msg);
    639   rc = ParseAndEncodeIntegerNumber("", type, AssertEmitFunc, &err_msg);
    640   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    641   EXPECT_EQ("Invalid unsigned integer literal: ", err_msg);
    642   rc = ParseAndEncodeIntegerNumber("=", type, AssertEmitFunc, &err_msg);
    643   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    644   EXPECT_EQ("Invalid unsigned integer literal: =", err_msg);
    645   rc = ParseAndEncodeIntegerNumber("-", type, AssertEmitFunc, &err_msg);
    646   EXPECT_EQ(EncodeNumberStatus::kInvalidUsage, rc);
    647   EXPECT_EQ("Cannot put a negative number in an unsigned literal", err_msg);
    648   rc = ParseAndEncodeIntegerNumber("0=", type, AssertEmitFunc, &err_msg);
    649   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    650   EXPECT_EQ("Invalid unsigned integer literal: 0=", err_msg);
    651   rc = ParseAndEncodeIntegerNumber("-0", type, AssertEmitFunc, &err_msg);
    652   EXPECT_EQ(EncodeNumberStatus::kInvalidUsage, rc);
    653   EXPECT_EQ("Cannot put a negative number in an unsigned literal", err_msg);
    654   rc = ParseAndEncodeIntegerNumber("-1", type, AssertEmitFunc, &err_msg);
    655   EXPECT_EQ(EncodeNumberStatus::kInvalidUsage, rc);
    656   EXPECT_EQ("Cannot put a negative number in an unsigned literal", err_msg);
    657 }
    658 
    659 TEST(ParseAndEncodeWideUnsignedIntegers, Overflow) {
    660   // The error message should be overwritten after each parsing call.
    661   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    662   std::string err_msg;
    663   NumberType type = {64, SPV_NUMBER_UNSIGNED_INT};
    664 
    665   // Overflow
    666   rc = ParseAndEncodeIntegerNumber("18446744073709551616", type, AssertEmitFunc,
    667                                    &err_msg);
    668   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    669   EXPECT_EQ("Invalid unsigned integer literal: 18446744073709551616", err_msg);
    670 }
    671 
    672 TEST(ParseAndEncodeWideUnsignedIntegers, Success) {
    673   // Don't care the error message in this case.
    674   EncodeNumberStatus rc = EncodeNumberStatus::kInvalidText;
    675   NumberType type = {64, SPV_NUMBER_UNSIGNED_INT};
    676   std::vector<uint32_t> word_buffer;
    677   auto emit = [&word_buffer](uint32_t word) {
    678     if (word_buffer.size() == 2) word_buffer.clear();
    679     word_buffer.push_back(word);
    680   };
    681 
    682   // Zero, maximum, and minimum value
    683   rc = ParseAndEncodeIntegerNumber("0", type, emit, nullptr);
    684   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    685   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0u, 0u}));
    686   rc = ParseAndEncodeIntegerNumber("18446744073709551615", type, emit, nullptr);
    687   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    688   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0xffffffffu, 0xffffffffu}));
    689 
    690   // Hex parsing
    691   rc = ParseAndEncodeIntegerNumber("0xffffffffffffffff", type, emit, nullptr);
    692   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    693   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0xffffffffu, 0xffffffffu}));
    694 }
    695 
    696 TEST(ParseAndEncodeIntegerNumber, TypeNone) {
    697   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    698   std::string err_msg;
    699   NumberType type = {32, SPV_NUMBER_NONE};
    700 
    701   rc = ParseAndEncodeIntegerNumber(
    702       "0.0", type, [](uint32_t word) { EXPECT_EQ(0x0u, word); }, &err_msg);
    703   EXPECT_EQ(EncodeNumberStatus::kInvalidUsage, rc);
    704   EXPECT_EQ("The expected type is not a integer type", err_msg);
    705 }
    706 
    707 TEST(ParseAndEncodeIntegerNumber, InvalidCaseWithoutErrorMessageString) {
    708   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    709   NumberType type = {32, SPV_NUMBER_SIGNED_INT};
    710 
    711   rc = ParseAndEncodeIntegerNumber("invalid", type, AssertEmitFunc, nullptr);
    712   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    713 }
    714 
    715 TEST(ParseAndEncodeIntegerNumber, DoNotTouchErrorMessageStringOnSuccess) {
    716   EncodeNumberStatus rc = EncodeNumberStatus::kInvalidText;
    717   std::string err_msg("random content");
    718   NumberType type = {32, SPV_NUMBER_SIGNED_INT};
    719 
    720   rc = ParseAndEncodeIntegerNumber(
    721       "100", type, [](uint32_t word) { EXPECT_EQ(100u, word); }, &err_msg);
    722   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    723   EXPECT_EQ("random content", err_msg);
    724 }
    725 
    726 TEST(ParseAndEncodeFloat, Sample) {
    727   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    728   std::string err_msg;
    729   NumberType type = {32, SPV_NUMBER_FLOATING};
    730 
    731   // Invalid
    732   rc = ParseAndEncodeFloatingPointNumber("", type, AssertEmitFunc, &err_msg);
    733   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    734   EXPECT_EQ("Invalid 32-bit float literal: ", err_msg);
    735   rc = ParseAndEncodeFloatingPointNumber("0=", type, AssertEmitFunc, &err_msg);
    736   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    737   EXPECT_EQ("Invalid 32-bit float literal: 0=", err_msg);
    738 
    739   // Representative samples
    740   rc = ParseAndEncodeFloatingPointNumber(
    741       "0.0", type, [](uint32_t word) { EXPECT_EQ(0x0u, word); }, nullptr);
    742   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    743   rc = ParseAndEncodeFloatingPointNumber(
    744       "-0.0", type, [](uint32_t word) { EXPECT_EQ(0x80000000u, word); },
    745       nullptr);
    746   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    747   rc = ParseAndEncodeFloatingPointNumber(
    748       "42", type, [](uint32_t word) { EXPECT_EQ(0x42280000u, word); }, nullptr);
    749   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    750   rc = ParseAndEncodeFloatingPointNumber(
    751       "2.5", type, [](uint32_t word) { EXPECT_EQ(0x40200000u, word); },
    752       nullptr);
    753   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    754   rc = ParseAndEncodeFloatingPointNumber(
    755       "-32.5", type, [](uint32_t word) { EXPECT_EQ(0xc2020000u, word); },
    756       nullptr);
    757   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    758   rc = ParseAndEncodeFloatingPointNumber(
    759       "1e38", type, [](uint32_t word) { EXPECT_EQ(0x7e967699u, word); },
    760       nullptr);
    761   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    762   rc = ParseAndEncodeFloatingPointNumber(
    763       "-1e38", type, [](uint32_t word) { EXPECT_EQ(0xfe967699u, word); },
    764       nullptr);
    765   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    766 
    767   // Overflow
    768   rc =
    769       ParseAndEncodeFloatingPointNumber("1e40", type, AssertEmitFunc, &err_msg);
    770   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    771   EXPECT_EQ("Invalid 32-bit float literal: 1e40", err_msg);
    772   rc = ParseAndEncodeFloatingPointNumber("-1e40", type, AssertEmitFunc,
    773                                          &err_msg);
    774   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    775   EXPECT_EQ("Invalid 32-bit float literal: -1e40", err_msg);
    776   rc = ParseAndEncodeFloatingPointNumber("1e400", type, AssertEmitFunc,
    777                                          &err_msg);
    778   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    779   EXPECT_EQ("Invalid 32-bit float literal: 1e400", err_msg);
    780   rc = ParseAndEncodeFloatingPointNumber("-1e400", type, AssertEmitFunc,
    781                                          &err_msg);
    782   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    783   EXPECT_EQ("Invalid 32-bit float literal: -1e400", err_msg);
    784 }
    785 
    786 TEST(ParseAndEncodeDouble, Sample) {
    787   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    788   std::string err_msg;
    789   NumberType type = {64, SPV_NUMBER_FLOATING};
    790   std::vector<uint32_t> word_buffer;
    791   auto emit = [&word_buffer](uint32_t word) {
    792     if (word_buffer.size() == 2) word_buffer.clear();
    793     word_buffer.push_back(word);
    794   };
    795 
    796   // Invalid
    797   rc = ParseAndEncodeFloatingPointNumber("", type, AssertEmitFunc, &err_msg);
    798   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    799   EXPECT_EQ("Invalid 64-bit float literal: ", err_msg);
    800   rc = ParseAndEncodeFloatingPointNumber("0=", type, AssertEmitFunc, &err_msg);
    801   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    802   EXPECT_EQ("Invalid 64-bit float literal: 0=", err_msg);
    803 
    804   // Representative samples
    805   rc = ParseAndEncodeFloatingPointNumber("0.0", type, emit, nullptr);
    806   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    807   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0u, 0u}));
    808   rc = ParseAndEncodeFloatingPointNumber("-0.0", type, emit, nullptr);
    809   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    810   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0u, 0x80000000u}));
    811   rc = ParseAndEncodeFloatingPointNumber("42", type, emit, nullptr);
    812   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    813   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0u, 0x40450000u}));
    814   rc = ParseAndEncodeFloatingPointNumber("2.5", type, emit, nullptr);
    815   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    816   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0u, 0x40040000u}));
    817   rc = ParseAndEncodeFloatingPointNumber("32.5", type, emit, nullptr);
    818   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    819   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0u, 0x40404000u}));
    820   rc = ParseAndEncodeFloatingPointNumber("1e38", type, emit, nullptr);
    821   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    822   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0x2a16a1b1u, 0x47d2ced3u}));
    823   rc = ParseAndEncodeFloatingPointNumber("-1e38", type, emit, nullptr);
    824   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    825   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0x2a16a1b1u, 0xc7d2ced3u}));
    826   rc = ParseAndEncodeFloatingPointNumber("1e40", type, emit, nullptr);
    827   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    828   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0xf1c35ca5u, 0x483d6329u}));
    829   rc = ParseAndEncodeFloatingPointNumber("-1e40", type, emit, nullptr);
    830   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    831   EXPECT_THAT(word_buffer, Eq(std::vector<uint32_t>{0xf1c35ca5u, 0xc83d6329u}));
    832 
    833   // Overflow
    834   rc = ParseAndEncodeFloatingPointNumber("1e400", type, AssertEmitFunc,
    835                                          &err_msg);
    836   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    837   EXPECT_EQ("Invalid 64-bit float literal: 1e400", err_msg);
    838   rc = ParseAndEncodeFloatingPointNumber("-1e400", type, AssertEmitFunc,
    839                                          &err_msg);
    840   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    841   EXPECT_EQ("Invalid 64-bit float literal: -1e400", err_msg);
    842 }
    843 
    844 TEST(ParseAndEncodeFloat16, Sample) {
    845   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    846   std::string err_msg;
    847   NumberType type = {16, SPV_NUMBER_FLOATING};
    848 
    849   // Invalid
    850   rc = ParseAndEncodeFloatingPointNumber("", type, AssertEmitFunc, &err_msg);
    851   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    852   EXPECT_EQ("Invalid 16-bit float literal: ", err_msg);
    853   rc = ParseAndEncodeFloatingPointNumber("0=", type, AssertEmitFunc, &err_msg);
    854   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    855   EXPECT_EQ("Invalid 16-bit float literal: 0=", err_msg);
    856 
    857   // Representative samples
    858   rc = ParseAndEncodeFloatingPointNumber(
    859       "0.0", type, [](uint32_t word) { EXPECT_EQ(0x0u, word); }, nullptr);
    860   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    861   rc = ParseAndEncodeFloatingPointNumber(
    862       "-0.0", type, [](uint32_t word) { EXPECT_EQ(0x8000u, word); }, nullptr);
    863   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    864   rc = ParseAndEncodeFloatingPointNumber(
    865       "1.0", type, [](uint32_t word) { EXPECT_EQ(0x3c00u, word); }, nullptr);
    866   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    867   rc = ParseAndEncodeFloatingPointNumber(
    868       "2.5", type, [](uint32_t word) { EXPECT_EQ(0x4100u, word); }, nullptr);
    869   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    870   rc = ParseAndEncodeFloatingPointNumber(
    871       "32.5", type, [](uint32_t word) { EXPECT_EQ(0x5010u, word); }, nullptr);
    872   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    873 
    874   // Overflow
    875   rc =
    876       ParseAndEncodeFloatingPointNumber("1e38", type, AssertEmitFunc, &err_msg);
    877   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    878   EXPECT_EQ("Invalid 16-bit float literal: 1e38", err_msg);
    879   rc = ParseAndEncodeFloatingPointNumber("-1e38", type, AssertEmitFunc,
    880                                          &err_msg);
    881   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    882   EXPECT_EQ("Invalid 16-bit float literal: -1e38", err_msg);
    883   rc =
    884       ParseAndEncodeFloatingPointNumber("1e40", type, AssertEmitFunc, &err_msg);
    885   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    886   EXPECT_EQ("Invalid 16-bit float literal: 1e40", err_msg);
    887   rc = ParseAndEncodeFloatingPointNumber("-1e40", type, AssertEmitFunc,
    888                                          &err_msg);
    889   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    890   EXPECT_EQ("Invalid 16-bit float literal: -1e40", err_msg);
    891   rc = ParseAndEncodeFloatingPointNumber("1e400", type, AssertEmitFunc,
    892                                          &err_msg);
    893   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    894   EXPECT_EQ("Invalid 16-bit float literal: 1e400", err_msg);
    895   rc = ParseAndEncodeFloatingPointNumber("-1e400", type, AssertEmitFunc,
    896                                          &err_msg);
    897   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    898   EXPECT_EQ("Invalid 16-bit float literal: -1e400", err_msg);
    899 }
    900 
    901 TEST(ParseAndEncodeFloatingPointNumber, TypeNone) {
    902   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    903   std::string err_msg;
    904   NumberType type = {32, SPV_NUMBER_NONE};
    905 
    906   rc = ParseAndEncodeFloatingPointNumber(
    907       "0.0", type, [](uint32_t word) { EXPECT_EQ(0x0u, word); }, &err_msg);
    908   EXPECT_EQ(EncodeNumberStatus::kInvalidUsage, rc);
    909   EXPECT_EQ("The expected type is not a float type", err_msg);
    910 }
    911 
    912 TEST(ParseAndEncodeFloatingPointNumber, InvalidCaseWithoutErrorMessageString) {
    913   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    914   NumberType type = {32, SPV_NUMBER_FLOATING};
    915 
    916   rc = ParseAndEncodeFloatingPointNumber("invalid", type, AssertEmitFunc,
    917                                          nullptr);
    918   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    919 }
    920 
    921 TEST(ParseAndEncodeFloatingPointNumber, DoNotTouchErrorMessageStringOnSuccess) {
    922   EncodeNumberStatus rc = EncodeNumberStatus::kInvalidText;
    923   std::string err_msg("random content");
    924   NumberType type = {32, SPV_NUMBER_FLOATING};
    925 
    926   rc = ParseAndEncodeFloatingPointNumber(
    927       "0.0", type, [](uint32_t word) { EXPECT_EQ(0x0u, word); }, &err_msg);
    928   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    929   EXPECT_EQ("random content", err_msg);
    930 }
    931 
    932 TEST(ParseAndEncodeNumber, Sample) {
    933   EncodeNumberStatus rc = EncodeNumberStatus::kSuccess;
    934   std::string err_msg;
    935   NumberType type = {32, SPV_NUMBER_SIGNED_INT};
    936 
    937   // Invalid with error message string
    938   rc = ParseAndEncodeNumber("something wrong", type, AssertEmitFunc, &err_msg);
    939   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    940   EXPECT_EQ("Invalid unsigned integer literal: something wrong", err_msg);
    941 
    942   // Invalid without error message string
    943   rc = ParseAndEncodeNumber("something wrong", type, AssertEmitFunc, nullptr);
    944   EXPECT_EQ(EncodeNumberStatus::kInvalidText, rc);
    945 
    946   // Signed integer, should not touch the error message string.
    947   err_msg = "random content";
    948   rc = ParseAndEncodeNumber("-1", type,
    949                             [](uint32_t word) { EXPECT_EQ(0xffffffffu, word); },
    950                             &err_msg);
    951   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    952   EXPECT_EQ("random content", err_msg);
    953 
    954   // Unsigned integer
    955   type = {32, SPV_NUMBER_UNSIGNED_INT};
    956   rc = ParseAndEncodeNumber(
    957       "1", type, [](uint32_t word) { EXPECT_EQ(1u, word); }, nullptr);
    958   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    959 
    960   // Float
    961   type = {32, SPV_NUMBER_FLOATING};
    962   rc = ParseAndEncodeNumber("-1.0", type,
    963                             [](uint32_t word) { EXPECT_EQ(0xbf800000, word); },
    964                             nullptr);
    965   EXPECT_EQ(EncodeNumberStatus::kSuccess, rc);
    966 }
    967 
    968 }  // namespace
    969 }  // namespace utils
    970 }  // namespace spvtools
    971