Skip to content

Allow custom diffing algorithm #50

@cpud36

Description

@cpud36

I would like to be able to plug-in custom diffing algorithm in case of failure. Currently the dissimilar crate is hardcoded in the Runtime::panic.

The use case I have, is the following. I would like to check llvm ir output with expect, but textual diffs on llvm ir do not make much sense. For example, if one were to add a variable at the beginning of the function, most futher variables would change their names (they are named in the form %1, %2, %3, ...). But there is an awesome llvm-diff tool, that handles renames much better, so on failure I would like to print the llvm-diff output, not the dissimilar one.

I have two concepts of api in mind:

// Expose the plug-in point, or
impl Expect {
  pub fn diff_fn(&mut self, diff: impl FnOnce(...) -> ...); // <- actually boxes the diff fn
  pub fn assert_eq_with_diff(&self, actual: &str, diff: impl FnOnce(...) -> ...);
}

// A low-level api to allow user customization
impl Expect {
  /// Check if this expect is equal to `actual`.
  ///
  /// Returns ExpectError that contains `expected` and `actual` (also holds the rt lock).
  /// You are expected to report the error and drop it - ExpectError panics on drop.
  ///
  /// If UPDATE_XFLAGS=1 is set, updates the expect and returns none.
  pub fn check_eq(&self, actual: &str) -> Option<ExpectError<'_>>;
}

impl ExpectError {
  /// Prints common error message with user-provided diff
  pub fn report_diff(self, diff: &str);
  /// Prints common error message with user-provided diff
  pub fn report_diff(self, diff: &str);
}

I am willing to create PR if it is an acceptable change

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions