]>
Commit | Line | Data |
---|---|---|
ba9703b0 XL |
1 | extern crate cargo_metadata; |
2 | extern crate semver; | |
3 | extern crate serde_json; | |
4 | ||
5 | #[macro_use] | |
6 | extern crate serde_derive; | |
7 | ||
8 | use std::env::current_dir; | |
9 | use std::path::{Path, PathBuf}; | |
10 | ||
11 | use semver::Version; | |
12 | ||
13 | use cargo_metadata::{CargoOpt, Error, MetadataCommand}; | |
14 | ||
15 | #[derive(Debug, PartialEq, Eq, Deserialize)] | |
16 | struct TestPackageMetadata { | |
17 | some_field: bool, | |
18 | other_field: String, | |
19 | } | |
20 | ||
21 | #[test] | |
22 | fn 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] | |
65 | fn 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] | |
96 | fn 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] | |
107 | fn 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] | |
121 | fn 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] | |
132 | fn 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 | } |