sentry-release-parser 1.4.0

A parser for the sentry release name format
Documentation
use sentry_release_parser::{InvalidRelease, Release};
use similar_asserts::assert_eq;

#[test]
fn test_basic() {
    let release = Release::parse("@foo.bar.baz--blah@1.2.3-dev+BUILD-code").unwrap();
    assert_eq!(release.package(), Some("@foo.bar.baz--blah"));
    assert_eq!(release.version_raw(), "1.2.3-dev+BUILD-code");

    let version = release.version().unwrap();
    assert_eq!(version.major(), 1);
    assert_eq!(version.minor(), 2);
    assert_eq!(version.patch(), 3);
    assert_eq!(version.triple(), (1, 2, 3));
    assert_eq!(version.pre(), Some("dev"));
    assert_eq!(version.build_code(), Some("BUILD-code"));

    assert_eq!(release.build_hash(), None);
    assert_eq!(
        release.to_string(),
        "@foo.bar.baz--blah@1.2.3-dev+BUILD-code"
    );
    assert_eq!(release.describe().to_string(), "1.2.3-dev (BUILD-code)");
}

#[test]
fn test_basic_short_ver() {
    let release = Release::parse("@foo.bar.baz--blah@1.0a+build-code").unwrap();
    assert_eq!(release.package(), Some("@foo.bar.baz--blah"));
    assert_eq!(release.version_raw(), "1.0a+build-code");

    let version = release.version().unwrap();
    assert_eq!(version.major(), 1);
    assert_eq!(version.minor(), 0);
    assert_eq!(version.patch(), 0);
    assert_eq!(version.triple(), (1, 0, 0));
    assert_eq!(version.pre(), Some("a"));
    assert_eq!(version.build_code(), Some("build-code"));

    assert_eq!(release.build_hash(), None);
    assert_eq!(release.to_string(), "@foo.bar.baz--blah@1.0a+build-code");

    assert_eq!(release.describe().to_string(), "1.0a (build-code)");
}

#[test]
fn test_basic_short_ver_a2() {
    let release = Release::parse("@foo.bar.baz--blah@1.0alpha2+build-code").unwrap();
    assert_eq!(release.package(), Some("@foo.bar.baz--blah"));
    assert_eq!(release.version_raw(), "1.0alpha2+build-code");

    let version = release.version().unwrap();
    assert_eq!(version.major(), 1);
    assert_eq!(version.minor(), 0);
    assert_eq!(version.patch(), 0);
    assert_eq!(version.triple(), (1, 0, 0));
    assert_eq!(version.pre(), Some("alpha2"));
    assert_eq!(version.build_code(), Some("build-code"));

    assert_eq!(release.build_hash(), None);
    assert_eq!(
        release.to_string(),
        "@foo.bar.baz--blah@1.0alpha2+build-code"
    );

    assert_eq!(release.describe().to_string(), "1.0alpha2 (build-code)");
}

#[test]
fn test_release_is_hash() {
    let release = Release::parse("a86d127c4b2f23a0a862620280427dcc01c78676").unwrap();
    assert_eq!(release.package(), None);
    assert_eq!(release.version(), None);
    assert_eq!(
        release.version_raw(),
        "a86d127c4b2f23a0a862620280427dcc01c78676"
    );
    assert_eq!(
        release.build_hash(),
        Some("a86d127c4b2f23a0a862620280427dcc01c78676")
    );
    assert_eq!(
        release.to_string(),
        "a86d127c4b2f23a0a862620280427dcc01c78676"
    );
    assert_eq!(release.describe().to_string(), "a86d127c4b2f");

    let release = Release::parse("some-package@a86d127c4b2f23a0a862620280427dcc01c78676").unwrap();
    assert_eq!(release.package(), Some("some-package"));
    assert_eq!(release.version(), None);
    assert_eq!(
        release.version_raw(),
        "a86d127c4b2f23a0a862620280427dcc01c78676"
    );
    assert_eq!(
        release.build_hash(),
        Some("a86d127c4b2f23a0a862620280427dcc01c78676")
    );
    assert_eq!(
        release.to_string(),
        "some-package@a86d127c4b2f23a0a862620280427dcc01c78676"
    );
    assert_eq!(release.describe().to_string(), "a86d127c4b2f");
}

#[test]
fn test_release_build_note_is_hash() {
    let release =
        Release::parse("@foo.bar.baz--blah@1.0a+a86d127c4b2f23a0a862620280427dcc01c78676").unwrap();
    assert_eq!(release.package(), Some("@foo.bar.baz--blah"));
    assert_eq!(
        release.version_raw(),
        "1.0a+a86d127c4b2f23a0a862620280427dcc01c78676"
    );

    let version = release.version().unwrap();
    assert_eq!(version.major(), 1);
    assert_eq!(version.minor(), 0);
    assert_eq!(version.patch(), 0);
    assert_eq!(version.triple(), (1, 0, 0));
    assert_eq!(version.pre(), Some("a"));
    assert_eq!(
        version.build_code(),
        Some("a86d127c4b2f23a0a862620280427dcc01c78676")
    );
    assert_eq!(
        release.build_hash(),
        Some("a86d127c4b2f23a0a862620280427dcc01c78676")
    );
    assert_eq!(
        release.to_string(),
        "@foo.bar.baz--blah@1.0a+a86d127c4b2f23a0a862620280427dcc01c78676"
    );

    assert_eq!(release.describe().to_string(), "1.0a (a86d127c4b2f)");
}

#[test]
fn test_four_component_version() {
    let release = Release::parse("foo.bar.baz@1.2.3.04").unwrap();
    assert_eq!(release.package(), Some("foo.bar.baz"));
    assert_eq!(release.version_raw(), "1.2.3.04");
    let version = release.version().unwrap();
    assert_eq!(version.major(), 1);
    assert_eq!(version.minor(), 2);
    assert_eq!(version.patch(), 3);
    assert_eq!(version.revision(), 4);
    assert_eq!(version.triple(), (1, 2, 3));
    assert_eq!(version.quad(), (1, 2, 3, 4));
    assert_eq!(version.raw_quad(), ("1", Some("2"), Some("3"), Some("04")));
    assert_eq!(release.to_string(), "foo.bar.baz@1.2.3.04");
}

#[test]
fn test_release_build_note_is_num_starting_hash() {
    let release = Release::parse("package@085240e737828d8326719bf97730188e927e49ca").unwrap();
    assert_eq!(release.package(), Some("package"));
    assert_eq!(
        release.version_raw(),
        "085240e737828d8326719bf97730188e927e49ca"
    );
    assert_eq!(release.version(), None);
    assert_eq!(
        release.build_hash(),
        Some("085240e737828d8326719bf97730188e927e49ca")
    );
}

#[test]
fn test_basic_ios_ver() {
    let release = Release::parse("org.example.FooApp@1.0rc1+20200101100").unwrap();
    assert_eq!(release.package(), Some("org.example.FooApp"));
    assert_eq!(release.version_raw(), "1.0rc1+20200101100");

    let version = release.version().unwrap();
    assert_eq!(version.major(), 1);
    assert_eq!(version.minor(), 0);
    assert_eq!(version.patch(), 0);
    assert_eq!(version.triple(), (1, 0, 0));
    assert_eq!(version.pre(), Some("rc1"));
    assert_eq!(version.build_code(), Some("20200101100"));

    assert_eq!(release.build_hash(), None);
    assert_eq!(release.to_string(), "org.example.FooApp@1.0rc1+20200101100");

    assert_eq!(release.describe().to_string(), "1.0rc1 (20200101100)");
}

#[test]
fn test_basic_ios_ver2() {
    let release = Release::parse("org.example.FooApp@1.0rc1+1.2.3").unwrap();
    assert_eq!(release.package(), Some("org.example.FooApp"));
    assert_eq!(release.version_raw(), "1.0rc1+1.2.3");

    let version = release.version().unwrap();
    assert_eq!(version.major(), 1);
    assert_eq!(version.minor(), 0);
    assert_eq!(version.patch(), 0);
    assert_eq!(version.triple(), (1, 0, 0));
    assert_eq!(version.pre(), Some("rc1"));
    assert_eq!(version.build_code(), Some("1.2.3"));

    assert_eq!(release.build_hash(), None);
    assert_eq!(release.to_string(), "org.example.FooApp@1.0rc1+1.2.3");

    assert_eq!(release.describe().to_string(), "1.0rc1 (1.2.3)");
}

#[test]
fn test_invalid_releases() {
    assert_eq!(Release::parse("  foo   ").unwrap().version_raw(), "foo");
    assert_eq!(
        Release::parse("foo/bar"),
        Err(InvalidRelease::BadCharacters)
    );
    assert_eq!(Release::parse("."), Err(InvalidRelease::RestrictedName));
    assert_eq!(Release::parse(".."), Err(InvalidRelease::RestrictedName));
    assert_eq!(
        Release::parse("latest"),
        Err(InvalidRelease::RestrictedName)
    );
}