// Copyright (c) 2013 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. #ifndef TOOLS_GN_TEST_WITH_SCOPE_H_ #define TOOLS_GN_TEST_WITH_SCOPE_H_ #include #include #include "base/macros.h" #include "tools/gn/build_settings.h" #include "tools/gn/err.h" #include "tools/gn/input_file.h" #include "tools/gn/parse_tree.h" #include "tools/gn/scope.h" #include "tools/gn/scope_per_file_provider.h" #include "tools/gn/settings.h" #include "tools/gn/target.h" #include "tools/gn/token.h" #include "tools/gn/toolchain.h" #include "tools/gn/value.h" // A helper class for setting up a Scope that a test can use. It makes a // toolchain and sets up all the build state. class TestWithScope { public: TestWithScope(); ~TestWithScope(); BuildSettings* build_settings() { return &build_settings_; } Settings* settings() { return &settings_; } const Settings* settings() const { return &settings_; } Toolchain* toolchain() { return &toolchain_; } const Toolchain* toolchain() const { return &toolchain_; } Scope* scope() { return &scope_; } const Scope::ItemVector& items() { return items_; } // This buffer accumulates output from any print() commands executed in the // context of this test. Note that the implementation of this is not // threadsafe so don't write tests that call print from multiple threads. std::string& print_output() { return print_output_; } // Parse the given string into a label in the default toolchain. This will // assert if the label isn't valid (this is intended for hardcoded labels). Label ParseLabel(const std::string& str) const; // Parses, evaluates, and resolves targets from the given snippet of code. // All targets must be defined in dependency order (does not use a Builder, // just blindly resolves all targets in order). bool ExecuteSnippet(const std::string& str, Err* err); // Fills in the tools for the given toolchain with reasonable default values. // The toolchain in this object will be automatically set up with this // function, it is exposed to allow tests to get the same functionality for // other toolchains they make. static void SetupToolchain(Toolchain* toolchain); // Sets the given text command on the given tool, parsing it as a // substitution pattern. This will assert if the input is malformed. This is // designed to help setting up Tools for tests. static void SetCommandForTool(const std::string& cmd, Tool* tool); private: void AppendPrintOutput(const std::string& str); BuildSettings build_settings_; Settings settings_; Toolchain toolchain_; Scope scope_; Scope::ItemVector items_; // Supplies the scope with built-in variables like root_out_dir. ScopePerFileProvider scope_progammatic_provider_; std::string print_output_; DISALLOW_COPY_AND_ASSIGN(TestWithScope); }; // Helper class to treat some string input as a file. // // Instantiate it with the contents you want, be sure to check for error, and // then you can execute the ParseNode or whatever. class TestParseInput { public: explicit TestParseInput(const std::string& input); ~TestParseInput(); // Indicates whether and what error occurred during tokenizing and parsing. bool has_error() const { return parse_err_.has_error(); } const Err& parse_err() const { return parse_err_; } const InputFile& input_file() const { return input_file_; } const std::vector& tokens() const { return tokens_; } const ParseNode* parsed() const { return parsed_.get(); } private: InputFile input_file_; std::vector tokens_; std::unique_ptr parsed_; Err parse_err_; DISALLOW_COPY_AND_ASSIGN(TestParseInput); }; // Shortcut for creating targets for tests that take the test setup, a pretty- // style label, and a target type and sets everything up. The target will // default to public visibility. class TestTarget : public Target { public: TestTarget(const TestWithScope& setup, const std::string& label_string, Target::OutputType type); ~TestTarget() override; }; #endif // TOOLS_GN_TEST_WITH_SCOPE_H_