# Test correct relative paths and creation of intermediate directories
# when input files are part of a multi-level directory structure:
#
# user@host:.../build$ nanopb_generator -D . -I ../proto ../proto/simple.proto
# user@host:.../build$ nanopb_generator -D . -I ../proto ../proto/protobuf/any.proto
#
# should result in:
#
# |-- build
# |   |-- protobuf
# |   |   +-- any.pb.c
# |   |   +-- any.pb.h
# |   +-- simple.pb.c
# |   +-- simple.pb.h
# +-- proto
#     |-- protobuf
#     |   +-- any.proto
#     +-- simple.proto


Import('env')
import os, sys

# As of 0.4.2, SCons rules still go through protoc that handles paths correctly
# by itself. To test direct nanopb_generator usage we invoke it manually here.
env.Command(["build/protobuf/any.pb.h", "build/simple.pb.h", "build/protobuf/any.pb.c", "build/simple.pb.c",],
            ["proto/protobuf/any.proto", "proto/simple.proto"],
[
    Delete("build/generator_relative_paths/build"),
    Mkdir("build/generator_relative_paths/build"),
    env['NANOPB_GENERATOR'] + " -Dbuild/generator_relative_paths/build -Ibuild/generator_relative_paths/proto $SOURCES"
])

env.Match("simple_pb_h_ok", ["build/simple.pb.h", "simple.expected"])
env.Match("simple_pb_c_ok", ["build/simple.pb.c", "simple.expected"])
env.Match("any_pb_h_ok", ["build/protobuf/any.pb.h", "any.expected"])
env.Match("any_pb_c_ok", ["build/protobuf/any.pb.c", "any.expected"])

# Test when not using -D
env.Command(["test.pb.c", "test.pb.h"], "test.proto",
            env['NANOPB_GENERATOR'] + " test.proto",
            chdir = True)
env.Match("test_pb_h_ok", ["test.pb.h", "test.expected"])
env.Match("test_pb_c_ok", ["test.pb.c", "test.expected"])
