// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

#include "gtest/gtest.h"
#include <cstdint>
#include <cstdlib>

#include "FuzzedDataProvider.h"

// The test is intentionally extensive, as behavior of |FuzzedDataProvider| must
// not be broken, given than many fuzz targets depend on it. Changing the
// behavior might invalidate existing corpora and make the fuzz targets using
// |FuzzedDataProvider| to lose code coverage accumulated over time.

/* A random 1KB buffer generated by:
$ python -c "import os; print ',\n'.join([', '.join(['0x%02X' % ord(i) for i \
      in list(os.urandom(8))]) for _ in xrange(128)])"
*/
const uint8_t Data[] = {
    0x8A, 0x19, 0x0D, 0x44, 0x37, 0x0D, 0x38, 0x5E, 0x9B, 0xAA, 0xF3, 0xDA,
    0xAA, 0x88, 0xF2, 0x9B, 0x6C, 0xBA, 0xBE, 0xB1, 0xF2, 0xCF, 0x13, 0xB8,
    0xAC, 0x1A, 0x7F, 0x1C, 0xC9, 0x90, 0xD0, 0xD9, 0x5C, 0x42, 0xB3, 0xFD,
    0xE3, 0x05, 0xA4, 0x03, 0x37, 0x49, 0x50, 0x4B, 0xBC, 0x39, 0xA2, 0x09,
    0x6C, 0x2F, 0xAF, 0xD1, 0xB5, 0x47, 0xBF, 0x92, 0xBD, 0x79, 0xE5, 0xC5,
    0x6E, 0x51, 0xA4, 0xED, 0xE9, 0xBD, 0x40, 0x4A, 0xFC, 0x25, 0x7A, 0x27,
    0xC8, 0x92, 0xF7, 0x30, 0xDE, 0x40, 0x66, 0x66, 0xE8, 0x5F, 0x65, 0x39,
    0x7E, 0x9E, 0x80, 0x2B, 0x01, 0x71, 0x2A, 0xFF, 0xD3, 0x0A, 0xAC, 0x6E,
    0x49, 0x32, 0x79, 0x10, 0x6A, 0x6F, 0x97, 0x96, 0x70, 0x7E, 0x50, 0x65,
    0xC9, 0x1D, 0xBD, 0x4E, 0x17, 0x04, 0x1E, 0xBA, 0x26, 0xAC, 0x1F, 0xE3,
    0x37, 0x1C, 0x15, 0x43, 0x60, 0x41, 0x2A, 0x7C, 0xCA, 0x70, 0xCE, 0xAB,
    0x20, 0x24, 0xF8, 0xD9, 0x1F, 0x14, 0x7C, 0x5C, 0xDD, 0x6F, 0xB3, 0xD7,
    0x8B, 0x63, 0x10, 0xB7, 0xDA, 0x99, 0xAF, 0x99, 0x01, 0x21, 0xE6, 0xE1,
    0x86, 0x27, 0xBE, 0x8D, 0xDF, 0x1E, 0xEA, 0x80, 0x0B, 0x8A, 0x60, 0xC3,
    0x3A, 0x85, 0x33, 0x53, 0x59, 0xE1, 0xB5, 0xF1, 0x62, 0xA6, 0x7B, 0x24,
    0x94, 0xE3, 0x8C, 0x10, 0x93, 0xF8, 0x6E, 0xC2, 0x00, 0x91, 0x90, 0x0B,
    0x5D, 0x52, 0x4F, 0x21, 0xE3, 0x40, 0x3A, 0x6E, 0xB6, 0x32, 0x15, 0xDB,
    0x5D, 0x01, 0x86, 0x63, 0x83, 0x24, 0xC5, 0xDE, 0xAB, 0x31, 0x84, 0xAA,
    0xE5, 0x64, 0x02, 0x8D, 0x23, 0x82, 0x86, 0x14, 0x16, 0x18, 0x9F, 0x3D,
    0x31, 0xBE, 0x3B, 0xF0, 0x6C, 0x26, 0x42, 0x9A, 0x67, 0xFE, 0x28, 0xEC,
    0x28, 0xDB, 0x01, 0xB4, 0x52, 0x41, 0x81, 0x7C, 0x54, 0xD3, 0xC8, 0x00,
    0x01, 0x66, 0xB0, 0x2C, 0x3F, 0xBC, 0xAF, 0xAC, 0x87, 0xCD, 0x83, 0xCF,
    0x23, 0xFC, 0xC8, 0x97, 0x8C, 0x71, 0x32, 0x8B, 0xBF, 0x70, 0xC0, 0x48,
    0x31, 0x92, 0x18, 0xFE, 0xE5, 0x33, 0x48, 0x82, 0x98, 0x1E, 0x30, 0xCC,
    0xAD, 0x5D, 0x97, 0xC4, 0xB4, 0x39, 0x7C, 0xCD, 0x39, 0x44, 0xF1, 0xA9,
    0xD0, 0xF4, 0x27, 0xB7, 0x78, 0x85, 0x9E, 0x72, 0xFC, 0xCC, 0xEE, 0x98,
    0x25, 0x3B, 0x69, 0x6B, 0x0C, 0x11, 0xEA, 0x22, 0xB6, 0xD0, 0xCD, 0xBF,
    0x6D, 0xBE, 0x12, 0xDE, 0xFE, 0x78, 0x2E, 0x54, 0xCB, 0xBA, 0xD7, 0x2E,
    0x54, 0x25, 0x14, 0x84, 0xFE, 0x1A, 0x10, 0xCE, 0xCC, 0x20, 0xE6, 0xE2,
    0x7F, 0xE0, 0x5F, 0xDB, 0xA7, 0xF3, 0xE2, 0x4C, 0x52, 0x82, 0xFC, 0x0B,
    0xA0, 0xBD, 0x34, 0x21, 0xF7, 0xEB, 0x1C, 0x5B, 0x67, 0xD0, 0xAF, 0x22,
    0x15, 0xA1, 0xFF, 0xC2, 0x68, 0x25, 0x5B, 0xB2, 0x13, 0x3F, 0xFF, 0x98,
    0x53, 0x25, 0xC5, 0x58, 0x39, 0xD0, 0x43, 0x86, 0x6C, 0x5B, 0x57, 0x8E,
    0x83, 0xBA, 0xB9, 0x09, 0x09, 0x14, 0x0C, 0x9E, 0x99, 0x83, 0x88, 0x53,
    0x79, 0xFD, 0xF7, 0x49, 0xE9, 0x2C, 0xCE, 0xE6, 0x7B, 0xF5, 0xC2, 0x27,
    0x5E, 0x56, 0xB5, 0xB4, 0x46, 0x90, 0x91, 0x7F, 0x99, 0x88, 0xA7, 0x23,
    0xC1, 0x80, 0xB8, 0x2D, 0xCD, 0xF7, 0x6F, 0x9A, 0xEC, 0xBD, 0x16, 0x9F,
    0x7D, 0x87, 0x1E, 0x15, 0x51, 0xC4, 0x96, 0xE2, 0xBF, 0x61, 0x66, 0xB5,
    0xFD, 0x01, 0x67, 0xD6, 0xFF, 0xD2, 0x14, 0x20, 0x98, 0x8E, 0xEF, 0xF3,
    0x22, 0xDB, 0x7E, 0xCE, 0x70, 0x2D, 0x4C, 0x06, 0x5A, 0xA0, 0x4F, 0xC8,
    0xB0, 0x4D, 0xA6, 0x52, 0xB2, 0xD6, 0x2F, 0xD8, 0x57, 0xE5, 0xEF, 0xF9,
    0xEE, 0x52, 0x0F, 0xEC, 0xC4, 0x90, 0x33, 0xAD, 0x25, 0xDA, 0xCD, 0x12,
    0x44, 0x5F, 0x32, 0xF6, 0x6F, 0xEF, 0x85, 0xB8, 0xDC, 0x3C, 0x01, 0x48,
    0x28, 0x5D, 0x2D, 0x9C, 0x9B, 0xC0, 0x49, 0x36, 0x1E, 0x6A, 0x0A, 0x0C,
    0xB0, 0x6E, 0x81, 0x89, 0xCB, 0x0A, 0x89, 0xCF, 0x73, 0xC6, 0x63, 0x3D,
    0x8E, 0x13, 0x57, 0x91, 0x4E, 0xA3, 0x93, 0x8C, 0x61, 0x67, 0xFD, 0x13,
    0xE0, 0x14, 0x72, 0xB3, 0xE4, 0x23, 0x45, 0x08, 0x4E, 0x4E, 0xF5, 0xA7,
    0xA8, 0xEE, 0x30, 0xFD, 0x81, 0x80, 0x1F, 0xF3, 0x4F, 0xD7, 0xE7, 0xF2,
    0x16, 0xC0, 0xD6, 0x15, 0x6A, 0x0F, 0x89, 0x15, 0xA9, 0xCF, 0x35, 0x50,
    0x6B, 0x49, 0x3E, 0x12, 0x4A, 0x72, 0xE4, 0x59, 0x9D, 0xD7, 0xDB, 0xD2,
    0xD1, 0x61, 0x7D, 0x52, 0x4A, 0x36, 0xF6, 0xBA, 0x0E, 0xFA, 0x88, 0x6F,
    0x3C, 0x82, 0x16, 0xF0, 0xD5, 0xED, 0x4D, 0x78, 0xEF, 0x38, 0x17, 0x90,
    0xEA, 0x28, 0x32, 0xA9, 0x79, 0x40, 0xFF, 0xAA, 0xE6, 0xF5, 0xC7, 0x96,
    0x56, 0x65, 0x61, 0x83, 0x3D, 0xBD, 0xD7, 0xED, 0xD6, 0xB6, 0xC0, 0xED,
    0x34, 0xAA, 0x60, 0xA9, 0xE8, 0x82, 0x78, 0xEA, 0x69, 0xF6, 0x47, 0xAF,
    0x39, 0xAB, 0x11, 0xDB, 0xE9, 0xFB, 0x68, 0x0C, 0xFE, 0xDF, 0x97, 0x9F,
    0x3A, 0xF4, 0xF3, 0x32, 0x27, 0x30, 0x57, 0x0E, 0xF7, 0xB2, 0xEE, 0xFB,
    0x1E, 0x98, 0xA8, 0xA3, 0x25, 0x45, 0xE4, 0x6D, 0x2D, 0xAE, 0xFE, 0xDA,
    0xB3, 0x32, 0x9B, 0x5D, 0xF5, 0x32, 0x74, 0xEA, 0xE5, 0x02, 0x30, 0x53,
    0x95, 0x13, 0x7A, 0x23, 0x1F, 0x10, 0x30, 0xEA, 0x78, 0xE4, 0x36, 0x1D,
    0x92, 0x96, 0xB9, 0x91, 0x2D, 0xFA, 0x43, 0xAB, 0xE6, 0xEF, 0x14, 0x14,
    0xC9, 0xBC, 0x46, 0xC6, 0x05, 0x7C, 0xC6, 0x11, 0x23, 0xCF, 0x3D, 0xC8,
    0xBE, 0xEC, 0xA3, 0x58, 0x31, 0x55, 0x65, 0x14, 0xA7, 0x94, 0x93, 0xDD,
    0x2D, 0x76, 0xC9, 0x66, 0x06, 0xBD, 0xF5, 0xE7, 0x30, 0x65, 0x42, 0x52,
    0xA2, 0x50, 0x9B, 0xE6, 0x40, 0xA2, 0x4B, 0xEC, 0xA6, 0xB7, 0x39, 0xAA,
    0xD7, 0x61, 0x2C, 0xBF, 0x37, 0x5A, 0xDA, 0xB3, 0x5D, 0x2F, 0x5D, 0x11,
    0x82, 0x97, 0x32, 0x8A, 0xC1, 0xA1, 0x13, 0x20, 0x17, 0xBD, 0xA2, 0x91,
    0x94, 0x2A, 0x4E, 0xBE, 0x3E, 0x77, 0x63, 0x67, 0x5C, 0x0A, 0xE1, 0x22,
    0x0A, 0x4F, 0x63, 0xE2, 0x84, 0xE9, 0x9F, 0x14, 0x86, 0xE2, 0x4B, 0x20,
    0x9F, 0x50, 0xB3, 0x56, 0xED, 0xDE, 0x39, 0xD8, 0x75, 0x64, 0x45, 0x54,
    0xE5, 0x34, 0x57, 0x8C, 0x3B, 0xF2, 0x0E, 0x94, 0x1B, 0x10, 0xA2, 0xA2,
    0x38, 0x76, 0x21, 0x8E, 0x2A, 0x57, 0x64, 0x58, 0x0A, 0x27, 0x6D, 0x4C,
    0xD0, 0xB5, 0xC1, 0xFC, 0x75, 0xD0, 0x01, 0x86, 0x66, 0xA8, 0xF1, 0x98,
    0x58, 0xFB, 0xFC, 0x64, 0xD2, 0x31, 0x77, 0xAD, 0x0E, 0x46, 0x87, 0xCC,
    0x9B, 0x86, 0x90, 0xFF, 0xB6, 0x64, 0x35, 0xA5, 0x5D, 0x9E, 0x44, 0x51,
    0x87, 0x9E, 0x1E, 0xEE, 0xF3, 0x3B, 0x5C, 0xDD, 0x94, 0x03, 0xAA, 0x18,
    0x2C, 0xB7, 0xC4, 0x37, 0xD5, 0x53, 0x28, 0x60, 0xEF, 0x77, 0xEF, 0x3B,
    0x9E, 0xD2, 0xCE, 0xE9, 0x53, 0x2D, 0xF5, 0x19, 0x7E, 0xBB, 0xB5, 0x46,
    0xE2, 0xF7, 0xD6, 0x4D, 0x6D, 0x5B, 0x81, 0x56, 0x6B, 0x12, 0x55, 0x63,
    0xC3, 0xAB, 0x08, 0xBB, 0x2E, 0xD5, 0x11, 0xBC, 0x18, 0xCB, 0x8B, 0x12,
    0x2E, 0x3E, 0x75, 0x32, 0x98, 0x8A, 0xDE, 0x3C, 0xEA, 0x33, 0x46, 0xE7,
    0x7A, 0xA5, 0x12, 0x09, 0x26, 0x7E, 0x7E, 0x03, 0x4F, 0xFD, 0xC0, 0xFD,
    0xEA, 0x4F, 0x83, 0x85, 0x39, 0x62, 0xFB, 0xA2, 0x33, 0xD9, 0x2D, 0xB1,
    0x30, 0x6F, 0x88, 0xAB, 0x61, 0xCB, 0x32, 0xEB, 0x30, 0xF9, 0x51, 0xF6,
    0x1F, 0x3A, 0x11, 0x4D, 0xFD, 0x54, 0xD6, 0x3D, 0x43, 0x73, 0x39, 0x16,
    0xCF, 0x3D, 0x29, 0x4A};

TEST(FuzzedDataProvider, ConsumeBytes) {
  FuzzedDataProvider DataProv(Data, sizeof(Data));
  EXPECT_EQ(std::vector<unsigned char>(1, 0x8A),
            DataProv.ConsumeBytes<unsigned char>(1));
  EXPECT_EQ(std::vector<uint8_t>(
                {0x19, 0x0D, 0x44, 0x37, 0x0D, 0x38, 0x5E, 0x9B, 0xAA, 0xF3}),
            DataProv.ConsumeBytes<uint8_t>(10));

  std::vector<unsigned char> UChars = DataProv.ConsumeBytes<unsigned char>(24);
  EXPECT_EQ(std::vector<unsigned char>({0xDA, 0xAA, 0x88, 0xF2, 0x9B, 0x6C,
                                        0xBA, 0xBE, 0xB1, 0xF2, 0xCF, 0x13,
                                        0xB8, 0xAC, 0x1A, 0x7F, 0x1C, 0xC9,
                                        0x90, 0xD0, 0xD9, 0x5C, 0x42, 0xB3}),
            UChars);

  EXPECT_EQ(std::vector<signed char>(Data + 1 + 10 + 24, Data + sizeof(Data)),
            DataProv.ConsumeBytes<signed char>(31337));
}

TEST(FuzzedDataProvider, ConsumeBytesWithTerminator) {
  FuzzedDataProvider DataProv(Data, sizeof(Data));
  EXPECT_EQ(std::vector<unsigned char>({0x8A, 0x00}),
            DataProv.ConsumeBytesWithTerminator<unsigned char>(1));
  EXPECT_EQ(std::vector<uint8_t>({0x19, 0x0D, 0x44, 0x37, 0x0D, 0x38, 0x5E,
                                  0x9B, 0xAA, 0xF3, 111}),
            DataProv.ConsumeBytesWithTerminator<uint8_t>(10, 111));

  std::vector<unsigned char> UChars =
      DataProv.ConsumeBytesWithTerminator<unsigned char>(24);
  EXPECT_EQ(std::vector<unsigned char>(
                {0xDA, 0xAA, 0x88, 0xF2, 0x9B, 0x6C, 0xBA, 0xBE, 0xB1,
                 0xF2, 0xCF, 0x13, 0xB8, 0xAC, 0x1A, 0x7F, 0x1C, 0xC9,
                 0x90, 0xD0, 0xD9, 0x5C, 0x42, 0xB3, 0x00}),
            UChars);

  std::vector<signed char> Expected(Data + 1 + 10 + 24, Data + sizeof(Data));
  Expected.push_back(65);
  EXPECT_EQ(Expected,
            DataProv.ConsumeBytesWithTerminator<signed char>(31337, 65));
}

TEST(FuzzedDataProvider, ConsumeBytesAsString) {
  FuzzedDataProvider DataProv(Data, sizeof(Data));
  EXPECT_EQ(std::string("\x8A\x19\x0D\x44\x37\x0D\x38\x5E\x9B\xAA\xF3\xDA"),
            DataProv.ConsumeBytesAsString(12));
  EXPECT_EQ(std::string(Data + 12, Data + sizeof(Data)),
            DataProv.ConsumeBytesAsString(31337));
}

TEST(FuzzedDataProvider, ConsumeIntegralInRange) {
  FuzzedDataProvider DataProv(Data, sizeof(Data));
  EXPECT_EQ(int32_t(21), DataProv.ConsumeIntegralInRange<int32_t>(10, 30));
  EXPECT_EQ(int32_t(1337),
            DataProv.ConsumeIntegralInRange<int32_t>(1337, 1337));
  EXPECT_EQ(int8_t(-59), DataProv.ConsumeIntegralInRange<int8_t>(-100, 100));
  EXPECT_EQ(uint16_t(15823),
            DataProv.ConsumeIntegralInRange<uint16_t>(0, 65535));
  EXPECT_EQ((signed char)(-101),
            DataProv.ConsumeIntegralInRange<signed char>(-123, 123));
  EXPECT_EQ(int64_t(-53253077544), DataProv.ConsumeIntegralInRange<int64_t>(
                                       -99999999999, 99999999999));

  // Exhaust the buffer.
  auto String = DataProv.ConsumeBytesAsString(31337);
  EXPECT_EQ(size_t(1014), String.length());
  EXPECT_EQ(uint64_t(123456789),
            DataProv.ConsumeIntegralInRange<uint64_t>(123456789, 987654321));
}

TEST(FuzzedDataProvider, ConsumeRandomLengthString) {
  FuzzedDataProvider DataProv(Data, sizeof(Data));
  EXPECT_EQ(
      std::string(
          "\x8A\x19\x0D\x44\x37\x0D\x38\x5E\x9B\xAA\xF3\xDA\xAA\x88\xF2\x9B\x6C"
          "\xBA\xBE\xB1\xF2\xCF\x13\xB8\xAC\x1A\x7F\x1C\xC9\x90\xD0\xD9"),
      DataProv.ConsumeRandomLengthString(1337));
  EXPECT_EQ(std::string(
                "\xB3\xFD\xE3\x05\xA4\x03\x37\x49\x50\x4B\xBC\x39\xA2\x09\x6C"
                "\x2F\xAF\xD1\xB5\x47\xBF\x92\xBD\x79\xE5\xC5\x6E\x51\xA4\xED"
                "\xE9\xBD\x40\x4A\xFC\x25\x7A\x27\xC8\x92\xF7\x30\xDE\x40\x66"
                "\x66\xE8\x5F\x65\x39\x7E\x9E\x80\x2B\x01\x71\x2A\xFF\xD3\x0A"
                "\xAC\x6E\x49\x32\x79\x10\x6A\x6F\x97\x96\x70\x7E\x50\x65\xC9"
                "\x1D\xBD\x4E\x17\x04\x1E\xBA\x26\xAC\x1F\xE3\x37\x1C\x15\x43"
                "\x60\x41\x2A\x7C\xCA\x70\xCE\xAB\x20\x24\xF8\xD9\x1F\x14\x7C"),
            DataProv.ConsumeRandomLengthString(31337));
  EXPECT_EQ(std::string(Data + 141, Data + 141 + 5),
            DataProv.ConsumeRandomLengthString(5));
  EXPECT_EQ(std::string(Data + 141 + 5, Data + 141 + 5 + 2),
            DataProv.ConsumeRandomLengthString(2));

  // Exhaust the buffer.
  auto String = DataProv.ConsumeBytesAsString(31337);
  EXPECT_EQ(size_t(876), String.length());
  EXPECT_EQ(std::string(), DataProv.ConsumeRandomLengthString(1));
}

TEST(FuzzedDataProvider, ConsumeRemainingBytes) {
  {
    FuzzedDataProvider DataProv(Data, sizeof(Data));
    EXPECT_EQ(std::vector<uint8_t>(Data, Data + sizeof(Data)),
              DataProv.ConsumeRemainingBytes<uint8_t>());
    EXPECT_EQ(std::vector<uint8_t>(),
              DataProv.ConsumeRemainingBytes<uint8_t>());
  }

  {
    FuzzedDataProvider DataProv(Data, sizeof(Data));
    EXPECT_EQ(std::vector<uint8_t>(Data, Data + 123),
              DataProv.ConsumeBytes<uint8_t>(123));
    EXPECT_EQ(std::vector<char>(Data + 123, Data + sizeof(Data)),
              DataProv.ConsumeRemainingBytes<char>());
  }
}

TEST(FuzzedDataProvider, ConsumeRemainingBytesAsString) {
  {
    FuzzedDataProvider DataProv(Data, sizeof(Data));
    EXPECT_EQ(std::string(Data, Data + sizeof(Data)),
              DataProv.ConsumeRemainingBytesAsString());
    EXPECT_EQ(std::string(""), DataProv.ConsumeRemainingBytesAsString());
  }

  {
    FuzzedDataProvider DataProv(Data, sizeof(Data));
    EXPECT_EQ(std::vector<uint8_t>(Data, Data + 123),
              DataProv.ConsumeBytes<uint8_t>(123));
    EXPECT_EQ(std::string(Data + 123, Data + sizeof(Data)),
              DataProv.ConsumeRemainingBytesAsString());
  }
}

TEST(FuzzedDataProvider, ConsumeIntegral) {
  FuzzedDataProvider DataProv(Data, sizeof(Data));
  EXPECT_EQ(int32_t(-903266865), DataProv.ConsumeIntegral<int32_t>());
  EXPECT_EQ(uint32_t(372863811), DataProv.ConsumeIntegral<uint32_t>());
  EXPECT_EQ(uint8_t(61), DataProv.ConsumeIntegral<uint8_t>());
  EXPECT_EQ(int16_t(22100), DataProv.ConsumeIntegral<int16_t>());
  EXPECT_EQ(uint64_t(18252263806144500217u),
            DataProv.ConsumeIntegral<uint64_t>());

  // Exhaust the buffer.
  auto String = DataProv.ConsumeBytesAsString(31337);
  EXPECT_EQ(size_t(1005), String.length());
  EXPECT_EQ(std::numeric_limits<int64_t>::min(),
            DataProv.ConsumeIntegral<int64_t>());
}

TEST(FuzzedDataProvider, ConsumeBool) {
  FuzzedDataProvider DataProv(Data, sizeof(Data));
  EXPECT_EQ(false, DataProv.ConsumeBool());
  EXPECT_EQ(true, DataProv.ConsumeBool());
  EXPECT_EQ(true, DataProv.ConsumeBool());
  EXPECT_EQ(true, DataProv.ConsumeBool());
  EXPECT_EQ(false, DataProv.ConsumeBool());
  EXPECT_EQ(true, DataProv.ConsumeBool());
  EXPECT_EQ(true, DataProv.ConsumeBool());
  EXPECT_EQ(true, DataProv.ConsumeBool());
  EXPECT_EQ(true, DataProv.ConsumeBool());
  EXPECT_EQ(false, DataProv.ConsumeBool());

  // Exhaust the buffer.
  auto String = DataProv.ConsumeBytesAsString(31337);
  EXPECT_EQ(size_t(1014), String.length());
  EXPECT_EQ(false, DataProv.ConsumeBool());
}

TEST(FuzzedDataProvider, PickValueInArray) {
  FuzzedDataProvider DataProv(Data, sizeof(Data));
  const int Array[] = {1, 2, 3, 4, 5};
  EXPECT_EQ(5, DataProv.PickValueInArray(Array));
  EXPECT_EQ(2, DataProv.PickValueInArray(Array));
  EXPECT_EQ(2, DataProv.PickValueInArray(Array));
  EXPECT_EQ(3, DataProv.PickValueInArray(Array));
  EXPECT_EQ(3, DataProv.PickValueInArray(Array));
  EXPECT_EQ(3, DataProv.PickValueInArray(Array));
  EXPECT_EQ(1, DataProv.PickValueInArray(Array));
  EXPECT_EQ(3, DataProv.PickValueInArray(Array));
  EXPECT_EQ(2, DataProv.PickValueInArray(Array));

  EXPECT_EQ(uint8_t(0x9D), DataProv.PickValueInArray(Data));
  EXPECT_EQ(uint8_t(0xBA), DataProv.PickValueInArray(Data));
  EXPECT_EQ(uint8_t(0x69), DataProv.PickValueInArray(Data));
  EXPECT_EQ(uint8_t(0xD6), DataProv.PickValueInArray(Data));

  EXPECT_EQ(uint32_t(777), DataProv.PickValueInArray<uint32_t>({1337, 777}));
  EXPECT_EQ(uint32_t(777), DataProv.PickValueInArray<uint32_t>({1337, 777}));
  EXPECT_EQ(uint64_t(1337), DataProv.PickValueInArray<uint64_t>({1337, 777}));
  EXPECT_EQ(size_t(777), DataProv.PickValueInArray<size_t>({1337, 777}));
  EXPECT_EQ(int16_t(1337), DataProv.PickValueInArray<int16_t>({1337, 777}));
  EXPECT_EQ(int32_t(777), DataProv.PickValueInArray<int32_t>({1337, 777}));
  EXPECT_EQ(int64_t(777), DataProv.PickValueInArray<int64_t>({1337, 777}));

  // Exhaust the buffer.
  auto String = DataProv.ConsumeBytesAsString(31337);
  EXPECT_EQ(size_t(1000), String.length());
  EXPECT_EQ(uint8_t(0x8A), DataProv.PickValueInArray(Data));
}

TEST(FuzzedDataProvider, ConsumeEnum) {
  FuzzedDataProvider DataProv(Data, sizeof(Data));
  enum class Enum {
    Zero,
    One,
    Two,
    Three,
    Four,
    Five,
    Six,
    Seven,
    kMaxValue = Seven
  };
  EXPECT_EQ(Enum::Two, DataProv.ConsumeEnum<Enum>());
  EXPECT_EQ(Enum::One, DataProv.ConsumeEnum<Enum>());
  EXPECT_EQ(Enum::Five, DataProv.ConsumeEnum<Enum>());
  EXPECT_EQ(Enum::Seven, DataProv.ConsumeEnum<Enum>());
  EXPECT_EQ(Enum::Six, DataProv.ConsumeEnum<Enum>());
  EXPECT_EQ(Enum::One, DataProv.ConsumeEnum<Enum>());
  EXPECT_EQ(Enum::Three, DataProv.ConsumeEnum<Enum>());
  EXPECT_EQ(Enum::Three, DataProv.ConsumeEnum<Enum>());
  EXPECT_EQ(Enum::Five, DataProv.ConsumeEnum<Enum>());
  EXPECT_EQ(Enum::Six, DataProv.ConsumeEnum<Enum>());

  // Exhaust the buffer.
  auto String = DataProv.ConsumeBytesAsString(31337);
  EXPECT_EQ(size_t(1014), String.length());
  EXPECT_EQ(Enum::Zero, DataProv.ConsumeEnum<Enum>());
}

TEST(FuzzedDataProvider, remaining_bytes) {
  FuzzedDataProvider DataProv(Data, sizeof(Data));
  EXPECT_EQ(size_t(1024), DataProv.remaining_bytes());
  EXPECT_EQ(false, DataProv.ConsumeBool());
  EXPECT_EQ(size_t(1024 - 1), DataProv.remaining_bytes());
  EXPECT_EQ(std::vector<uint8_t>(Data, Data + 8),
            DataProv.ConsumeBytes<uint8_t>(8));
  EXPECT_EQ(size_t(1024 - 1 - 8), DataProv.remaining_bytes());

  // Exhaust the buffer.
  EXPECT_EQ(std::vector<uint8_t>(Data + 8, Data + sizeof(Data) - 1),
            DataProv.ConsumeRemainingBytes<uint8_t>());
  EXPECT_EQ(size_t(0), DataProv.remaining_bytes());
}

int main(int argc, char **argv) {
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
