From 5d0923569f1237c639e9a584dae1b55e52148e59 Mon Sep 17 00:00:00 2001 From: Bryan Bennett Date: Mon, 8 Jan 2024 15:29:59 -0500 Subject: [PATCH] More tests for version.extract_version_number --- Justfile | 5 +++++ lib/flake_env__versions.re | 32 ++++++++++++++++++-------------- tests/dune | 2 +- tests/flake_env_test_versions.re | 14 +++++++++++++- tests/spit_gibberish.sh | 3 +++ 5 files changed, 40 insertions(+), 16 deletions(-) create mode 100755 tests/spit_gibberish.sh diff --git a/Justfile b/Justfile index 9e7ec57..6bcf045 100644 --- a/Justfile +++ b/Justfile @@ -1,5 +1,10 @@ build: @dune build +test: + @dune test -f + @bisect-ppx-report html + @bisect-ppx-report summary --per-file + fmt: @dune build @fmt --auto-promote diff --git a/lib/flake_env__versions.re b/lib/flake_env__versions.re index 0ad683b..1fbcd71 100644 --- a/lib/flake_env__versions.re +++ b/lib/flake_env__versions.re @@ -30,23 +30,27 @@ let compare = (a, b) => { } } -let extract_version_number = (cmd) => { +let extract_version_number = cmd => { switch (Util.run_process(cmd, ["--version"])) { - | (Ok(), stdout) when String.length(stdout) > 0 => { - let substrings = Re.exec(semver_re, stdout); + | (Ok (), stdout) when String.length(stdout) > 0 => + switch (Re.exec(semver_re, stdout)) { + | exception Stdlib.Not_found => + Error( + Printf.sprintf( + "Stdout did not contain a version number for `%s --version`", + cmd, + ), + ) + | substrings => let groups = Re.Group.all(substrings); - if ((groups |> Array.length) == 4) { - Ok({ - major: groups[1] |> int_of_string, - minor: groups[2] |> int_of_string, - point: groups[3] |> int_of_string - }) - } else { - Error(Printf.sprintf("Stdout did not contain a version number for `%s --version`", cmd)) - } + Ok({ + major: groups[1] |> int_of_string, + minor: groups[2] |> int_of_string, + point: groups[3] |> int_of_string, + }); } - | _ => Error(Printf.sprintf("Failed executing '%s'\n", cmd)) - } + | _ => Error(Printf.sprintf("Failed executing '%s'", cmd)) + }; }; let is_new_enough = (cur, needed) => { diff --git a/tests/dune b/tests/dune index 9440d3f..deb6af3 100644 --- a/tests/dune +++ b/tests/dune @@ -3,7 +3,7 @@ flake_env_test_versions flake_env_test_watches flake_env_test_util) - (deps spit_version.sh) + (deps spit_version.sh spit_gibberish.sh) (libraries lib alcotest diff --git a/tests/flake_env_test_versions.re b/tests/flake_env_test_versions.re index 5b06a48..ac5214a 100644 --- a/tests/flake_env_test_versions.re +++ b/tests/flake_env_test_versions.re @@ -103,8 +103,18 @@ let test_extract_version_number_success = () => { check_version("Versions", Ok(Versions.init(1, 1, 1)), result); }; +let test_extract_version_number_no_version = () => { + let result = Versions.extract_version_number("../tests/spit_gibberish.sh"); + check_version("Versions", Error("Stdout did not contain a version number for `../tests/spit_gibberish.sh --version`"), result); +}; + +let test_extract_version_number_nonexistent = () => { + let result = Versions.extract_version_number("nonexistent.sh"); + check_version("Versions", Error("Failed executing 'nonexistent.sh'"), result); +}; + + // TODO: Test: -// * extract_version_number: impure, don't know how to get a concrete version number to test against // * preflight_versions? impure, but m let () = Alcotest.( @@ -167,6 +177,8 @@ let () = "extract_version_number", [ test_case("success", `Quick, test_extract_version_number_success), + test_case("no version number", `Quick, test_extract_version_number_no_version), + test_case("missing binary", `Quick, test_extract_version_number_nonexistent), ], ), ], diff --git a/tests/spit_gibberish.sh b/tests/spit_gibberish.sh new file mode 100755 index 0000000..e767e00 --- /dev/null +++ b/tests/spit_gibberish.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env sh + +echo "sdlfkjdsfweiojlsjslfj.dofiwoksdj/sfowiefjw0";