blob: c3b1fd069a6b77d6dd673c2cd9eecc35788ad1da [file] [log] [blame]
extern crate cargo_metadata;
extern crate semver;
extern crate serde_json;
#[macro_use]
extern crate serde_derive;
use std::env::current_dir;
use std::path::Path;
use std::env;
use semver::Version;
use cargo_metadata::{Error, ErrorKind};
#[derive(Debug, PartialEq, Eq, Deserialize)]
struct TestPackageMetadata {
some_field: bool,
other_field: String,
}
#[test]
fn metadata() {
let metadata = cargo_metadata::metadata(None).unwrap();
assert_eq!(
current_dir().unwrap().join("target"),
Path::new(&metadata.target_directory)
);
assert_eq!(metadata.packages[0].name, "cargo_metadata");
assert_eq!(metadata.packages[0].targets.len(), 2);
assert_eq!(metadata.packages[0].targets[0].name, "cargo_metadata");
assert_eq!(metadata.packages[0].targets[0].kind[0], "lib");
assert_eq!(metadata.packages[0].targets[0].crate_types[0], "lib");
assert_eq!(metadata.packages[0].targets[1].name, "selftest");
assert_eq!(metadata.packages[0].targets[1].kind[0], "test");
assert_eq!(metadata.packages[0].targets[1].crate_types[0], "bin");
// Hack until the package metadata field reaches the stable channel (in version 1.27).
if env::var("TRAVIS_RUST_VERSION") != Ok("stable".into()) {
let package_metadata = &metadata.packages[0].metadata.as_object()
.expect("package.metadata must be a table. \
NOTE: This test currently only works on the beta and nightly channel.");
assert_eq!(package_metadata.len(), 1);
let value = package_metadata.get("cargo_metadata_test").unwrap();
let test_package_metadata: TestPackageMetadata = serde_json::from_value(value.clone())
.unwrap();
assert_eq!(test_package_metadata, TestPackageMetadata {
some_field: true,
other_field: "foo".into(),
});
}
}
#[test]
fn error1() {
match cargo_metadata::metadata_deps(Some(Path::new("foo")), true) {
Err(Error(ErrorKind::CargoMetadata(s), _)) => assert_eq!(
s.trim(),
"error: the manifest-path must be a path to a Cargo.toml file"
),
_ => unreachable!(),
}
}
#[test]
fn error2() {
match cargo_metadata::metadata_deps(Some(Path::new("foo/Cargo.toml")), true) {
Err(Error(ErrorKind::CargoMetadata(s), _)) => assert_eq!(
s.trim(),
"error: manifest path `foo/Cargo.toml` does not exist"
),
_ => unreachable!(),
}
}
#[test]
fn metadata_deps() {
let metadata = cargo_metadata::metadata_deps(Some(Path::new("Cargo.toml")), true).unwrap();
let this = metadata
.packages
.iter()
.find(|package| package.name == "cargo_metadata")
.expect("Did not find ourselves");
assert_eq!(this.name, "cargo_metadata");
assert_eq!(this.targets.len(), 2);
assert_eq!(this.targets[0].name, "cargo_metadata");
assert_eq!(this.targets[0].kind[0], "lib");
assert_eq!(this.targets[0].crate_types[0], "lib");
assert_eq!(this.targets[1].name, "selftest");
assert_eq!(this.targets[1].kind[0], "test");
assert_eq!(this.targets[1].crate_types[0], "bin");
let dependencies = &this.dependencies;
let serde = dependencies
.iter()
.find(|dep| dep.name == "serde")
.expect("Did not find serde dependency");
assert_eq!(serde.kind, cargo_metadata::DependencyKind::Normal);
assert!(!serde.req.matches(&Version::parse("1.0.0").unwrap()));
assert!(serde.req.matches(&Version::parse("1.99.99").unwrap()));
assert!(!serde.req.matches(&Version::parse("2.0.0").unwrap()));
}
#[test]
fn workspace_member_serialization_deserialization() {
let original =
"\"security-framework 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)\"";
let member: cargo_metadata::WorkspaceMember = serde_json::from_str(original).unwrap();
assert_eq!(member.name(), "security-framework");
assert_eq!(member.version(), Version::new(0, 1, 16));
assert_eq!(
member.url(),
"registry+https://github.com/rust-lang/crates.io-index"
);
let serialized = serde_json::to_string(&member).unwrap();
assert_eq!(serialized, original);
}