diff options
Diffstat (limited to 'src/google/protobuf/compiler/command_line_interface_unittest.cc')
-rw-r--r-- | src/google/protobuf/compiler/command_line_interface_unittest.cc | 71 |
1 files changed, 70 insertions, 1 deletions
diff --git a/src/google/protobuf/compiler/command_line_interface_unittest.cc b/src/google/protobuf/compiler/command_line_interface_unittest.cc index 1b1458d..0964446 100644 --- a/src/google/protobuf/compiler/command_line_interface_unittest.cc +++ b/src/google/protobuf/compiler/command_line_interface_unittest.cc @@ -51,6 +51,7 @@ class CommandLineInterfaceTest : public testing::Test { // Methods to set up the test (called before Run()). class MockCodeGenerator; + class NullCodeGenerator; // Registers a MockCodeGenerator with the given name. MockCodeGenerator* RegisterGenerator(const string& generator_name, @@ -63,6 +64,10 @@ class CommandLineInterfaceTest : public testing::Test { const string& filename, const string& help_text); + // Registers a CodeGenerator which will not actually generate anything, + // but records the parameter passed to the generator. + NullCodeGenerator* RegisterNullGenerator(const string& flag_name); + // Create a temp file within temp_directory_ with the given name. // The containing directory is also created if necessary. void CreateTempFile(const string& name, const string& contents); @@ -122,7 +127,7 @@ class CommandLineInterfaceTest : public testing::Test { string error_text_; // Pointers which need to be deleted later. - vector<MockCodeGenerator*> mock_generators_to_delete_; + vector<CodeGenerator*> mock_generators_to_delete_; }; // A mock CodeGenerator which outputs information about the context in which @@ -159,6 +164,25 @@ class CommandLineInterfaceTest::MockCodeGenerator : public CodeGenerator { bool expect_write_error_; }; +class CommandLineInterfaceTest::NullCodeGenerator : public CodeGenerator { + public: + NullCodeGenerator() : called_(false) {} + ~NullCodeGenerator() {} + + mutable bool called_; + mutable string parameter_; + + // implements CodeGenerator ---------------------------------------- + bool Generate(const FileDescriptor* file, + const string& parameter, + OutputDirectory* output_directory, + string* error) const { + called_ = true; + parameter_ = parameter; + return true; + } +}; + // =================================================================== void CommandLineInterfaceTest::SetUp() { @@ -239,6 +263,15 @@ CommandLineInterfaceTest::RegisterErrorGenerator( return generator; } +CommandLineInterfaceTest::NullCodeGenerator* +CommandLineInterfaceTest::RegisterNullGenerator( + const string& flag_name) { + NullCodeGenerator* generator = new NullCodeGenerator; + mock_generators_to_delete_.push_back(generator); + cli_.RegisterGenerator(flag_name, generator, ""); + return generator; +} + void CommandLineInterfaceTest::CreateTempFile( const string& name, const string& contents) { @@ -424,6 +457,42 @@ TEST_F(CommandLineInterfaceTest, GeneratorParameters) { "foo.proto", "Foo", "output.test"); } +#if defined(_WIN32) || defined(__CYGWIN__) + +TEST_F(CommandLineInterfaceTest, WindowsOutputPath) { + // Test that the output path can be a Windows-style path. + + NullCodeGenerator* generator = RegisterNullGenerator("--test_out"); + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n"); + + Run("protocol_compiler --test_out=C:\\ " + "--proto_path=$tmpdir foo.proto"); + + ExpectNoErrors(); + EXPECT_TRUE(generator->called_); + EXPECT_EQ("", generator->parameter_); +} + +TEST_F(CommandLineInterfaceTest, WindowsOutputPathAndParameter) { + // Test that we can have a windows-style output path and a parameter. + + NullCodeGenerator* generator = RegisterNullGenerator("--test_out"); + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n"); + + Run("protocol_compiler --test_out=bar:C:\\ " + "--proto_path=$tmpdir foo.proto"); + + ExpectNoErrors(); + EXPECT_TRUE(generator->called_); + EXPECT_EQ("bar", generator->parameter_); +} + +#endif // defined(_WIN32) || defined(__CYGWIN__) + TEST_F(CommandLineInterfaceTest, PathLookup) { // Test that specifying multiple directories in the proto search path works. |