mirror of
https://github.com/ROCm/composable_kernel.git
synced 2026-05-03 05:01:25 +00:00
[CK_BUILDER] Add inline string diff for tests (#3067)
Adds new testing functionality: an inline diff for string comparison.
Example usage:
EXPECT_THAT("Actual string", ck_tile::test::StringEqWithDiff("Expected string"));
Failure message:
Value of: "Actual string"
Expected: "Expected string"
Actual: "Actual string" (of type char [14]),
Diff: "[Expe|A]ct[ed|ual] string"
The inline-diff function uses the Wagner-Fischer algorithm to find the minimum edit distance and generate diff markers, which has O(N^2) complexity. It has optional color codes that are enabled with the matcher.
This commit is contained in:
43
experimental/builder/test/testing_utils.hpp
Normal file
43
experimental/builder/test/testing_utils.hpp
Normal file
@@ -0,0 +1,43 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <gmock/gmock.h>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
|
||||
namespace ck_tile::test {
|
||||
|
||||
static bool isTerminalOutput() { return isatty(fileno(stdout)) || isatty(fileno(stderr)); }
|
||||
|
||||
// Returns a string highlighting differences between actual and expected.
|
||||
// Differences are enclosed in brackets with actual and expected parts separated by '|'.
|
||||
std::string inlineDiff(const std::string& actual,
|
||||
const std::string& expected,
|
||||
bool use_color = isTerminalOutput());
|
||||
|
||||
// A convenience alias for inlineDiff to improve readability in test assertions.
|
||||
// Note that the function has O(n^2) complexity both in compute and in memory - do not use for very
|
||||
// long strings
|
||||
std::string formatInlineDiff(const std::string& actual, const std::string& expected);
|
||||
|
||||
// Gmock matcher for string equality with inline diff output on failure
|
||||
class StringEqWithDiffMatcher : public ::testing::MatcherInterface<std::string>
|
||||
{
|
||||
public:
|
||||
explicit StringEqWithDiffMatcher(const std::string& expected);
|
||||
|
||||
bool MatchAndExplain(std::string actual,
|
||||
::testing::MatchResultListener* listener) const override;
|
||||
|
||||
void DescribeTo(std::ostream* os) const override;
|
||||
void DescribeNegationTo(std::ostream* os) const override;
|
||||
|
||||
private:
|
||||
std::string expected_;
|
||||
};
|
||||
|
||||
// Factory function for the StringEqWithDiff matcher
|
||||
::testing::Matcher<std::string> StringEqWithDiff(const std::string& expected);
|
||||
|
||||
} // namespace ck_tile::test
|
||||
Reference in New Issue
Block a user