summaryrefslogtreecommitdiffstats
path: root/tests/oneof
diff options
context:
space:
mode:
authorPetteri Aimonen <jpa@git.mail.kapsi.fi>2015-01-27 17:47:25 +0200
committerPetteri Aimonen <jpa@git.mail.kapsi.fi>2015-01-27 17:47:25 +0200
commit25b92c5b4e154130bf0787009046ea60175d28e8 (patch)
tree6f562ae78961010f61d936f805deb14df690c0c1 /tests/oneof
parent5aa8207ab1acf3b614b528b3d84e60d9266d35ae (diff)
Fix generator bug when oneof is first field in a message.
Added test case for the same. Update issue 142 Status: FixedInGit
Diffstat (limited to 'tests/oneof')
-rw-r--r--tests/oneof/decode_oneof.c129
-rw-r--r--tests/oneof/oneof.proto12
2 files changed, 104 insertions, 37 deletions
diff --git a/tests/oneof/decode_oneof.c b/tests/oneof/decode_oneof.c
index e94becc7..83b4702c 100644
--- a/tests/oneof/decode_oneof.c
+++ b/tests/oneof/decode_oneof.c
@@ -7,17 +7,92 @@
#include "test_helpers.h"
#include "unittests.h"
+/* Test the 'OneOfMessage' */
+int test_oneof_1(pb_istream_t *stream, int option)
+{
+ OneOfMessage msg = OneOfMessage_init_zero;
+ int status = 0;
+
+ if (!pb_decode(stream, OneOfMessage_fields, &msg))
+ {
+ printf("Decoding failed: %s\n", PB_GET_ERROR(stream));
+ return 1;
+ }
+
+ /* Check that the basic fields work normally */
+ TEST(msg.prefix == 123);
+ TEST(msg.suffix == 321);
+
+ /* Check that we got the right oneof according to command line */
+ if (option == 1)
+ {
+ TEST(msg.which_values == OneOfMessage_first_tag);
+ TEST(msg.values.first == 999);
+ }
+ else if (option == 2)
+ {
+ TEST(msg.which_values == OneOfMessage_second_tag);
+ TEST(strcmp(msg.values.second, "abcd") == 0);
+ }
+ else if (option == 3)
+ {
+ TEST(msg.which_values == OneOfMessage_third_tag);
+ TEST(msg.values.third.array[0] == 1);
+ TEST(msg.values.third.array[1] == 2);
+ TEST(msg.values.third.array[2] == 3);
+ TEST(msg.values.third.array[3] == 4);
+ TEST(msg.values.third.array[4] == 5);
+ }
+
+ return status;
+}
+
+
+/* Test the 'PlainOneOfMessage' */
+int test_oneof_2(pb_istream_t *stream, int option)
+{
+ PlainOneOfMessage msg = PlainOneOfMessage_init_zero;
+ int status = 0;
+
+ if (!pb_decode(stream, PlainOneOfMessage_fields, &msg))
+ {
+ printf("Decoding failed: %s\n", PB_GET_ERROR(stream));
+ return 1;
+ }
+
+ /* Check that we got the right oneof according to command line */
+ if (option == 1)
+ {
+ TEST(msg.which_values == OneOfMessage_first_tag);
+ TEST(msg.values.first == 999);
+ }
+ else if (option == 2)
+ {
+ TEST(msg.which_values == OneOfMessage_second_tag);
+ TEST(strcmp(msg.values.second, "abcd") == 0);
+ }
+ else if (option == 3)
+ {
+ TEST(msg.which_values == OneOfMessage_third_tag);
+ TEST(msg.values.third.array[0] == 1);
+ TEST(msg.values.third.array[1] == 2);
+ TEST(msg.values.third.array[2] == 3);
+ TEST(msg.values.third.array[3] == 4);
+ TEST(msg.values.third.array[4] == 5);
+ }
+
+ return status;
+}
+
int main(int argc, char **argv)
{
uint8_t buffer[OneOfMessage_size];
- OneOfMessage msg = OneOfMessage_init_zero;
- pb_istream_t stream;
size_t count;
int option;
if (argc != 2)
{
- fprintf(stderr, "Usage: encode_oneof [number]\n");
+ fprintf(stderr, "Usage: decode_oneof [number]\n");
return 1;
}
option = atoi(argv[1]);
@@ -31,42 +106,22 @@ int main(int argc, char **argv)
return 1;
}
- stream = pb_istream_from_buffer(buffer, count);
-
- if (!pb_decode(&stream, OneOfMessage_fields, &msg))
- {
- printf("Decoding failed: %s\n", PB_GET_ERROR(&stream));
- return 1;
- }
-
{
int status = 0;
+ pb_istream_t stream;
+
+ stream = pb_istream_from_buffer(buffer, count);
+ status = test_oneof_1(&stream, option);
+
+ if (status != 0)
+ return status;
- /* Check that the basic fields work normally */
- TEST(msg.prefix == 123);
- TEST(msg.suffix == 321);
-
- /* Check that we got the right oneof according to command line */
- if (option == 1)
- {
- TEST(msg.which_values == OneOfMessage_first_tag);
- TEST(msg.values.first == 999);
- }
- else if (option == 2)
- {
- TEST(msg.which_values == OneOfMessage_second_tag);
- TEST(strcmp(msg.values.second, "abcd") == 0);
- }
- else if (option == 3)
- {
- TEST(msg.which_values == OneOfMessage_third_tag);
- TEST(msg.values.third.array[0] == 1);
- TEST(msg.values.third.array[1] == 2);
- TEST(msg.values.third.array[2] == 3);
- TEST(msg.values.third.array[3] == 4);
- TEST(msg.values.third.array[4] == 5);
- }
-
- return status;
+ stream = pb_istream_from_buffer(buffer, count);
+ status = test_oneof_2(&stream, option);
+
+ if (status != 0)
+ return status;
}
+
+ return 0;
} \ No newline at end of file
diff --git a/tests/oneof/oneof.proto b/tests/oneof/oneof.proto
index a89ef131..00f1ceca 100644
--- a/tests/oneof/oneof.proto
+++ b/tests/oneof/oneof.proto
@@ -5,6 +5,7 @@ message SubMessage
repeated int32 array = 1 [(nanopb).max_count = 8];
}
+/* Oneof in a message with other fields */
message OneOfMessage
{
required int32 prefix = 1;
@@ -16,3 +17,14 @@ message OneOfMessage
}
required int32 suffix = 99;
}
+
+/* Oneof in a message by itself */
+message PlainOneOfMessage
+{
+ oneof values
+ {
+ int32 first = 5;
+ string second = 6 [(nanopb).max_size = 8];
+ SubMessage third = 7;
+ }
+} \ No newline at end of file