| Index: tools/gn/substitution_writer_unittest.cc
|
| diff --git a/tools/gn/substitution_writer_unittest.cc b/tools/gn/substitution_writer_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..12c96d5fdc6cecc360191456e30750a25305385e
|
| --- /dev/null
|
| +++ b/tools/gn/substitution_writer_unittest.cc
|
| @@ -0,0 +1,152 @@
|
| +// Copyright 2014 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 <sstream>
|
| +
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#include "tools/gn/err.h"
|
| +#include "tools/gn/escape.h"
|
| +#include "tools/gn/substitution_pattern.h"
|
| +#include "tools/gn/substitution_writer.h"
|
| +#include "tools/gn/test_with_scope.h"
|
| +
|
| +TEST(SubstitutionWriter, ApplyPatternToSource) {
|
| + TestWithScope setup;
|
| +
|
| + SubstitutionPattern pattern;
|
| + Err err;
|
| + ASSERT_TRUE(pattern.Parse("{{source_gen_dir}}/{{source_name_part}}.tmp",
|
| + NULL, &err));
|
| +
|
| + SourceFile result = SubstitutionWriter::ApplyPatternToSource(
|
| + setup.settings(), pattern, SourceFile("//foo/bar/myfile.txt"));
|
| + ASSERT_EQ("//out/Debug/gen/foo/bar/myfile.tmp", result.value());
|
| +}
|
| +
|
| +TEST(SubstitutionWriter, ApplyPatternToSourceAsOutputFile) {
|
| + TestWithScope setup;
|
| +
|
| + SubstitutionPattern pattern;
|
| + Err err;
|
| + ASSERT_TRUE(pattern.Parse("{{source_gen_dir}}/{{source_name_part}}.tmp",
|
| + NULL, &err));
|
| +
|
| + OutputFile result = SubstitutionWriter::ApplyPatternToSourceAsOutputFile(
|
| + setup.settings(), pattern, SourceFile("//foo/bar/myfile.txt"));
|
| + ASSERT_EQ("gen/foo/bar/myfile.tmp", result.value());
|
| +}
|
| +
|
| +TEST(SubstutitionWriter, WriteNinjaVariablesForSource) {
|
| + TestWithScope setup;
|
| +
|
| + std::vector<SubstitutionType> types;
|
| + types.push_back(SUBSTITUTION_SOURCE);
|
| + types.push_back(SUBSTITUTION_SOURCE_NAME_PART);
|
| + types.push_back(SUBSTITUTION_SOURCE_DIR);
|
| +
|
| + EscapeOptions options;
|
| + options.mode = ESCAPE_NONE;
|
| +
|
| + std::ostringstream out;
|
| + SubstitutionWriter::WriteNinjaVariablesForSource(
|
| + setup.settings(), SourceFile("//foo/bar/baz.txt"), types, options, out);
|
| +
|
| + // The "source" should be skipped since that will expand to $in which is
|
| + // implicit.
|
| + EXPECT_EQ(
|
| + " source_name_part = baz\n"
|
| + " source_dir = ../../foo/bar\n",
|
| + out.str());
|
| +}
|
| +
|
| +TEST(SubstitutionWriter, WriteWithNinjaVariables) {
|
| + Err err;
|
| + SubstitutionPattern pattern;
|
| + ASSERT_TRUE(pattern.Parse(
|
| + "-i {{source}} --out=bar\"{{source_name_part}}\".o",
|
| + NULL, &err));
|
| + EXPECT_FALSE(err.has_error());
|
| +
|
| + EscapeOptions options;
|
| + options.mode = ESCAPE_NONE;
|
| +
|
| + std::ostringstream out;
|
| + SubstitutionWriter::WriteWithNinjaVariables(pattern, options, out);
|
| +
|
| + EXPECT_EQ(
|
| + "-i ${in} --out=bar\"${source_name_part}\".o",
|
| + out.str());
|
| +}
|
| +
|
| +// Tests in isolation different types of substitutions and that the right
|
| +// things are generated.
|
| +TEST(SubstutitionWriter, Substitutions) {
|
| + TestWithScope setup;
|
| +
|
| + // Call to get substitutions relative to the build dir.
|
| + #define GetRelSubst(str, what) \
|
| + SubstitutionWriter::GetSourceSubstitution( \
|
| + setup.settings(), \
|
| + SourceFile(str), \
|
| + what, \
|
| + SubstitutionWriter::OUTPUT_RELATIVE, \
|
| + setup.settings()->build_settings()->build_dir())
|
| +
|
| + // Call to get absolute directory substitutions.
|
| + #define GetAbsSubst(str, what) \
|
| + SubstitutionWriter::GetSourceSubstitution( \
|
| + setup.settings(), \
|
| + SourceFile(str), \
|
| + what, \
|
| + SubstitutionWriter::OUTPUT_ABSOLUTE, \
|
| + SourceDir())
|
| +
|
| + // Try all possible templates with a normal looking string.
|
| + EXPECT_EQ("../../foo/bar/baz.txt",
|
| + GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE));
|
| + EXPECT_EQ("//foo/bar/baz.txt",
|
| + GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE));
|
| +
|
| + EXPECT_EQ("baz",
|
| + GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_NAME_PART));
|
| + EXPECT_EQ("baz",
|
| + GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_NAME_PART));
|
| +
|
| + EXPECT_EQ("baz.txt",
|
| + GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_FILE_PART));
|
| + EXPECT_EQ("baz.txt",
|
| + GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_FILE_PART));
|
| +
|
| + EXPECT_EQ("../../foo/bar",
|
| + GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_DIR));
|
| + EXPECT_EQ("//foo/bar",
|
| + GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_DIR));
|
| +
|
| + EXPECT_EQ("foo/bar", GetRelSubst("//foo/bar/baz.txt",
|
| + SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR));
|
| + EXPECT_EQ("foo/bar", GetAbsSubst("//foo/bar/baz.txt",
|
| + SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR));
|
| +
|
| + EXPECT_EQ("gen/foo/bar",
|
| + GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_GEN_DIR));
|
| + EXPECT_EQ("//out/Debug/gen/foo/bar",
|
| + GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_GEN_DIR));
|
| +
|
| + EXPECT_EQ("obj/foo/bar",
|
| + GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_OUT_DIR));
|
| + EXPECT_EQ("//out/Debug/obj/foo/bar",
|
| + GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_OUT_DIR));
|
| +
|
| + // Operations on an absolute path.
|
| + EXPECT_EQ("/baz.txt", GetRelSubst("/baz.txt", SUBSTITUTION_SOURCE));
|
| + EXPECT_EQ("/.", GetRelSubst("/baz.txt", SUBSTITUTION_SOURCE_DIR));
|
| + EXPECT_EQ("gen", GetRelSubst("/baz.txt", SUBSTITUTION_SOURCE_GEN_DIR));
|
| + EXPECT_EQ("obj", GetRelSubst("/baz.txt", SUBSTITUTION_SOURCE_OUT_DIR));
|
| +
|
| + EXPECT_EQ(".",
|
| + GetRelSubst("//baz.txt", SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR));
|
| +
|
| + #undef GetAbsSubst
|
| + #undef GetRelSubst
|
| +}
|
|
|