# Encode the AllTypes message using pointers for all fields, and verify the
# output against the normal AllTypes test case.

Import("env", "malloc_env")

c = Copy("$TARGET", "$SOURCE")
env.Command("alltypes.proto", "#alltypes/alltypes.proto", c)

env.NanopbProto(["alltypes", "alltypes.options"])
enc = malloc_env.Program(["encode_alltypes_pointer.c",
                          "alltypes.pb.c",
                          "$COMMON/pb_encode_with_malloc.o",
                          "$COMMON/pb_common_with_malloc.o",
                          "$COMMON/malloc_wrappers.o"])
dec = malloc_env.Program(["decode_alltypes_pointer.c",
                          "alltypes.pb.c",
                          "$COMMON/pb_decode_with_malloc.o",
                          "$COMMON/pb_common_with_malloc.o",
                          "$COMMON/malloc_wrappers.o"])

# Encode and compare results to non-pointer alltypes test case
env.RunTest(enc)
env.Compare(["encode_alltypes_pointer.output", "$BUILD/alltypes/encode_alltypes.output"])

# Decode (under valgrind if available)
kwargs = {}
if env.get("VALGRIND"):
    kwargs['COMMAND'] = env['VALGRIND']
    kwargs['ARGS'] = ["-q", "--error-exitcode=99", dec[0].abspath]

env.RunTest("decode_alltypes.output", [dec, "encode_alltypes_pointer.output"], **kwargs)

# Do the same thing with the optional fields present
env.RunTest("optionals.output", enc, ARGS = ['1'])
env.Compare(["optionals.output", "$BUILD/alltypes/optionals.output"])

kwargs['ARGS'] = kwargs.get('ARGS', []) + ['1']
env.RunTest("optionals.decout", [dec, "optionals.output"], **kwargs)

