1f1555e47Sopenharmony_ciuse super::AutoCfg;
2f1555e47Sopenharmony_ciuse std::env;
3f1555e47Sopenharmony_ciuse std::path::Path;
4f1555e47Sopenharmony_ci
5f1555e47Sopenharmony_ciimpl AutoCfg {
6f1555e47Sopenharmony_ci    fn core_std(&self, path: &str) -> String {
7f1555e47Sopenharmony_ci        let krate = if self.no_std { "core" } else { "std" };
8f1555e47Sopenharmony_ci        format!("{}::{}", krate, path)
9f1555e47Sopenharmony_ci    }
10f1555e47Sopenharmony_ci
11f1555e47Sopenharmony_ci    fn assert_std(&self, probe_result: bool) {
12f1555e47Sopenharmony_ci        assert_eq!(!self.no_std, probe_result);
13f1555e47Sopenharmony_ci    }
14f1555e47Sopenharmony_ci
15f1555e47Sopenharmony_ci    fn assert_min(&self, major: usize, minor: usize, probe_result: bool) {
16f1555e47Sopenharmony_ci        assert_eq!(self.probe_rustc_version(major, minor), probe_result);
17f1555e47Sopenharmony_ci    }
18f1555e47Sopenharmony_ci
19f1555e47Sopenharmony_ci    fn for_test() -> Result<Self, super::error::Error> {
20f1555e47Sopenharmony_ci        match env::var_os("TESTS_TARGET_DIR") {
21f1555e47Sopenharmony_ci            Some(d) => Self::with_dir(d),
22f1555e47Sopenharmony_ci            None => Self::with_dir("target"),
23f1555e47Sopenharmony_ci        }
24f1555e47Sopenharmony_ci    }
25f1555e47Sopenharmony_ci}
26f1555e47Sopenharmony_ci
27f1555e47Sopenharmony_ci#[test]
28f1555e47Sopenharmony_cifn autocfg_version() {
29f1555e47Sopenharmony_ci    let ac = AutoCfg::for_test().unwrap();
30f1555e47Sopenharmony_ci    println!("version: {:?}", ac.rustc_version);
31f1555e47Sopenharmony_ci    assert!(ac.probe_rustc_version(1, 0));
32f1555e47Sopenharmony_ci}
33f1555e47Sopenharmony_ci
34f1555e47Sopenharmony_ci#[test]
35f1555e47Sopenharmony_cifn version_cmp() {
36f1555e47Sopenharmony_ci    use super::version::Version;
37f1555e47Sopenharmony_ci    let v123 = Version::new(1, 2, 3);
38f1555e47Sopenharmony_ci
39f1555e47Sopenharmony_ci    assert!(Version::new(1, 0, 0) < v123);
40f1555e47Sopenharmony_ci    assert!(Version::new(1, 2, 2) < v123);
41f1555e47Sopenharmony_ci    assert!(Version::new(1, 2, 3) == v123);
42f1555e47Sopenharmony_ci    assert!(Version::new(1, 2, 4) > v123);
43f1555e47Sopenharmony_ci    assert!(Version::new(1, 10, 0) > v123);
44f1555e47Sopenharmony_ci    assert!(Version::new(2, 0, 0) > v123);
45f1555e47Sopenharmony_ci}
46f1555e47Sopenharmony_ci
47f1555e47Sopenharmony_ci#[test]
48f1555e47Sopenharmony_cifn probe_add() {
49f1555e47Sopenharmony_ci    let ac = AutoCfg::for_test().unwrap();
50f1555e47Sopenharmony_ci    let add = ac.core_std("ops::Add");
51f1555e47Sopenharmony_ci    let add_rhs = add.clone() + "<i32>";
52f1555e47Sopenharmony_ci    let add_rhs_output = add.clone() + "<i32, Output = i32>";
53f1555e47Sopenharmony_ci    let dyn_add_rhs_output = "dyn ".to_string() + &*add_rhs_output;
54f1555e47Sopenharmony_ci    assert!(ac.probe_path(&add));
55f1555e47Sopenharmony_ci    assert!(ac.probe_trait(&add));
56f1555e47Sopenharmony_ci    assert!(ac.probe_trait(&add_rhs));
57f1555e47Sopenharmony_ci    assert!(ac.probe_trait(&add_rhs_output));
58f1555e47Sopenharmony_ci    ac.assert_min(1, 27, ac.probe_type(&dyn_add_rhs_output));
59f1555e47Sopenharmony_ci}
60f1555e47Sopenharmony_ci
61f1555e47Sopenharmony_ci#[test]
62f1555e47Sopenharmony_cifn probe_as_ref() {
63f1555e47Sopenharmony_ci    let ac = AutoCfg::for_test().unwrap();
64f1555e47Sopenharmony_ci    let as_ref = ac.core_std("convert::AsRef");
65f1555e47Sopenharmony_ci    let as_ref_str = as_ref.clone() + "<str>";
66f1555e47Sopenharmony_ci    let dyn_as_ref_str = "dyn ".to_string() + &*as_ref_str;
67f1555e47Sopenharmony_ci    assert!(ac.probe_path(&as_ref));
68f1555e47Sopenharmony_ci    assert!(ac.probe_trait(&as_ref_str));
69f1555e47Sopenharmony_ci    assert!(ac.probe_type(&as_ref_str));
70f1555e47Sopenharmony_ci    ac.assert_min(1, 27, ac.probe_type(&dyn_as_ref_str));
71f1555e47Sopenharmony_ci}
72f1555e47Sopenharmony_ci
73f1555e47Sopenharmony_ci#[test]
74f1555e47Sopenharmony_cifn probe_i128() {
75f1555e47Sopenharmony_ci    let ac = AutoCfg::for_test().unwrap();
76f1555e47Sopenharmony_ci    let i128_path = ac.core_std("i128");
77f1555e47Sopenharmony_ci    ac.assert_min(1, 26, ac.probe_path(&i128_path));
78f1555e47Sopenharmony_ci    ac.assert_min(1, 26, ac.probe_type("i128"));
79f1555e47Sopenharmony_ci}
80f1555e47Sopenharmony_ci
81f1555e47Sopenharmony_ci#[test]
82f1555e47Sopenharmony_cifn probe_sum() {
83f1555e47Sopenharmony_ci    let ac = AutoCfg::for_test().unwrap();
84f1555e47Sopenharmony_ci    let sum = ac.core_std("iter::Sum");
85f1555e47Sopenharmony_ci    let sum_i32 = sum.clone() + "<i32>";
86f1555e47Sopenharmony_ci    let dyn_sum_i32 = "dyn ".to_string() + &*sum_i32;
87f1555e47Sopenharmony_ci    ac.assert_min(1, 12, ac.probe_path(&sum));
88f1555e47Sopenharmony_ci    ac.assert_min(1, 12, ac.probe_trait(&sum));
89f1555e47Sopenharmony_ci    ac.assert_min(1, 12, ac.probe_trait(&sum_i32));
90f1555e47Sopenharmony_ci    ac.assert_min(1, 12, ac.probe_type(&sum_i32));
91f1555e47Sopenharmony_ci    ac.assert_min(1, 27, ac.probe_type(&dyn_sum_i32));
92f1555e47Sopenharmony_ci}
93f1555e47Sopenharmony_ci
94f1555e47Sopenharmony_ci#[test]
95f1555e47Sopenharmony_cifn probe_std() {
96f1555e47Sopenharmony_ci    let ac = AutoCfg::for_test().unwrap();
97f1555e47Sopenharmony_ci    ac.assert_std(ac.probe_sysroot_crate("std"));
98f1555e47Sopenharmony_ci}
99f1555e47Sopenharmony_ci
100f1555e47Sopenharmony_ci#[test]
101f1555e47Sopenharmony_cifn probe_alloc() {
102f1555e47Sopenharmony_ci    let ac = AutoCfg::for_test().unwrap();
103f1555e47Sopenharmony_ci    ac.assert_min(1, 36, ac.probe_sysroot_crate("alloc"));
104f1555e47Sopenharmony_ci}
105f1555e47Sopenharmony_ci
106f1555e47Sopenharmony_ci#[test]
107f1555e47Sopenharmony_cifn probe_bad_sysroot_crate() {
108f1555e47Sopenharmony_ci    let ac = AutoCfg::for_test().unwrap();
109f1555e47Sopenharmony_ci    assert!(!ac.probe_sysroot_crate("doesnt_exist"));
110f1555e47Sopenharmony_ci}
111f1555e47Sopenharmony_ci
112f1555e47Sopenharmony_ci#[test]
113f1555e47Sopenharmony_cifn probe_no_std() {
114f1555e47Sopenharmony_ci    let ac = AutoCfg::for_test().unwrap();
115f1555e47Sopenharmony_ci    assert!(ac.probe_type("i32"));
116f1555e47Sopenharmony_ci    assert!(ac.probe_type("[i32]"));
117f1555e47Sopenharmony_ci    ac.assert_std(ac.probe_type("Vec<i32>"));
118f1555e47Sopenharmony_ci}
119f1555e47Sopenharmony_ci
120f1555e47Sopenharmony_ci#[test]
121f1555e47Sopenharmony_cifn probe_expression() {
122f1555e47Sopenharmony_ci    let ac = AutoCfg::for_test().unwrap();
123f1555e47Sopenharmony_ci    assert!(ac.probe_expression(r#""test".trim_left()"#));
124f1555e47Sopenharmony_ci    ac.assert_min(1, 30, ac.probe_expression(r#""test".trim_start()"#));
125f1555e47Sopenharmony_ci    ac.assert_std(ac.probe_expression("[1, 2, 3].to_vec()"));
126f1555e47Sopenharmony_ci}
127f1555e47Sopenharmony_ci
128f1555e47Sopenharmony_ci#[test]
129f1555e47Sopenharmony_cifn probe_constant() {
130f1555e47Sopenharmony_ci    let ac = AutoCfg::for_test().unwrap();
131f1555e47Sopenharmony_ci    assert!(ac.probe_constant("1 + 2 + 3"));
132f1555e47Sopenharmony_ci    ac.assert_min(1, 33, ac.probe_constant("{ let x = 1 + 2 + 3; x * x }"));
133f1555e47Sopenharmony_ci    ac.assert_min(1, 39, ac.probe_constant(r#""test".len()"#));
134f1555e47Sopenharmony_ci}
135f1555e47Sopenharmony_ci
136f1555e47Sopenharmony_ci#[test]
137f1555e47Sopenharmony_cifn dir_does_not_contain_target() {
138f1555e47Sopenharmony_ci    assert!(!super::dir_contains_target(
139f1555e47Sopenharmony_ci        &Some("x86_64-unknown-linux-gnu".into()),
140f1555e47Sopenharmony_ci        Path::new("/project/target/debug/build/project-ea75983148559682/out"),
141f1555e47Sopenharmony_ci        None,
142f1555e47Sopenharmony_ci    ));
143f1555e47Sopenharmony_ci}
144f1555e47Sopenharmony_ci
145f1555e47Sopenharmony_ci#[test]
146f1555e47Sopenharmony_cifn dir_does_contain_target() {
147f1555e47Sopenharmony_ci    assert!(super::dir_contains_target(
148f1555e47Sopenharmony_ci        &Some("x86_64-unknown-linux-gnu".into()),
149f1555e47Sopenharmony_ci        Path::new(
150f1555e47Sopenharmony_ci            "/project/target/x86_64-unknown-linux-gnu/debug/build/project-0147aca016480b9d/out"
151f1555e47Sopenharmony_ci        ),
152f1555e47Sopenharmony_ci        None,
153f1555e47Sopenharmony_ci    ));
154f1555e47Sopenharmony_ci}
155f1555e47Sopenharmony_ci
156f1555e47Sopenharmony_ci#[test]
157f1555e47Sopenharmony_cifn dir_does_not_contain_target_with_custom_target_dir() {
158f1555e47Sopenharmony_ci    assert!(!super::dir_contains_target(
159f1555e47Sopenharmony_ci        &Some("x86_64-unknown-linux-gnu".into()),
160f1555e47Sopenharmony_ci        Path::new("/project/custom/debug/build/project-ea75983148559682/out"),
161f1555e47Sopenharmony_ci        Some("custom".into()),
162f1555e47Sopenharmony_ci    ));
163f1555e47Sopenharmony_ci}
164f1555e47Sopenharmony_ci
165f1555e47Sopenharmony_ci#[test]
166f1555e47Sopenharmony_cifn dir_does_contain_target_with_custom_target_dir() {
167f1555e47Sopenharmony_ci    assert!(super::dir_contains_target(
168f1555e47Sopenharmony_ci        &Some("x86_64-unknown-linux-gnu".into()),
169f1555e47Sopenharmony_ci        Path::new(
170f1555e47Sopenharmony_ci            "/project/custom/x86_64-unknown-linux-gnu/debug/build/project-0147aca016480b9d/out"
171f1555e47Sopenharmony_ci        ),
172f1555e47Sopenharmony_ci        Some("custom".into()),
173f1555e47Sopenharmony_ci    ));
174f1555e47Sopenharmony_ci}
175