| // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "gn/escape.h" |
| #include "gn/string_output_buffer.h" |
| #include "util/test/test.h" |
| |
| TEST(Escape, Ninja) { |
| EscapeOptions opts; |
| opts.mode = ESCAPE_NINJA; |
| std::string result = EscapeString("asdf: \"$\\bar", opts, nullptr); |
| EXPECT_EQ("asdf$:$ \"$$\\bar", result); |
| } |
| |
| TEST(Escape, Depfile) { |
| EscapeOptions opts; |
| opts.mode = ESCAPE_DEPFILE; |
| std::string result = EscapeString("asdf:$ \\#*[|]bar", opts, nullptr); |
| EXPECT_EQ("asdf:$$\\ \\\\\\#\\*\\[\\|\\]bar", result); |
| } |
| |
| TEST(Escape, WindowsCommand) { |
| EscapeOptions opts; |
| opts.mode = ESCAPE_NINJA_COMMAND; |
| opts.platform = ESCAPE_PLATFORM_WIN; |
| |
| // Regular string is passed, even if it has backslashes. |
| EXPECT_EQ("foo\\bar", EscapeString("foo\\bar", opts, nullptr)); |
| |
| // Spaces means the string is quoted, normal backslahes untouched. |
| bool needs_quoting = false; |
| EXPECT_EQ("\"foo\\$ bar\"", EscapeString("foo\\ bar", opts, &needs_quoting)); |
| EXPECT_TRUE(needs_quoting); |
| |
| // Inhibit quoting. |
| needs_quoting = false; |
| opts.inhibit_quoting = true; |
| EXPECT_EQ("foo\\$ bar", EscapeString("foo\\ bar", opts, &needs_quoting)); |
| EXPECT_TRUE(needs_quoting); |
| opts.inhibit_quoting = false; |
| |
| // Backslashes at the end of the string get escaped. |
| EXPECT_EQ("\"foo$ bar\\\\\\\\\"", EscapeString("foo bar\\\\", opts, nullptr)); |
| |
| // Backslashes preceding quotes are escaped, and the quote is escaped. |
| EXPECT_EQ("\"foo\\\\\\\"$ bar\"", EscapeString("foo\\\" bar", opts, nullptr)); |
| } |
| |
| TEST(Escape, PosixCommand) { |
| EscapeOptions opts; |
| opts.mode = ESCAPE_NINJA_COMMAND; |
| opts.platform = ESCAPE_PLATFORM_POSIX; |
| |
| // : and $ ninja escaped with $. Then Shell-escape backslashes and quotes. |
| EXPECT_EQ("a$:\\$ \\\"\\$$\\\\b", EscapeString("a: \"$\\b", opts, nullptr)); |
| |
| // Some more generic shell chars. |
| EXPECT_EQ("a_\\;\\<\\*b", EscapeString("a_;<*b", opts, nullptr)); |
| |
| // Curly braces must be escaped to avoid brace expansion on systems using |
| // bash as default shell.. |
| EXPECT_EQ("\\{a,b\\}\\{c,d\\}", EscapeString("{a,b}{c,d}", opts, nullptr)); |
| } |
| |
| TEST(Escape, NinjaPreformatted) { |
| EscapeOptions opts; |
| opts.mode = ESCAPE_NINJA_PREFORMATTED_COMMAND; |
| |
| // Only $ is escaped. |
| EXPECT_EQ("a: \"$$\\b<;", EscapeString("a: \"$\\b<;", opts, nullptr)); |
| } |
| |
| TEST(Escape, Space) { |
| EscapeOptions opts; |
| opts.mode = ESCAPE_SPACE; |
| |
| // ' ' is escaped. |
| EXPECT_EQ("-VERSION=\"libsrtp2\\ 2.1.0-pre\"", |
| EscapeString("-VERSION=\"libsrtp2 2.1.0-pre\"", opts, nullptr)); |
| } |
| |
| TEST(EscapeJSONString, NinjaPreformatted) { |
| EscapeOptions opts; |
| opts.mode = ESCAPE_NINJA_PREFORMATTED_COMMAND; |
| opts.inhibit_quoting = true; |
| |
| StringOutputBuffer buffer; |
| std::ostream out(&buffer); |
| |
| EscapeJSONStringToStream(out, "foo\\\" bar", opts); |
| EXPECT_EQ("foo\\\\\\\" bar", buffer.str()); |
| |
| StringOutputBuffer buffer1; |
| std::ostream out1(&buffer1); |
| EscapeJSONStringToStream(out1, "foo bar\\\\", opts); |
| EXPECT_EQ("foo bar\\\\\\\\", buffer1.str()); |
| |
| StringOutputBuffer buffer2; |
| std::ostream out2(&buffer2); |
| EscapeJSONStringToStream(out2, "a: \"$\\b", opts); |
| EXPECT_EQ("a: \\\"$$\\\\b", buffer2.str()); |
| } |
| |
| TEST(Escape, CompilationDatabase) { |
| EscapeOptions opts; |
| opts.mode = ESCAPE_COMPILATION_DATABASE; |
| |
| // The only special characters are '"' and '\'. |
| std::string result = EscapeString("asdf:$ \\#*[|]bar", opts, nullptr); |
| EXPECT_EQ("\"asdf:$ \\\\#*[|]bar\"", result); |
| } |