// Copyright 2021 The Tint Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SRC_TRANSFORM_TEST_HELPER_H_ #define SRC_TRANSFORM_TEST_HELPER_H_ #include #include #include #include #include "gtest/gtest.h" #include "src/reader/wgsl/parser.h" #include "src/transform/manager.h" #include "src/writer/wgsl/generator.h" namespace tint { namespace transform { /// Helper class for testing transforms template class TransformTestBase : public BASE { public: /// Transforms and returns the WGSL source `in`, transformed using /// `transforms`. /// @param in the input WGSL source /// @param transforms the list of transforms to apply /// @param data the optional DataMap to pass to Transform::Run() /// @return the transformed output Transform::Output Run( std::string in, std::vector> transforms, DataMap data = {}) { auto file = std::make_unique("test", in); auto program = reader::wgsl::Parse(file.get()); // Keep this pointer alive after Transform() returns files_.emplace_back(std::move(file)); if (!program.IsValid()) { return Transform::Output(std::move(program)); } Manager manager; for (auto& transform : transforms) { manager.append(std::move(transform)); } return manager.Run(&program, data); } /// Transforms and returns the WGSL source `in`, transformed using /// `transform`. /// @param transform the transform to apply /// @param in the input WGSL source /// @param data the optional DataMap to pass to Transform::Run() /// @return the transformed output Transform::Output Run(std::string in, std::unique_ptr transform, DataMap data = {}) { std::vector> transforms; transforms.emplace_back(std::move(transform)); return Run(std::move(in), std::move(transforms), std::move(data)); } /// Transforms and returns the WGSL source `in`, transformed using /// a transform of type `TRANSFORM`. /// @param in the input WGSL source /// @param data the optional DataMap to pass to Transform::Run() /// @return the transformed output template Transform::Output Run(std::string in, DataMap data = {}) { return Run(std::move(in), std::make_unique(), std::move(data)); } /// @param output the output of the transform /// @returns the output program as a WGSL string, or an error string if the /// program is not valid. std::string str(const Transform::Output& output) { diag::Formatter::Style style; style.print_newline_at_end = false; if (!output.program.IsValid()) { return diag::Formatter(style).format(output.program.Diagnostics()); } writer::wgsl::Generator generator(&output.program); if (!generator.Generate()) { return "WGSL writer failed:\n" + generator.error(); } auto res = generator.result(); if (res.empty()) { return res; } // The WGSL sometimes has two trailing newlines. Strip them while (res.back() == '\n') { res.pop_back(); } if (res.empty()) { return res; } return "\n" + res + "\n"; } private: std::vector> files_; }; using TransformTest = TransformTestBase; template using TransformTestWithParam = TransformTestBase>; } // namespace transform } // namespace tint #endif // SRC_TRANSFORM_TEST_HELPER_H_