17ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* Tests the decoding of all types.
27ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * This is the counterpart of test_encode3.
37ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen * Run e.g. ./test_encode3 | ./test_decode3
47ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen */
57ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
67ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <stdio.h>
77ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <string.h>
87ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <stdlib.h>
97ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include <pb_decode.h>
107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include "alltypes.pb.h"
117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#include "test_helpers.h"
127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen#define TEST(x) if (!(x)) { \
147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    printf("Test " #x " failed.\n"); \
157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    return false; \
167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    }
177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen/* This function is called once from main(), it handles
197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen   the decoding and checks the fields. */
207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenbool check_alltypes(pb_istream_t *stream, int mode)
217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{
227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    AllTypes alltypes;
237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    /* Fill with garbage to better detect initialization errors */
257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    memset(&alltypes, 0xAA, sizeof(alltypes));
267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    if (!pb_decode(stream, AllTypes_fields, &alltypes))
287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        return false;
297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_int32         == -1001);
317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_int64         == -1002);
327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_uint32        == 1003);
337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_uint64        == 1004);
347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_sint32        == -1005);
357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_sint64        == -1006);
367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_bool          == true);
377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_fixed32       == 1008);
397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_sfixed32      == -1009);
407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_float         == 1010.0f);
417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_fixed64       == 1011);
437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_sfixed64      == -1012);
447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_double        == 1013.0f);
457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(strcmp(alltypes.req_string, "1014") == 0);
477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_bytes.size == 4);
487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(memcmp(alltypes.req_bytes.bytes, "1015", 4) == 0);
497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(strcmp(alltypes.req_submsg.substuff1, "1016") == 0);
507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_submsg.substuff2 == 1016);
517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_submsg.substuff3 == 3);
527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_enum == MyEnum_Truth);
537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_int32_count == 5 && alltypes.rep_int32[4] == -2001 && alltypes.rep_int32[0] == 0);
557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_int64_count == 5 && alltypes.rep_int64[4] == -2002 && alltypes.rep_int64[0] == 0);
567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_uint32_count == 5 && alltypes.rep_uint32[4] == 2003 && alltypes.rep_uint32[0] == 0);
577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_uint64_count == 5 && alltypes.rep_uint64[4] == 2004 && alltypes.rep_uint64[0] == 0);
587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_sint32_count == 5 && alltypes.rep_sint32[4] == -2005 && alltypes.rep_sint32[0] == 0);
597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_sint64_count == 5 && alltypes.rep_sint64[4] == -2006 && alltypes.rep_sint64[0] == 0);
607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_bool_count == 5 && alltypes.rep_bool[4] == true && alltypes.rep_bool[0] == false);
617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_fixed32_count == 5 && alltypes.rep_fixed32[4] == 2008 && alltypes.rep_fixed32[0] == 0);
637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_sfixed32_count == 5 && alltypes.rep_sfixed32[4] == -2009 && alltypes.rep_sfixed32[0] == 0);
647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_float_count == 5 && alltypes.rep_float[4] == 2010.0f && alltypes.rep_float[0] == 0.0f);
657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_fixed64_count == 5 && alltypes.rep_fixed64[4] == 2011 && alltypes.rep_fixed64[0] == 0);
677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_sfixed64_count == 5 && alltypes.rep_sfixed64[4] == -2012 && alltypes.rep_sfixed64[0] == 0);
687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_double_count == 5 && alltypes.rep_double[4] == 2013.0 && alltypes.rep_double[0] == 0.0);
697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_string_count == 5 && strcmp(alltypes.rep_string[4], "2014") == 0 && alltypes.rep_string[0][0] == '\0');
717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_bytes_count == 5 && alltypes.rep_bytes[4].size == 4 && alltypes.rep_bytes[0].size == 0);
727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(memcmp(alltypes.rep_bytes[4].bytes, "2015", 4) == 0);
737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_submsg_count == 5);
757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(strcmp(alltypes.rep_submsg[4].substuff1, "2016") == 0 && alltypes.rep_submsg[0].substuff1[0] == '\0');
767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_submsg[4].substuff2 == 2016 && alltypes.rep_submsg[0].substuff2 == 0);
777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_submsg[4].substuff3 == 2016 && alltypes.rep_submsg[0].substuff3 == 3);
787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_enum_count == 5 && alltypes.rep_enum[4] == MyEnum_Truth && alltypes.rep_enum[0] == MyEnum_Zero);
807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.rep_emptymsg_count == 5);
817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    if (mode == 0)
837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    {
847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        /* Expect default values */
857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_int32     == false);
867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_int32         == 4041);
877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_int64     == false);
887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_int64         == 4042);
897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_uint32    == false);
907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_uint32        == 4043);
917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_uint64    == false);
927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_uint64        == 4044);
937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_sint32    == false);
947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_sint32        == 4045);
957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_sint64    == false);
967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_sint64        == 4046);
977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_bool      == false);
987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_bool          == false);
997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
1007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_fixed32   == false);
1017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_fixed32       == 4048);
1027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_sfixed32  == false);
1037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_sfixed32      == 4049);
1047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_float     == false);
1057ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_float         == 4050.0f);
1067ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
1077ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_fixed64   == false);
1087ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_fixed64       == 4051);
1097ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_sfixed64  == false);
1107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_sfixed64      == 4052);
1117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_double    == false);
1127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_double        == 4053.0);
1137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
1147ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_string    == false);
1157ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(strcmp(alltypes.opt_string, "4054") == 0);
1167ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_bytes     == false);
1177ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_bytes.size == 4);
1187ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(memcmp(alltypes.opt_bytes.bytes, "4055", 4) == 0);
1197ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_submsg    == false);
1207ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(strcmp(alltypes.opt_submsg.substuff1, "1") == 0);
1217ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_submsg.substuff2 == 2);
1227ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_submsg.substuff3 == 3);
1237ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_enum     == false);
1247ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_enum == MyEnum_Second);
1257ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_emptymsg == false);
1267ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    }
1277ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    else
1287ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    {
1297ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        /* Expect filled-in values */
1307ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_int32     == true);
1317ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_int32         == 3041);
1327ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_int64     == true);
1337ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_int64         == 3042);
1347ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_uint32    == true);
1357ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_uint32        == 3043);
1367ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_uint64    == true);
1377ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_uint64        == 3044);
1387ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_sint32    == true);
1397ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_sint32        == 3045);
1407ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_sint64    == true);
1417ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_sint64        == 3046);
1427ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_bool      == true);
1437ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_bool          == true);
1447ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
1457ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_fixed32   == true);
1467ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_fixed32       == 3048);
1477ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_sfixed32  == true);
1487ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_sfixed32      == 3049);
1497ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_float     == true);
1507ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_float         == 3050.0f);
1517ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
1527ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_fixed64   == true);
1537ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_fixed64       == 3051);
1547ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_sfixed64  == true);
1557ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_sfixed64      == 3052);
1567ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_double    == true);
1577ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_double        == 3053.0);
1587ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
1597ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_string    == true);
1607ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(strcmp(alltypes.opt_string, "3054") == 0);
1617ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_bytes     == true);
1627ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_bytes.size == 4);
1637ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(memcmp(alltypes.opt_bytes.bytes, "3055", 4) == 0);
1647ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_submsg    == true);
1657ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(strcmp(alltypes.opt_submsg.substuff1, "3056") == 0);
1667ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_submsg.substuff2 == 3056);
1677ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_submsg.substuff3 == 3);
1687ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_enum      == true);
1697ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.opt_enum == MyEnum_Truth);
1707ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        TEST(alltypes.has_opt_emptymsg  == true);
1717ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    }
1727ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
1737ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_limits.int32_min  == INT32_MIN);
1747ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_limits.int32_max  == INT32_MAX);
1757ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_limits.uint32_min == 0);
1767ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_limits.uint32_max == UINT32_MAX);
1777ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_limits.int64_min  == INT64_MIN);
1787ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_limits.int64_max  == INT64_MAX);
1797ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_limits.uint64_min == 0);
1807ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_limits.uint64_max == UINT64_MAX);
1817ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_limits.enum_min   == HugeEnum_Negative);
1827ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.req_limits.enum_max   == HugeEnum_Positive);
1837ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
1847ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    TEST(alltypes.end == 1099);
1857ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
1867ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    return true;
1877ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen}
1887ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
1897ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohenint main(int argc, char **argv)
1907ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen{
1917ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    uint8_t buffer[1024];
1927ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    size_t count;
1937ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    pb_istream_t stream;
1947ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
1957ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    /* Whether to expect the optional values or the default values. */
1967ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    int mode = (argc > 1) ? atoi(argv[1]) : 0;
1977ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
1987ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    /* Read the data into buffer */
1997ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    SET_BINARY_MODE(stdin);
2007ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    count = fread(buffer, 1, sizeof(buffer), stdin);
2017ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
2027ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    /* Construct a pb_istream_t for reading from the buffer */
2037ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    stream = pb_istream_from_buffer(buffer, count);
2047ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen
2057ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    /* Decode and print out the stuff */
2067ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    if (!check_alltypes(&stream, mode))
2077ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    {
2087ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        printf("Parsing failed: %s\n", PB_GET_ERROR(&stream));
2097ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        return 1;
2107ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    } else {
2117ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen        return 0;
2127ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen    }
2137ef855e462b9a18b7d330e4b40f350164a6ad9daEtan Cohen}
214