| // Copyright 2020 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/ninja_target_command_util.h" |
| |
| #include <algorithm> |
| #include <sstream> |
| |
| #include "util/build_config.h" |
| #include "util/test/test.h" |
| |
| namespace { |
| |
| // Helper function that uses a "Writer" to format a list of strings and return |
| // the generated output as a string. |
| template <typename Writer, typename Item> |
| std::string FormatWithWriter(Writer writer, std::vector<Item> items) { |
| std::ostringstream out; |
| for (const Item& item : items) { |
| writer(item, out); |
| } |
| return out.str(); |
| } |
| |
| // Helper function running to test "Writer" by formatting N "Items" and |
| // comparing the resulting string to an expected output. |
| template <typename Writer, typename Item> |
| void TestWriter(Writer writer, |
| std::string expected, |
| std::initializer_list<Item> items) { |
| std::string formatted = |
| FormatWithWriter(writer, std::vector<Item>(std::move(items))); |
| |
| // Manually implement the check and the formatting of the error message to |
| // see the difference in the error message (by default the error message |
| // would just be "formatted == expected"). |
| if (formatted != expected) { |
| std::ostringstream stream; |
| stream << '"' << expected << "\" == \"" << formatted << '"'; |
| std::string message = stream.str(); |
| |
| ::testing::TestResult result(false, message.c_str()); |
| ::testing::AssertHelper(__FILE__, __LINE__, result) = ::testing::Message(); |
| } |
| } |
| |
| } // anonymous namespace |
| |
| TEST(NinjaTargetCommandUtil, DefineWriter) { |
| TestWriter(DefineWriter(), |
| // Escaping is different between Windows and Posix. |
| #if defined(OS_WIN) |
| " -DFOO -DBAR=1 \"-DBAZ=\\\"Baz\\\"\"", |
| #else |
| " -DFOO -DBAR=1 -DBAZ=\\\"Baz\\\"", |
| #endif |
| {"FOO", "BAR=1", "BAZ=\"Baz\""}); |
| |
| TestWriter(DefineWriter(ESCAPE_COMPILATION_DATABASE), |
| // Escaping is different between Windows and Posix. |
| " -DFOO -DBAR=1 \"-DBAZ=\\\"Baz\\\"\"", |
| {"FOO", "BAR=1", "BAZ=\"Baz\""}); |
| } |
| |
| TEST(NinjaTargetCommandUtil, FrameworkDirsWriter) { |
| PathOutput ninja_path_output(SourceDir("//out"), "", ESCAPE_NINJA_COMMAND); |
| TestWriter(FrameworkDirsWriter(ninja_path_output, "-F"), |
| // Escaping is different between Windows and Posix. |
| #if defined(OS_WIN) |
| " -F. \"-FPath$ With$ Spaces\"", |
| #else |
| " -F. -FPath\\$ With\\$ Spaces", |
| #endif |
| {SourceDir("//out"), SourceDir("//out/Path With Spaces")}); |
| |
| PathOutput space_path_output(SourceDir("//out"), "", ESCAPE_SPACE); |
| TestWriter(FrameworkDirsWriter(space_path_output, "-F"), |
| " -F. -FPath\\ With\\ Spaces", |
| {SourceDir("//out"), SourceDir("//out/Path With Spaces")}); |
| } |
| |
| TEST(NinjaTargetCommandUtil, FrameworksWriter) { |
| TestWriter(FrameworksWriter("-framework "), |
| // Escaping is different between Windows and Posix. |
| #if defined(OS_WIN) |
| " -framework Foundation -framework \"Name$ With$ Spaces\"", |
| #else |
| " -framework Foundation -framework Name\\$ With\\$ Spaces", |
| #endif |
| {"Foundation.framework", "Name With Spaces.framework"}); |
| |
| TestWriter(FrameworksWriter(ESCAPE_SPACE, "-framework "), |
| " -framework Foundation -framework Name\\ With\\ Spaces", |
| {"Foundation.framework", "Name With Spaces.framework"}); |
| } |