#![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 = "".parse(); assert!(match res { Err(LlvmVersionParseError::ParseIntError(_)) => true, _ => false, }); } #[test] fn parse_llvm_version_invalid_char() { let res: Result = "A".parse(); assert!(match res { Err(LlvmVersionParseError::ParseIntError(_)) => true, _ => false, }); } #[test] fn parse_llvm_version_overflow() { let res: Result = "9999999999999999999999999999999".parse(); assert!(match res { Err(LlvmVersionParseError::ParseIntError(_)) => true, _ => false, }); } #[test] fn parse_llvm_version_leading_zero_on_zero() { let res: Result = "00".parse(); assert!(match res { Err(LlvmVersionParseError::ComponentMustNotHaveLeadingZeros) => true, _ => false, }); } #[test] fn parse_llvm_version_leading_zero_on_nonzero() { let res: Result = "01".parse(); assert!(match res { Err(LlvmVersionParseError::ComponentMustNotHaveLeadingZeros) => true, _ => false, }); } #[test] fn parse_llvm_version_4_components() { let res: Result = "4.0.0.0".parse(); assert!(match res { Err(LlvmVersionParseError::TooManyComponents) => true, _ => false, }); } #[test] fn parse_llvm_version_component_sign_plus() { let res: Result = "1.+3".parse(); assert!(match res { Err(LlvmVersionParseError::ComponentMustNotHaveSign) => true, _ => false, }); } #[test] fn parse_llvm_version_component_sign_minus() { let res: Result = "1.-3".parse(); assert!(match res { Err(LlvmVersionParseError::ComponentMustNotHaveSign) => true, _ => false, }); } #[test] fn parse_llvm_version_3() { let res: Result = "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!(); } */