# Check that alltypes test case works also when the .proto file defines
# a package name using the (nanopb_fileopt).package option.

Import("env")

def set_pkgname(src, dst, pkgname):
    data = open(str(src)).read()
    placeholder = '// package name placeholder'
    assert placeholder in data
    data = data.replace(placeholder, 'package foopkg;\n' +
                                     'import "nanopb.proto";\n' +
                                     'option (nanopb_fileopt).package="%s";' % pkgname)
    open(str(dst), 'w').write(data)

# Build a modified alltypes.proto
env.Command("alltypes.proto", "#alltypes/alltypes.proto",
            lambda target, source, env: set_pkgname(source[0], target[0], 'test.package'))
env.Command("alltypes.options", "#alltypes/alltypes.options", Copy("$TARGET", "$SOURCE"))
env.NanopbProto(["alltypes", "alltypes.options"])

# Build a modified encode_alltypes.c
def modify_c(target, source, env):
    '''Add package name to type names in .c file.'''

    data = open(str(source[0]), 'r').read()
    
    type_names = ['AllTypes', 'MyEnum', 'HugeEnum']
    for name in type_names:
        data = data.replace(name, 'test_package_' + name)
    
    open(str(target[0]), 'w').write(data)
    return 0
env.Command("encode_alltypes.c", "#alltypes/encode_alltypes.c", modify_c)

# Encode and compare results to original alltypes testcase
enc = env.Program(["encode_alltypes.c", "alltypes.pb.c", "$COMMON/pb_encode.o", "$COMMON/pb_common.o"])
refdec = "$BUILD/alltypes/decode_alltypes$PROGSUFFIX"
env.RunTest(enc)
env.Compare(["encode_alltypes.output", "$BUILD/alltypes/encode_alltypes.output"])

