Skip to content

Unexpected Failure When Replacing Variable #170

Description

@Alexhuszagh

Summary

While trying to use insert_var to replace data for cargo --help's output, in order to add UI testing to cross for our integrationg tests, I noticed that I was unable to use insert_var to actually replace data for very specific corner cases. Here's a sample project reproducing the failing test case. The minimum, failing example test string is:

const DATA: &str = r#"'
:"#;

Detailed Information

The test case uses:

$ trycmd-test
[REPLACE]

And the test script is:

const DATA: &str = r#"'
:"#;

#[test]
fn cli_tests() {
    trycmd::TestCases::new()
        .case("tests/cmd/failed-replacement.md")
        .insert_var("[REPLACE]", DATA)
        .unwrap();
}

Where main.rs is:

fn main() {
    println!("{DATA}");
}

const DATA: &str = r#"'
:"#;

It will fail with the following output:

running 1 test
Testing tests/cmd/failed-replacement.md:2 ... failed
Exit: success

---- expected: stdout
++++ actual:   stdout
   1      - [REPLACE]
        1 + '
        2 + :
stderr:

Update snapshots with `TRYCMD=overwrite`
Debug output with `TRYCMD=dump`
test cli_tests ... FAILED

Note that all of the following actually work:

const EX1: &str = r#"':"#;
const EX2: &str = r#"X's USAGE:"#;

It seems to require the following regex pattern: '.*\n.*:. If the newline is not present, everything works as expected.

Original Use

The original failing output, and what we were originally trying to match, is as follows:

Rust's package manager

USAGE:
    cargo [+toolchain] [OPTIONS] [SUBCOMMAND]

OPTIONS:
    -V, --version               Print version info and exit
        --list                  List installed commands
        --explain <CODE>        Run `rustc --explain CODE`
    -v, --verbose               Use verbose output (-vv very verbose/build.rs output)
    -q, --quiet                 Do not print cargo log messages
        --color <WHEN>          Coloring: auto, always, never
        --frozen                Require Cargo.lock and cache are up to date
        --locked                Require Cargo.lock is up to date
        --offline               Run without accessing the network
        --config <KEY=VALUE>    Override a configuration value (unstable)
    -Z <FLAG>                   Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for
                                details
    -h, --help                  Print help information

Some common cargo commands are (see all commands with --list):
    build, b    Compile the current package
    check, c    Analyze the current package and report errors, but don't build object files
    clean       Remove the target directory
    doc, d      Build this package's and its dependencies' documentation
    new         Create a new cargo package
    init        Create a new cargo package in an existing directory
    add         Add dependencies to a manifest file
    run, r      Run a binary or example of the local package
    test, t     Run the tests
    bench       Run the benchmarks
    update      Update dependencies listed in Cargo.lock
    search      Search registry for crates
    publish     Package and upload this package to the registry
    install     Install a Rust binary. Default location is $HOME/.cargo/bin
    uninstall   Uninstall a Rust binary

See 'cargo help <command>' for more information on a specific command.


Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions