1 use std
::env
::current_dir
;
2 use std
::path
::PathBuf
;
6 use cargo_metadata
::{CargoOpt, Error, MetadataCommand}
;
7 use serde
::{Deserialize}
;
9 #[derive(Debug, PartialEq, Eq, Deserialize)]
10 struct TestPackageMetadata
{
17 let metadata
= MetadataCommand
::new().no_deps().exec().unwrap();
19 let this
= &metadata
.packages
[0];
20 assert_eq
!(this
.name
, "cargo_metadata");
21 assert_eq
!(this
.targets
.len(), 3);
26 .find(|t
| t
.name
== "cargo_metadata")
28 assert_eq
!(lib
.kind
[0], "lib");
29 assert_eq
!(lib
.crate_types
[0], "lib");
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");
36 let package_metadata
= &metadata
.packages
[0]
39 .expect("package.metadata must be a table.");
40 assert_eq
!(package_metadata
.len(), 1);
42 let value
= package_metadata
.get("cargo_metadata_test").unwrap();
43 let test_package_metadata
: TestPackageMetadata
= serde_json
::from_value(value
.clone()).unwrap();
45 test_package_metadata
,
48 other_field
: "foo".into(),
54 fn builder_interface() {
55 let _
= MetadataCommand
::new()
56 .manifest_path("Cargo.toml")
59 let _
= MetadataCommand
::new()
60 .manifest_path(String
::from("Cargo.toml"))
63 let _
= MetadataCommand
::new()
64 .manifest_path(PathBuf
::from("Cargo.toml"))
67 let _
= MetadataCommand
::new()
68 .manifest_path("Cargo.toml")
72 let _
= MetadataCommand
::new()
73 .manifest_path("Cargo.toml")
74 .features(CargoOpt
::AllFeatures
)
77 let _
= MetadataCommand
::new()
78 .manifest_path("Cargo.toml")
79 .current_dir(current_dir().unwrap())
86 match MetadataCommand
::new().manifest_path("foo").exec() {
87 Err(Error
::CargoMetadata { stderr }
) => assert_eq
!(
89 "error: the manifest-path must be a path to a Cargo.toml file"
97 match MetadataCommand
::new()
98 .manifest_path("foo/Cargo.toml")
101 Err(Error
::CargoMetadata { stderr }
) => assert_eq
!(
103 "error: manifest path `foo/Cargo.toml` does not exist"
111 match MetadataCommand
::new()
112 .cargo_path("this does not exist")
115 Err(Error
::Io(e
)) => assert_eq
!(e
.kind(), std
::io
::ErrorKind
::NotFound
),
122 std
::env
::set_var("CARGO_PROFILE", "3");
123 let metadata
= MetadataCommand
::new()
124 .manifest_path("Cargo.toml")
127 let this_id
= metadata
130 .expect("Did not find ourselves");
131 let this
= &metadata
[this_id
];
133 assert_eq
!(this
.name
, "cargo_metadata");
138 .find(|t
| t
.name
== "cargo_metadata")
140 assert_eq
!(lib
.kind
[0], "lib");
141 assert_eq
!(lib
.crate_types
[0], "lib");
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");
148 let dependencies
= &this
.dependencies
;
150 let serde
= dependencies
152 .find(|dep
| dep
.name
== "serde")
153 .expect("Did not find serde dependency");
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()));