forked from openkylin/rust-rustc-version
457 lines
12 KiB
Rust
457 lines
12 KiB
Rust
#![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!();
|
|
|
|
}
|
|
*/
|