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