#include <stdio.h>
#include <string.h>
#include <pb_decode.h>
#include <pb_encode.h>
#include "unittests.h"
#include "inline.pb.h"

int main()
{
    int status = 0;
    int i = 0;
    COMMENT("Test inline byte fields");

    {
      Message1 msg1 = Message1_init_zero;
      TEST(sizeof(msg1.data) == 32);
    }

    {
      Message1 msg1 = Message1_init_zero;
      pb_byte_t msg1_buffer[Message1_size];
      pb_ostream_t ostream = pb_ostream_from_buffer(msg1_buffer, Message1_size);
      Message1 msg1_deserialized = Message1_init_zero;
      pb_istream_t istream = pb_istream_from_buffer(msg1_buffer, Message1_size);

      for (i = 0; i < 32; i++) {
        msg1.data[i] = i;
      }

      TEST(pb_encode(&ostream, Message1_fields, &msg1));
      TEST(ostream.bytes_written == Message1_size);

      TEST(pb_decode(&istream, Message1_fields, &msg1_deserialized));

      TEST(istream.bytes_left == 0);
      TEST(memcmp(&msg1_deserialized, &msg1, sizeof(msg1)) == 0);
    }

    {
      Message2 msg2 = {true, {0}};
      Message2 msg2_no_data = {false, {1}};
      pb_byte_t msg2_buffer[Message2_size];
      pb_ostream_t ostream = pb_ostream_from_buffer(msg2_buffer, Message2_size);
      Message2 msg2_deserialized = Message2_init_zero;
      pb_istream_t istream = pb_istream_from_buffer(msg2_buffer, Message2_size);

      for (i = 0; i < 64; i++) {
        msg2.data[i] = i;
      }

      TEST(pb_encode(&ostream, Message2_fields, &msg2));
      TEST(ostream.bytes_written == Message2_size);

      TEST(pb_decode(&istream, Message2_fields, &msg2_deserialized));

      TEST(istream.bytes_left == 0);
      TEST(memcmp(&msg2_deserialized, &msg2, sizeof(msg2)) == 0);
      TEST(msg2_deserialized.has_data);

      memset(msg2_buffer, 0, sizeof(msg2_buffer));
      ostream = pb_ostream_from_buffer(msg2_buffer, Message2_size);
      TEST(pb_encode(&ostream, Message2_fields, &msg2_no_data));
      istream = pb_istream_from_buffer(msg2_buffer, ostream.bytes_written);
      TEST(pb_decode(&istream, Message2_fields, &msg2_deserialized));
      TEST(!msg2_deserialized.has_data);
      TEST(memcmp(&msg2_deserialized, &msg2, sizeof(msg2)) != 0);
    }

    if (status != 0)
        fprintf(stdout, "\n\nSome tests FAILED!\n");

    return status;
}
