OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include <sstream> |
| 6 |
| 7 #include "testing/gtest/include/gtest/gtest.h" |
| 8 #include "tools/gn/err.h" |
| 9 #include "tools/gn/escape.h" |
| 10 #include "tools/gn/substitution_pattern.h" |
| 11 #include "tools/gn/substitution_writer.h" |
| 12 #include "tools/gn/test_with_scope.h" |
| 13 |
| 14 TEST(SubstitutionWriter, ApplyPatternToSource) { |
| 15 TestWithScope setup; |
| 16 |
| 17 SubstitutionPattern pattern; |
| 18 Err err; |
| 19 ASSERT_TRUE(pattern.Parse("{{source_gen_dir}}/{{source_name_part}}.tmp", |
| 20 NULL, &err)); |
| 21 |
| 22 SourceFile result = SubstitutionWriter::ApplyPatternToSource( |
| 23 setup.settings(), pattern, SourceFile("//foo/bar/myfile.txt")); |
| 24 ASSERT_EQ("//out/Debug/gen/foo/bar/myfile.tmp", result.value()); |
| 25 } |
| 26 |
| 27 TEST(SubstitutionWriter, ApplyPatternToSourceAsOutputFile) { |
| 28 TestWithScope setup; |
| 29 |
| 30 SubstitutionPattern pattern; |
| 31 Err err; |
| 32 ASSERT_TRUE(pattern.Parse("{{source_gen_dir}}/{{source_name_part}}.tmp", |
| 33 NULL, &err)); |
| 34 |
| 35 OutputFile result = SubstitutionWriter::ApplyPatternToSourceAsOutputFile( |
| 36 setup.settings(), pattern, SourceFile("//foo/bar/myfile.txt")); |
| 37 ASSERT_EQ("gen/foo/bar/myfile.tmp", result.value()); |
| 38 } |
| 39 |
| 40 TEST(SubstutitionWriter, WriteNinjaVariablesForSource) { |
| 41 TestWithScope setup; |
| 42 |
| 43 std::vector<SubstitutionType> types; |
| 44 types.push_back(SUBSTITUTION_SOURCE); |
| 45 types.push_back(SUBSTITUTION_SOURCE_NAME_PART); |
| 46 types.push_back(SUBSTITUTION_SOURCE_DIR); |
| 47 |
| 48 EscapeOptions options; |
| 49 options.mode = ESCAPE_NONE; |
| 50 |
| 51 std::ostringstream out; |
| 52 SubstitutionWriter::WriteNinjaVariablesForSource( |
| 53 setup.settings(), SourceFile("//foo/bar/baz.txt"), types, options, out); |
| 54 |
| 55 // The "source" should be skipped since that will expand to $in which is |
| 56 // implicit. |
| 57 EXPECT_EQ( |
| 58 " source_name_part = baz\n" |
| 59 " source_dir = ../../foo/bar\n", |
| 60 out.str()); |
| 61 } |
| 62 |
| 63 TEST(SubstitutionWriter, WriteWithNinjaVariables) { |
| 64 Err err; |
| 65 SubstitutionPattern pattern; |
| 66 ASSERT_TRUE(pattern.Parse( |
| 67 "-i {{source}} --out=bar\"{{source_name_part}}\".o", |
| 68 NULL, &err)); |
| 69 EXPECT_FALSE(err.has_error()); |
| 70 |
| 71 EscapeOptions options; |
| 72 options.mode = ESCAPE_NONE; |
| 73 |
| 74 std::ostringstream out; |
| 75 SubstitutionWriter::WriteWithNinjaVariables(pattern, options, out); |
| 76 |
| 77 EXPECT_EQ( |
| 78 "-i ${in} --out=bar\"${source_name_part}\".o", |
| 79 out.str()); |
| 80 } |
| 81 |
| 82 // Tests in isolation different types of substitutions and that the right |
| 83 // things are generated. |
| 84 TEST(SubstutitionWriter, Substitutions) { |
| 85 TestWithScope setup; |
| 86 |
| 87 // Call to get substitutions relative to the build dir. |
| 88 #define GetRelSubst(str, what) \ |
| 89 SubstitutionWriter::GetSourceSubstitution( \ |
| 90 setup.settings(), \ |
| 91 SourceFile(str), \ |
| 92 what, \ |
| 93 SubstitutionWriter::OUTPUT_RELATIVE, \ |
| 94 setup.settings()->build_settings()->build_dir()) |
| 95 |
| 96 // Call to get absolute directory substitutions. |
| 97 #define GetAbsSubst(str, what) \ |
| 98 SubstitutionWriter::GetSourceSubstitution( \ |
| 99 setup.settings(), \ |
| 100 SourceFile(str), \ |
| 101 what, \ |
| 102 SubstitutionWriter::OUTPUT_ABSOLUTE, \ |
| 103 SourceDir()) |
| 104 |
| 105 // Try all possible templates with a normal looking string. |
| 106 EXPECT_EQ("../../foo/bar/baz.txt", |
| 107 GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE)); |
| 108 EXPECT_EQ("//foo/bar/baz.txt", |
| 109 GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE)); |
| 110 |
| 111 EXPECT_EQ("baz", |
| 112 GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_NAME_PART)); |
| 113 EXPECT_EQ("baz", |
| 114 GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_NAME_PART)); |
| 115 |
| 116 EXPECT_EQ("baz.txt", |
| 117 GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_FILE_PART)); |
| 118 EXPECT_EQ("baz.txt", |
| 119 GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_FILE_PART)); |
| 120 |
| 121 EXPECT_EQ("../../foo/bar", |
| 122 GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_DIR)); |
| 123 EXPECT_EQ("//foo/bar", |
| 124 GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_DIR)); |
| 125 |
| 126 EXPECT_EQ("foo/bar", GetRelSubst("//foo/bar/baz.txt", |
| 127 SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR)); |
| 128 EXPECT_EQ("foo/bar", GetAbsSubst("//foo/bar/baz.txt", |
| 129 SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR)); |
| 130 |
| 131 EXPECT_EQ("gen/foo/bar", |
| 132 GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_GEN_DIR)); |
| 133 EXPECT_EQ("//out/Debug/gen/foo/bar", |
| 134 GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_GEN_DIR)); |
| 135 |
| 136 EXPECT_EQ("obj/foo/bar", |
| 137 GetRelSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_OUT_DIR)); |
| 138 EXPECT_EQ("//out/Debug/obj/foo/bar", |
| 139 GetAbsSubst("//foo/bar/baz.txt", SUBSTITUTION_SOURCE_OUT_DIR)); |
| 140 |
| 141 // Operations on an absolute path. |
| 142 EXPECT_EQ("/baz.txt", GetRelSubst("/baz.txt", SUBSTITUTION_SOURCE)); |
| 143 EXPECT_EQ("/.", GetRelSubst("/baz.txt", SUBSTITUTION_SOURCE_DIR)); |
| 144 EXPECT_EQ("gen", GetRelSubst("/baz.txt", SUBSTITUTION_SOURCE_GEN_DIR)); |
| 145 EXPECT_EQ("obj", GetRelSubst("/baz.txt", SUBSTITUTION_SOURCE_OUT_DIR)); |
| 146 |
| 147 EXPECT_EQ(".", |
| 148 GetRelSubst("//baz.txt", SUBSTITUTION_SOURCE_ROOT_RELATIVE_DIR)); |
| 149 |
| 150 #undef GetAbsSubst |
| 151 #undef GetRelSubst |
| 152 } |
OLD | NEW |