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