1d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// found in the LICENSE file. 4d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 5d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include <sstream> 6d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 7d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "tools/gn/output_file.h" 9d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/path_output.h" 10d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/source_dir.h" 11d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/source_file.h" 12d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 13d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochTEST(PathOutput, Basic) { 14d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch SourceDir build_dir("//out/Debug/"); 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PathOutput writer(build_dir, ESCAPE_NONE); 16d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Normal source-root path. 18d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 19d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteFile(out, SourceFile("//foo/bar.cc")); 20d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("../../foo/bar.cc", out.str()); 21d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 22d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 23d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // File in the root dir. 24d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 25d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteFile(out, SourceFile("//foo.cc")); 26d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("../../foo.cc", out.str()); 27d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Files in the output dir. 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::ostringstream out; 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) writer.WriteFile(out, SourceFile("//out/Debug/foo.cc")); 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) out << " "; 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) writer.WriteFile(out, SourceFile("//out/Debug/bar/baz.cc")); 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("foo.cc bar/baz.cc", out.str()); 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 36d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#if defined(OS_WIN) 37d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 38d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // System-absolute path. 39d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 40d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteFile(out, SourceFile("/C:/foo/bar.cc")); 41d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("C:/foo/bar.cc", out.str()); 42d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 43d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#else 44d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 45d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // System-absolute path. 46d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 47d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteFile(out, SourceFile("/foo/bar.cc")); 48d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("/foo/bar.cc", out.str()); 49d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 50d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#endif 51d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 52d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 53d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Same as basic but the output dir is the root. 54d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochTEST(PathOutput, BasicInRoot) { 55d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch SourceDir build_dir("//"); 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PathOutput writer(build_dir, ESCAPE_NONE); 57d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 58d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Normal source-root path. 59d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 60d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteFile(out, SourceFile("//foo/bar.cc")); 61d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("foo/bar.cc", out.str()); 62d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 63d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 64d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // File in the root dir. 65d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 66d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteFile(out, SourceFile("//foo.cc")); 67d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("foo.cc", out.str()); 68d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 69d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 70d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 71d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochTEST(PathOutput, NinjaEscaping) { 72d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch SourceDir build_dir("//out/Debug/"); 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PathOutput writer(build_dir, ESCAPE_NINJA); 74d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 75d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Spaces and $ in filenames. 76d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 77d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteFile(out, SourceFile("//foo/foo bar$.cc")); 78d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("../../foo/foo$ bar$$.cc", out.str()); 79d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 80d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 81d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Not other weird stuff 82d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 83d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteFile(out, SourceFile("//foo/\"foo\\bar\".cc")); 84d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("../../foo/\"foo\\bar\".cc", out.str()); 85d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 86d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 87d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST(PathOutput, NinjaForkEscaping) { 89d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch SourceDir build_dir("//out/Debug/"); 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PathOutput writer(build_dir, ESCAPE_NINJA_COMMAND); 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Spaces in filenames should get quoted on Windows. 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) writer.set_escape_platform(ESCAPE_PLATFORM_WIN); 94d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 95d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 96d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteFile(out, SourceFile("//foo/foo bar.cc")); 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("\"../../foo/foo$ bar.cc\"", out.str()); 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Spaces in filenames should get escaped on Posix. 10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) writer.set_escape_platform(ESCAPE_PLATFORM_POSIX); 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::ostringstream out; 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) writer.WriteFile(out, SourceFile("//foo/foo bar.cc")); 10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("../../foo/foo\\$ bar.cc", out.str()); 10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Quotes should get blackslash-escaped on Windows and Posix. 10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) writer.set_escape_platform(ESCAPE_PLATFORM_WIN); 11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::ostringstream out; 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) writer.WriteFile(out, SourceFile("//foo/\"foobar\".cc")); 11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Our Windows code currently quotes the whole thing in this case for 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // code simplicity, even though it's strictly unnecessary. This might 11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // change in the future. 11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("\"../../foo/\\\"foobar\\\".cc\"", out.str()); 117d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) writer.set_escape_platform(ESCAPE_PLATFORM_POSIX); 119d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 120d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 121d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteFile(out, SourceFile("//foo/\"foobar\".cc")); 122d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("../../foo/\\\"foobar\\\".cc", out.str()); 123d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Backslashes should get escaped on non-Windows and preserved on Windows. 12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) writer.set_escape_platform(ESCAPE_PLATFORM_WIN); 128d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 129d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 130d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteFile(out, SourceFile("//foo\\bar.cc")); 131d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("../../foo\\bar.cc", out.str()); 132d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) writer.set_escape_platform(ESCAPE_PLATFORM_POSIX); 134d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 135d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) writer.WriteFile(out, SourceFile("//foo\\bar.cc")); 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("../../foo\\\\bar.cc", out.str()); 138d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 139d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 140d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 141d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochTEST(PathOutput, InhibitQuoting) { 142d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch SourceDir build_dir("//out/Debug/"); 14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PathOutput writer(build_dir, ESCAPE_NINJA_COMMAND); 144d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.set_inhibit_quoting(true); 14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) writer.set_escape_platform(ESCAPE_PLATFORM_WIN); 147d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 148d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // We should get unescaped spaces in the output with no quotes. 149d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 150d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteFile(out, SourceFile("//foo/foo bar.cc")); 15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("../../foo/foo$ bar.cc", out.str()); 15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) writer.set_escape_platform(ESCAPE_PLATFORM_POSIX); 15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { 15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Escapes the space. 15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::ostringstream out; 15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) writer.WriteFile(out, SourceFile("//foo/foo bar.cc")); 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ("../../foo/foo\\$ bar.cc", out.str()); 160d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 161d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 162d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 163d3868032626d59662ff73b372b5d584c1d144c53Ben MurdochTEST(PathOutput, WriteDir) { 164d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 165d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch SourceDir build_dir("//out/Debug/"); 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PathOutput writer(build_dir, ESCAPE_NINJA); 167d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 168d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 169d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteDir(out, SourceDir("//foo/bar/"), 170d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch PathOutput::DIR_INCLUDE_LAST_SLASH); 171d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("../../foo/bar/", out.str()); 172d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 173d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 174d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 175d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteDir(out, SourceDir("//foo/bar/"), 176d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch PathOutput::DIR_NO_LAST_SLASH); 177d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("../../foo/bar", out.str()); 178d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 179d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 180d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Output source root dir. 181d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 182d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 183d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteDir(out, SourceDir("//"), 184d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch PathOutput::DIR_INCLUDE_LAST_SLASH); 185d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("../../", out.str()); 186d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 187d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 188d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 189d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteDir(out, SourceDir("//"), 190d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch PathOutput::DIR_NO_LAST_SLASH); 191d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("../..", out.str()); 192d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 193d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 194d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Output system root dir. 195d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 196d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 197d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteDir(out, SourceDir("/"), 198d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch PathOutput::DIR_INCLUDE_LAST_SLASH); 199d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("/", out.str()); 200d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 201d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 202d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 203d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch writer.WriteDir(out, SourceDir("/"), 2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PathOutput::DIR_INCLUDE_LAST_SLASH); 205d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("/", out.str()); 206d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::ostringstream out; 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) writer.WriteDir(out, SourceDir("/"), 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PathOutput::DIR_NO_LAST_SLASH); 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("/.", out.str()); 2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Output inside current dir. 2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::ostringstream out; 2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) writer.WriteDir(out, SourceDir("//out/Debug/"), 2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PathOutput::DIR_INCLUDE_LAST_SLASH); 2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("./", out.str()); 2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::ostringstream out; 2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) writer.WriteDir(out, SourceDir("//out/Debug/"), 2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PathOutput::DIR_NO_LAST_SLASH); 2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(".", out.str()); 2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::ostringstream out; 2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) writer.WriteDir(out, SourceDir("//out/Debug/foo/"), 2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PathOutput::DIR_INCLUDE_LAST_SLASH); 2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("foo/", out.str()); 2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { 2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::ostringstream out; 2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) writer.WriteDir(out, SourceDir("//out/Debug/foo/"), 2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PathOutput::DIR_NO_LAST_SLASH); 2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("foo", out.str()); 2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // WriteDir using an OutputFile. 2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { 2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::ostringstream out; 2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) writer.WriteDir(out, OutputFile("foo/"), 2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PathOutput::DIR_INCLUDE_LAST_SLASH); 2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("foo/", out.str()); 2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { 2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::ostringstream out; 2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) writer.WriteDir(out, OutputFile("foo/"), 2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PathOutput::DIR_NO_LAST_SLASH); 2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("foo", out.str()); 2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { 2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::ostringstream out; 2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) writer.WriteDir(out, OutputFile(), 2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PathOutput::DIR_INCLUDE_LAST_SLASH); 2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("", out.str()); 2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 259d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 260d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 261d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Empty build dir writer. 26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) PathOutput root_writer(SourceDir("//"), ESCAPE_NINJA); 263d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 264d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 265d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch root_writer.WriteDir(out, SourceDir("//"), 266d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch PathOutput::DIR_INCLUDE_LAST_SLASH); 267d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ("./", out.str()); 268d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 269d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch { 270d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::ostringstream out; 271d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch root_writer.WriteDir(out, SourceDir("//"), 272d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch PathOutput::DIR_NO_LAST_SLASH); 273d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch EXPECT_EQ(".", out.str()); 274d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 275d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 276d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch} 277