just 1.58.0

🤖 Just a command runner
Documentation
use super::*;

#[test]
fn dont_run_duplicate_recipes() {
  Test::new()
    .justfile(
      "
        @foo:
          echo foo
      ",
    )
    .args(["foo", "foo"])
    .stdout("foo\n")
    .success();
}

#[test]
fn one_flag_only_allows_one_invocation() {
  Test::new()
    .justfile(
      "
        @foo:
          echo foo
      ",
    )
    .args(["--one", "foo"])
    .stdout("foo\n")
    .success();

  Test::new()
    .justfile(
      "
        @foo:
          echo foo

        @bar:
          echo bar
      ",
    )
    .args(["--one", "foo", "bar"])
    .stderr("error: expected 1 command-line recipe invocation but found 2\n")
    .failure();
}

#[test]
fn time_reports_time_when_specified() {
  Test::new()
    .justfile(
      "
        foo:
          @echo FOO
      ",
    )
    .arg("--time")
    .stdout("FOO\n")
    .stderr_regex(r"---> foo completed in \d+\.\d+s\n")
    .success();
}

#[test]
fn dependency_traversal_is_not_exponential() {
  let n = 40;

  let mut justfile = String::new();

  for i in 0..n {
    justfile.push_str(&format!("r{i}: r{} r{}\n", i + 1, i + 1));
  }

  justfile.push_str(&format!("r{n}:\n"));

  let tempdir = tempdir();

  fs::write(tempdir.path().join("justfile"), justfile).unwrap();

  let mut child = Command::new(JUST)
    .args(["--dry-run", "r0"])
    .current_dir(tempdir.path())
    .stdin(Stdio::null())
    .stdout(Stdio::null())
    .stderr(Stdio::null())
    .spawn()
    .unwrap();

  let start = Instant::now();

  while start.elapsed() < Duration::from_secs(60) {
    if let Some(status) = child.try_wait().unwrap() {
      assert!(status.success());
      return;
    }

    thread::sleep(Duration::from_millis(100));
  }

  child.kill().unwrap();
  child.wait().unwrap();

  panic!("dependency graph traversal of {n} recipes did not complete within 60 seconds");
}