Source code
Revision control
Copy as Markdown
Other Tools
#![allow(clippy::match_like_matches_macro)]
use std::process::Command;
use rustc_version::{
version, version_meta, version_meta_for, Channel, Error, LlvmVersion, LlvmVersionParseError,
Version, VersionMeta,
};
#[test]
fn rustc_error() {
let mut cmd = Command::new("rustc");
cmd.arg("--FOO");
let stderr = match VersionMeta::for_command(cmd) {
Err(Error::CommandError { stdout: _, stderr }) => stderr,
_ => panic!("command error expected"),
};
assert_eq!(stderr, "error: Unrecognized option: \'FOO\'\n\n");
}
#[test]
fn smoketest() {
let v = version().unwrap();
assert!(v.major >= 1);
let v = version_meta().unwrap();
assert!(v.semver.major >= 1);
assert!(version().unwrap() >= Version::parse("1.0.0").unwrap());
}
#[test]
fn parse_1_0_0() {
let version = version_meta_for(
"rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14)
binary: rustc
commit-hash: a59de37e99060162a2674e3ff45409ac73595c0e
commit-date: 2015-05-13
build-date: 2015-05-14
host: x86_64-unknown-linux-gnu
release: 1.0.0",
)
.unwrap();
assert_eq!(version.semver, Version::parse("1.0.0").unwrap());
assert_eq!(
version.commit_hash,
Some("a59de37e99060162a2674e3ff45409ac73595c0e".into())
);
assert_eq!(version.commit_date, Some("2015-05-13".into()));
assert_eq!(version.build_date, Some("2015-05-14".into()));
assert_eq!(version.channel, Channel::Stable);
assert_eq!(version.host, "x86_64-unknown-linux-gnu");
assert_eq!(
version.short_version_string,
"rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14)"
);
assert_eq!(version.llvm_version, None);
}
#[test]
fn parse_unknown() {
let version = version_meta_for(
"rustc 1.3.0
binary: rustc
commit-hash: unknown
commit-date: unknown
host: x86_64-unknown-linux-gnu
release: 1.3.0",
)
.unwrap();
assert_eq!(version.semver, Version::parse("1.3.0").unwrap());
assert_eq!(version.commit_hash, None);
assert_eq!(version.commit_date, None);
assert_eq!(version.channel, Channel::Stable);
assert_eq!(version.host, "x86_64-unknown-linux-gnu");
assert_eq!(version.short_version_string, "rustc 1.3.0");
assert_eq!(version.llvm_version, None);
}
#[test]
fn parse_nightly() {
let version = version_meta_for(
"rustc 1.5.0-nightly (65d5c0833 2015-09-29)
binary: rustc
commit-hash: 65d5c083377645a115c4ac23a620d3581b9562b6
commit-date: 2015-09-29
host: x86_64-unknown-linux-gnu
release: 1.5.0-nightly",
)
.unwrap();
assert_eq!(version.semver, Version::parse("1.5.0-nightly").unwrap());
assert_eq!(
version.commit_hash,
Some("65d5c083377645a115c4ac23a620d3581b9562b6".into())
);
assert_eq!(version.commit_date, Some("2015-09-29".into()));
assert_eq!(version.channel, Channel::Nightly);
assert_eq!(version.host, "x86_64-unknown-linux-gnu");
assert_eq!(
version.short_version_string,
"rustc 1.5.0-nightly (65d5c0833 2015-09-29)"
);
assert_eq!(version.llvm_version, None);
}
#[test]
fn parse_stable() {
let version = version_meta_for(
"rustc 1.3.0 (9a92aaf19 2015-09-15)
binary: rustc
commit-hash: 9a92aaf19a64603b02b4130fe52958cc12488900
commit-date: 2015-09-15
host: x86_64-unknown-linux-gnu
release: 1.3.0",
)
.unwrap();
assert_eq!(version.semver, Version::parse("1.3.0").unwrap());
assert_eq!(
version.commit_hash,
Some("9a92aaf19a64603b02b4130fe52958cc12488900".into())
);
assert_eq!(version.commit_date, Some("2015-09-15".into()));
assert_eq!(version.channel, Channel::Stable);
assert_eq!(version.host, "x86_64-unknown-linux-gnu");
assert_eq!(
version.short_version_string,
"rustc 1.3.0 (9a92aaf19 2015-09-15)"
);
assert_eq!(version.llvm_version, None);
}
#[test]
fn parse_1_16_0_nightly() {
let version = version_meta_for(
"rustc 1.16.0-nightly (5d994d8b7 2017-01-05)
binary: rustc
commit-hash: 5d994d8b7e482e87467d4a521911477bd8284ce3
commit-date: 2017-01-05
host: x86_64-unknown-linux-gnu
release: 1.16.0-nightly
LLVM version: 3.9",
)
.unwrap();
assert_eq!(version.semver, Version::parse("1.16.0-nightly").unwrap());
assert_eq!(
version.commit_hash,
Some("5d994d8b7e482e87467d4a521911477bd8284ce3".into())
);
assert_eq!(version.commit_date, Some("2017-01-05".into()));
assert_eq!(version.channel, Channel::Nightly);
assert_eq!(version.host, "x86_64-unknown-linux-gnu");
assert_eq!(
version.short_version_string,
"rustc 1.16.0-nightly (5d994d8b7 2017-01-05)"
);
assert_eq!(
version.llvm_version,
Some(LlvmVersion { major: 3, minor: 9 })
);
}
#[test]
fn parse_1_47_0_stable() {
let version = version_meta_for(
"rustc 1.47.0 (18bf6b4f0 2020-10-07)
binary: rustc
commit-hash: 18bf6b4f01a6feaf7259ba7cdae58031af1b7b39
commit-date: 2020-10-07
host: powerpc64le-unknown-linux-gnu
release: 1.47.0
LLVM version: 11.0",
)
.unwrap();
assert_eq!(version.semver, Version::parse("1.47.0").unwrap());
assert_eq!(
version.commit_hash,
Some("18bf6b4f01a6feaf7259ba7cdae58031af1b7b39".into())
);
assert_eq!(version.commit_date, Some("2020-10-07".into()));
assert_eq!(version.channel, Channel::Stable);
assert_eq!(version.host, "powerpc64le-unknown-linux-gnu");
assert_eq!(
version.short_version_string,
"rustc 1.47.0 (18bf6b4f0 2020-10-07)"
);
assert_eq!(
version.llvm_version,
Some(LlvmVersion {
major: 11,
minor: 0,
})
);
}
#[test]
fn parse_llvm_micro() {
let version = version_meta_for(
"rustc 1.51.0-nightly (4253153db 2021-01-17)
binary: rustc
commit-hash: 4253153db205251f72ea4493687a31e04a2a8ca0
commit-date: 2021-01-17
host: x86_64-pc-windows-msvc
release: 1.51.0-nightly
LLVM version: 11.0.1",
)
.unwrap();
assert_eq!(version.semver, Version::parse("1.51.0-nightly").unwrap());
assert_eq!(
version.commit_hash.unwrap(),
"4253153db205251f72ea4493687a31e04a2a8ca0"
);
assert_eq!(version.commit_date.unwrap(), "2021-01-17");
assert_eq!(version.host, "x86_64-pc-windows-msvc");
assert_eq!(
version.short_version_string,
"rustc 1.51.0-nightly (4253153db 2021-01-17)"
);
assert_eq!(
version.llvm_version,
Some(LlvmVersion {
major: 11,
minor: 0
})
);
}
#[test]
fn parse_debian_buster() {
let version = version_meta_for(
"rustc 1.41.1
binary: rustc
commit-hash: unknown
commit-date: unknown
host: powerpc64le-unknown-linux-gnu
release: 1.41.1
LLVM version: 7.0",
)
.unwrap();
assert_eq!(version.semver, Version::parse("1.41.1").unwrap());
assert_eq!(version.commit_hash, None);
assert_eq!(version.commit_date, None);
assert_eq!(version.channel, Channel::Stable);
assert_eq!(version.host, "powerpc64le-unknown-linux-gnu");
assert_eq!(version.short_version_string, "rustc 1.41.1");
assert_eq!(
version.llvm_version,
Some(LlvmVersion { major: 7, minor: 0 })
);
}
#[test]
fn parse_termux() {
let version = version_meta_for(
"rustc 1.46.0
binary: rustc
commit-hash: unknown
commit-date: unknown
host: aarch64-linux-android
release: 1.46.0
LLVM version: 10.0",
)
.unwrap();
assert_eq!(version.semver, Version::parse("1.46.0").unwrap());
assert_eq!(version.commit_hash, None);
assert_eq!(version.commit_date, None);
assert_eq!(version.channel, Channel::Stable);
assert_eq!(version.host, "aarch64-linux-android");
assert_eq!(version.short_version_string, "rustc 1.46.0");
assert_eq!(
version.llvm_version,
Some(LlvmVersion {
major: 10,
minor: 0,
})
);
}
#[test]
fn parse_llvm_version_empty() {
let res: Result<LlvmVersion, _> = "".parse();
assert!(match res {
Err(LlvmVersionParseError::ParseIntError(_)) => true,
_ => false,
});
}
#[test]
fn parse_llvm_version_invalid_char() {
let res: Result<LlvmVersion, _> = "A".parse();
assert!(match res {
Err(LlvmVersionParseError::ParseIntError(_)) => true,
_ => false,
});
}
#[test]
fn parse_llvm_version_overflow() {
let res: Result<LlvmVersion, _> = "9999999999999999999999999999999".parse();
assert!(match res {
Err(LlvmVersionParseError::ParseIntError(_)) => true,
_ => false,
});
}
#[test]
fn parse_llvm_version_leading_zero_on_zero() {
let res: Result<LlvmVersion, _> = "00".parse();
assert!(match res {
Err(LlvmVersionParseError::ComponentMustNotHaveLeadingZeros) => true,
_ => false,
});
}
#[test]
fn parse_llvm_version_leading_zero_on_nonzero() {
let res: Result<LlvmVersion, _> = "01".parse();
assert!(match res {
Err(LlvmVersionParseError::ComponentMustNotHaveLeadingZeros) => true,
_ => false,
});
}
#[test]
fn parse_llvm_version_4_components() {
let res: Result<LlvmVersion, _> = "4.0.0.0".parse();
assert!(match res {
Err(LlvmVersionParseError::TooManyComponents) => true,
_ => false,
});
}
#[test]
fn parse_llvm_version_component_sign_plus() {
let res: Result<LlvmVersion, _> = "1.+3".parse();
assert!(match res {
Err(LlvmVersionParseError::ComponentMustNotHaveSign) => true,
_ => false,
});
}
#[test]
fn parse_llvm_version_component_sign_minus() {
let res: Result<LlvmVersion, _> = "1.-3".parse();
assert!(match res {
Err(LlvmVersionParseError::ComponentMustNotHaveSign) => true,
_ => false,
});
}
#[test]
fn parse_llvm_version_3() {
let res: Result<LlvmVersion, _> = "3".parse();
assert!(match res {
Err(LlvmVersionParseError::MinorVersionRequiredBefore4) => true,
_ => false,
});
}
#[test]
fn parse_llvm_version_5() {
let v: LlvmVersion = "5".parse().unwrap();
assert_eq!(v, LlvmVersion { major: 5, minor: 0 });
}
#[test]
fn parse_llvm_version_5_0() {
let v: LlvmVersion = "5.0".parse().unwrap();
assert_eq!(v, LlvmVersion { major: 5, minor: 0 });
}
#[test]
fn parse_llvm_version_4_0() {
let v: LlvmVersion = "4.0".parse().unwrap();
assert_eq!(v, LlvmVersion { major: 4, minor: 0 });
}
#[test]
fn parse_llvm_version_3_0() {
let v: LlvmVersion = "3.0".parse().unwrap();
assert_eq!(v, LlvmVersion { major: 3, minor: 0 });
}
#[test]
fn parse_llvm_version_3_9() {
let v: LlvmVersion = "3.9".parse().unwrap();
assert_eq!(v, LlvmVersion { major: 3, minor: 9 });
}
#[test]
fn parse_llvm_version_11_0() {
let v: LlvmVersion = "11.0".parse().unwrap();
assert_eq!(
v,
LlvmVersion {
major: 11,
minor: 0
}
);
}
#[test]
fn parse_llvm_version_11() {
let v: LlvmVersion = "11".parse().unwrap();
assert_eq!(
v,
LlvmVersion {
major: 11,
minor: 0
}
);
}
#[test]
fn test_llvm_version_comparison() {
// check that field order is correct
assert!(LlvmVersion { major: 3, minor: 9 } < LlvmVersion { major: 4, minor: 0 });
}
/*
#[test]
fn version_matches_replacement() {
let f = |s1: &str, s2: &str| {
let a = Version::parse(s1).unwrap();
let b = Version::parse(s2).unwrap();
println!("{} <= {} : {}", s1, s2, a <= b);
};
println!();
f("1.5.0", "1.5.0");
f("1.5.0-nightly", "1.5.0");
f("1.5.0", "1.5.0-nightly");
f("1.5.0-nightly", "1.5.0-nightly");
f("1.5.0", "1.6.0");
f("1.5.0-nightly", "1.6.0");
f("1.5.0", "1.6.0-nightly");
f("1.5.0-nightly", "1.6.0-nightly");
panic!();
}
*/