]> git.proxmox.com Git - rustc.git/blame - vendor/cargo_metadata/tests/selftest.rs
New upstream version 1.44.1+dfsg1
[rustc.git] / vendor / cargo_metadata / tests / selftest.rs
CommitLineData
ba9703b0
XL
1extern crate cargo_metadata;
2extern crate semver;
3extern crate serde_json;
4
5#[macro_use]
6extern crate serde_derive;
7
8use std::env::current_dir;
9use std::path::{Path, PathBuf};
10
11use semver::Version;
12
13use cargo_metadata::{CargoOpt, Error, MetadataCommand};
14
15#[derive(Debug, PartialEq, Eq, Deserialize)]
16struct TestPackageMetadata {
17 some_field: bool,
18 other_field: String,
19}
20
21#[test]
22fn metadata() {
23 let metadata = MetadataCommand::new().no_deps().exec().unwrap();
24
25 assert_eq!(
26 current_dir().unwrap().join("target"),
27 Path::new(&metadata.target_directory)
28 );
29
30 let this = &metadata.packages[0];
31 assert_eq!(this.name, "cargo_metadata");
32 assert_eq!(this.targets.len(), 3);
33
34 let lib = this
35 .targets
36 .iter()
37 .find(|t| t.name == "cargo_metadata")
38 .unwrap();
39 assert_eq!(lib.kind[0], "lib");
40 assert_eq!(lib.crate_types[0], "lib");
41
42 let selftest = this.targets.iter().find(|t| t.name == "selftest").unwrap();
43 assert_eq!(selftest.name, "selftest");
44 assert_eq!(selftest.kind[0], "test");
45 assert_eq!(selftest.crate_types[0], "bin");
46
47 let package_metadata = &metadata.packages[0]
48 .metadata
49 .as_object()
50 .expect("package.metadata must be a table.");
51 assert_eq!(package_metadata.len(), 1);
52
53 let value = package_metadata.get("cargo_metadata_test").unwrap();
54 let test_package_metadata: TestPackageMetadata = serde_json::from_value(value.clone()).unwrap();
55 assert_eq!(
56 test_package_metadata,
57 TestPackageMetadata {
58 some_field: true,
59 other_field: "foo".into(),
60 }
61 );
62}
63
64#[test]
65fn builder_interface() {
66 let _ = MetadataCommand::new()
67 .manifest_path("Cargo.toml")
68 .exec()
69 .unwrap();
70 let _ = MetadataCommand::new()
71 .manifest_path(String::from("Cargo.toml"))
72 .exec()
73 .unwrap();
74 let _ = MetadataCommand::new()
75 .manifest_path(PathBuf::from("Cargo.toml"))
76 .exec()
77 .unwrap();
78 let _ = MetadataCommand::new()
79 .manifest_path("Cargo.toml")
80 .no_deps()
81 .exec()
82 .unwrap();
83 let _ = MetadataCommand::new()
84 .manifest_path("Cargo.toml")
85 .features(CargoOpt::AllFeatures)
86 .exec()
87 .unwrap();
88 let _ = MetadataCommand::new()
89 .manifest_path("Cargo.toml")
90 .current_dir(current_dir().unwrap())
91 .exec()
92 .unwrap();
93}
94
95#[test]
96fn error1() {
97 match MetadataCommand::new().manifest_path("foo").exec() {
98 Err(Error::CargoMetadata { stderr }) => assert_eq!(
99 stderr.trim(),
100 "error: the manifest-path must be a path to a Cargo.toml file"
101 ),
102 _ => unreachable!(),
103 }
104}
105
106#[test]
107fn error2() {
108 match MetadataCommand::new()
109 .manifest_path("foo/Cargo.toml")
110 .exec()
111 {
112 Err(Error::CargoMetadata { stderr }) => assert_eq!(
113 stderr.trim(),
114 "error: manifest path `foo/Cargo.toml` does not exist"
115 ),
116 _ => unreachable!(),
117 }
118}
119
120#[test]
121fn cargo_path() {
122 match MetadataCommand::new()
123 .cargo_path("this does not exist")
124 .exec()
125 {
126 Err(Error::Io(e)) => assert_eq!(e.kind(), std::io::ErrorKind::NotFound),
127 _ => unreachable!(),
128 }
129}
130
131#[test]
132fn metadata_deps() {
133 std::env::set_var("CARGO_PROFILE", "3");
134 let metadata = MetadataCommand::new()
135 .manifest_path("Cargo.toml")
136 .exec()
137 .unwrap();
138 let this_id = metadata
139 .workspace_members
140 .first()
141 .expect("Did not find ourselves");
142 let this = &metadata[this_id];
143
144 assert_eq!(this.name, "cargo_metadata");
145
146 let lib = this
147 .targets
148 .iter()
149 .find(|t| t.name == "cargo_metadata")
150 .unwrap();
151 assert_eq!(lib.kind[0], "lib");
152 assert_eq!(lib.crate_types[0], "lib");
153
154 let selftest = this.targets.iter().find(|t| t.name == "selftest").unwrap();
155 assert_eq!(selftest.name, "selftest");
156 assert_eq!(selftest.kind[0], "test");
157 assert_eq!(selftest.crate_types[0], "bin");
158
159 let dependencies = &this.dependencies;
160
161 let serde = dependencies
162 .iter()
163 .find(|dep| dep.name == "serde")
164 .expect("Did not find serde dependency");
165
166 assert_eq!(serde.kind, cargo_metadata::DependencyKind::Normal);
167 assert!(!serde.req.matches(&Version::parse("1.0.0").unwrap()));
168 assert!(serde.req.matches(&Version::parse("1.99.99").unwrap()));
169 assert!(!serde.req.matches(&Version::parse("2.0.0").unwrap()));
170}