sem-tool 0.2.0

A simple Semantic Versioning CLI tool for parsing, filtering, sorting and explaining
Documentation
//! SPDX-License-Identifier: Apache-2.0
//! Copyright 2025 canardleteer
//!
//! Licensed under the Apache License, Version 2.0 (the "License");
//! you may not use this file except in compliance with the License.
//! You may obtain a copy of the License at
//!
//! http://www.apache.org/licenses/LICENSE-2.0
//!
//! Unless required by applicable law or agreed to in writing, software
//! distributed under the License is distributed on an "AS IS" BASIS,
//! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//! See the License for the specific language governing permissions and
//! limitations under the License.
use proptest::prelude::*;
use proptest_semver::*;

mod common;
use common::subcommands::*;

use crate::common::common_cmd;

#[test]
fn cli_explain_invalid_input() {
    let assert = common_cmd().arg(COMMAND_EXPLAIN).arg("a.b.c").assert();
    assert
        .append_context(COMMAND_EXPLAIN, "1 bad semver args")
        .failure();
}

#[test]
fn cli_explain_basic_cases() {
    let assert = common_cmd()
        .arg(COMMAND_EXPLAIN)
        .arg("0.1.2-rc.0.a.1.b+a.0.b.1")
        .assert();
    assert.append_context(COMMAND_EXPLAIN, "help").success();
}

proptest! {
    #![proptest_config(ProptestConfig {
        fork: true,
        cases: 256,
        .. ProptestConfig::default()
    })]
    #[test]
    fn prop_explain(v in arb_version()) {
        let assert = common_cmd().arg(COMMAND_EXPLAIN).arg(v.to_string()).assert();
        assert.append_context(COMMAND_EXPLAIN, "property test").success();
    }

    #[test]
    fn prop_explain_output_contains_core_version(v in arb_version()) {
        let assert = common_cmd()
            .arg("-o")
            .arg("text")
            .arg(COMMAND_EXPLAIN)
            .arg(v.to_string())
            .assert();
        let stdout = String::from_utf8_lossy(&assert.get_output().stdout).into_owned();
        assert.append_context(COMMAND_EXPLAIN, "property test text output").success();
        assert!(stdout.contains(&format!("Major: {}", v.major)));
        assert!(stdout.contains(&format!("Minor: {}", v.minor)));
        assert!(stdout.contains(&format!("Patch: {}", v.patch)));
    }
}