| // 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 "tools/gn/escape.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)); |
| } |