1d0a2ff35Sopenharmony_ci#[macro_use]
2d0a2ff35Sopenharmony_ciextern crate lazy_static;
3d0a2ff35Sopenharmony_ciuse std::collections::HashMap;
4d0a2ff35Sopenharmony_ci
5d0a2ff35Sopenharmony_cilazy_static! {
6d0a2ff35Sopenharmony_ci    /// Documentation!
7d0a2ff35Sopenharmony_ci    pub static ref NUMBER: u32 = times_two(3);
8d0a2ff35Sopenharmony_ci
9d0a2ff35Sopenharmony_ci    static ref ARRAY_BOXES: [Box<u32>; 3] = [Box::new(1), Box::new(2), Box::new(3)];
10d0a2ff35Sopenharmony_ci
11d0a2ff35Sopenharmony_ci    /// More documentation!
12d0a2ff35Sopenharmony_ci    #[allow(unused_variables)]
13d0a2ff35Sopenharmony_ci    #[derive(Copy, Clone, Debug)]
14d0a2ff35Sopenharmony_ci    pub static ref STRING: String = "hello".to_string();
15d0a2ff35Sopenharmony_ci
16d0a2ff35Sopenharmony_ci    static ref HASHMAP: HashMap<u32, &'static str> = {
17d0a2ff35Sopenharmony_ci        let mut m = HashMap::new();
18d0a2ff35Sopenharmony_ci        m.insert(0, "abc");
19d0a2ff35Sopenharmony_ci        m.insert(1, "def");
20d0a2ff35Sopenharmony_ci        m.insert(2, "ghi");
21d0a2ff35Sopenharmony_ci        m
22d0a2ff35Sopenharmony_ci    };
23d0a2ff35Sopenharmony_ci
24d0a2ff35Sopenharmony_ci    // This should not compile if the unsafe is removed.
25d0a2ff35Sopenharmony_ci    static ref UNSAFE: u32 = unsafe {
26d0a2ff35Sopenharmony_ci        std::mem::transmute::<i32, u32>(-1)
27d0a2ff35Sopenharmony_ci    };
28d0a2ff35Sopenharmony_ci}
29d0a2ff35Sopenharmony_ci
30d0a2ff35Sopenharmony_cilazy_static! {
31d0a2ff35Sopenharmony_ci    static ref S1: &'static str = "a";
32d0a2ff35Sopenharmony_ci    static ref S2: &'static str = "b";
33d0a2ff35Sopenharmony_ci}
34d0a2ff35Sopenharmony_cilazy_static! {
35d0a2ff35Sopenharmony_ci    static ref S3: String = [*S1, *S2].join("");
36d0a2ff35Sopenharmony_ci}
37d0a2ff35Sopenharmony_ci
38d0a2ff35Sopenharmony_ci#[test]
39d0a2ff35Sopenharmony_cifn s3() {
40d0a2ff35Sopenharmony_ci    assert_eq!(&*S3, "ab");
41d0a2ff35Sopenharmony_ci}
42d0a2ff35Sopenharmony_ci
43d0a2ff35Sopenharmony_cifn times_two(n: u32) -> u32 {
44d0a2ff35Sopenharmony_ci    n * 2
45d0a2ff35Sopenharmony_ci}
46d0a2ff35Sopenharmony_ci
47d0a2ff35Sopenharmony_ci#[test]
48d0a2ff35Sopenharmony_cifn test_basic() {
49d0a2ff35Sopenharmony_ci    assert_eq!(&**STRING, "hello");
50d0a2ff35Sopenharmony_ci    assert_eq!(*NUMBER, 6);
51d0a2ff35Sopenharmony_ci    assert!(HASHMAP.get(&1).is_some());
52d0a2ff35Sopenharmony_ci    assert!(HASHMAP.get(&3).is_none());
53d0a2ff35Sopenharmony_ci    assert_eq!(&*ARRAY_BOXES, &[Box::new(1), Box::new(2), Box::new(3)]);
54d0a2ff35Sopenharmony_ci    assert_eq!(*UNSAFE, std::u32::MAX);
55d0a2ff35Sopenharmony_ci}
56d0a2ff35Sopenharmony_ci
57d0a2ff35Sopenharmony_ci#[test]
58d0a2ff35Sopenharmony_cifn test_repeat() {
59d0a2ff35Sopenharmony_ci    assert_eq!(*NUMBER, 6);
60d0a2ff35Sopenharmony_ci    assert_eq!(*NUMBER, 6);
61d0a2ff35Sopenharmony_ci    assert_eq!(*NUMBER, 6);
62d0a2ff35Sopenharmony_ci}
63d0a2ff35Sopenharmony_ci
64d0a2ff35Sopenharmony_ci#[test]
65d0a2ff35Sopenharmony_cifn test_meta() {
66d0a2ff35Sopenharmony_ci    // this would not compile if STRING were not marked #[derive(Copy, Clone)]
67d0a2ff35Sopenharmony_ci    let copy_of_string = STRING;
68d0a2ff35Sopenharmony_ci    // just to make sure it was copied
69d0a2ff35Sopenharmony_ci    assert!(&STRING as *const _ != &copy_of_string as *const _);
70d0a2ff35Sopenharmony_ci
71d0a2ff35Sopenharmony_ci    // this would not compile if STRING were not marked #[derive(Debug)]
72d0a2ff35Sopenharmony_ci    assert_eq!(format!("{:?}", STRING), "STRING { __private_field: () }".to_string());
73d0a2ff35Sopenharmony_ci}
74d0a2ff35Sopenharmony_ci
75d0a2ff35Sopenharmony_cimod visibility {
76d0a2ff35Sopenharmony_ci    lazy_static! {
77d0a2ff35Sopenharmony_ci        pub static ref FOO: Box<u32> = Box::new(0);
78d0a2ff35Sopenharmony_ci        static ref BAR: Box<u32> = Box::new(98);
79d0a2ff35Sopenharmony_ci    }
80d0a2ff35Sopenharmony_ci
81d0a2ff35Sopenharmony_ci    pub mod inner {
82d0a2ff35Sopenharmony_ci        lazy_static! {
83d0a2ff35Sopenharmony_ci            pub(in visibility) static ref BAZ: Box<u32> = Box::new(42);
84d0a2ff35Sopenharmony_ci            pub(crate) static ref BAG: Box<u32> = Box::new(37);
85d0a2ff35Sopenharmony_ci        }
86d0a2ff35Sopenharmony_ci    }
87d0a2ff35Sopenharmony_ci
88d0a2ff35Sopenharmony_ci    #[test]
89d0a2ff35Sopenharmony_ci    fn sub_test() {
90d0a2ff35Sopenharmony_ci        assert_eq!(**FOO, 0);
91d0a2ff35Sopenharmony_ci        assert_eq!(**BAR, 98);
92d0a2ff35Sopenharmony_ci        assert_eq!(**inner::BAZ, 42);
93d0a2ff35Sopenharmony_ci        assert_eq!(**inner::BAG, 37);
94d0a2ff35Sopenharmony_ci    }
95d0a2ff35Sopenharmony_ci}
96d0a2ff35Sopenharmony_ci
97d0a2ff35Sopenharmony_ci#[test]
98d0a2ff35Sopenharmony_cifn test_visibility() {
99d0a2ff35Sopenharmony_ci    assert_eq!(*visibility::FOO, Box::new(0));
100d0a2ff35Sopenharmony_ci    assert_eq!(*visibility::inner::BAG, Box::new(37));
101d0a2ff35Sopenharmony_ci}
102d0a2ff35Sopenharmony_ci
103d0a2ff35Sopenharmony_ci// This should not cause a warning about a missing Copy implementation
104d0a2ff35Sopenharmony_cilazy_static! {
105d0a2ff35Sopenharmony_ci    pub static ref VAR: i32 = { 0 };
106d0a2ff35Sopenharmony_ci}
107d0a2ff35Sopenharmony_ci
108d0a2ff35Sopenharmony_ci#[derive(Copy, Clone, Debug, PartialEq)]
109d0a2ff35Sopenharmony_cistruct X;
110d0a2ff35Sopenharmony_cistruct Once(X);
111d0a2ff35Sopenharmony_ciconst ONCE_INIT: Once = Once(X);
112d0a2ff35Sopenharmony_cistatic DATA: X = X;
113d0a2ff35Sopenharmony_cistatic ONCE: X = X;
114d0a2ff35Sopenharmony_cifn require_sync() -> X { X }
115d0a2ff35Sopenharmony_cifn transmute() -> X { X }
116d0a2ff35Sopenharmony_cifn __static_ref_initialize() -> X { X }
117d0a2ff35Sopenharmony_cifn test(_: Vec<X>) -> X { X }
118d0a2ff35Sopenharmony_ci
119d0a2ff35Sopenharmony_ci// All these names should not be shadowed
120d0a2ff35Sopenharmony_cilazy_static! {
121d0a2ff35Sopenharmony_ci    static ref ITEM_NAME_TEST: X = {
122d0a2ff35Sopenharmony_ci        test(vec![X, Once(X).0, ONCE_INIT.0, DATA, ONCE,
123d0a2ff35Sopenharmony_ci                  require_sync(), transmute(),
124d0a2ff35Sopenharmony_ci                  // Except this, which will sadly be shadowed by internals:
125d0a2ff35Sopenharmony_ci                  // __static_ref_initialize()
126d0a2ff35Sopenharmony_ci                  ])
127d0a2ff35Sopenharmony_ci    };
128d0a2ff35Sopenharmony_ci}
129d0a2ff35Sopenharmony_ci
130d0a2ff35Sopenharmony_ci#[test]
131d0a2ff35Sopenharmony_cifn item_name_shadowing() {
132d0a2ff35Sopenharmony_ci    assert_eq!(*ITEM_NAME_TEST, X);
133d0a2ff35Sopenharmony_ci}
134d0a2ff35Sopenharmony_ci
135d0a2ff35Sopenharmony_ciuse std::sync::atomic::AtomicBool;
136d0a2ff35Sopenharmony_ci#[allow(deprecated)]
137d0a2ff35Sopenharmony_ciuse std::sync::atomic::ATOMIC_BOOL_INIT;
138d0a2ff35Sopenharmony_ciuse std::sync::atomic::Ordering::SeqCst;
139d0a2ff35Sopenharmony_ci
140d0a2ff35Sopenharmony_ci#[allow(deprecated)]
141d0a2ff35Sopenharmony_cistatic PRE_INIT_FLAG: AtomicBool = ATOMIC_BOOL_INIT;
142d0a2ff35Sopenharmony_ci
143d0a2ff35Sopenharmony_cilazy_static! {
144d0a2ff35Sopenharmony_ci    static ref PRE_INIT: () = {
145d0a2ff35Sopenharmony_ci        PRE_INIT_FLAG.store(true, SeqCst);
146d0a2ff35Sopenharmony_ci        ()
147d0a2ff35Sopenharmony_ci    };
148d0a2ff35Sopenharmony_ci}
149d0a2ff35Sopenharmony_ci
150d0a2ff35Sopenharmony_ci#[test]
151d0a2ff35Sopenharmony_cifn pre_init() {
152d0a2ff35Sopenharmony_ci    assert_eq!(PRE_INIT_FLAG.load(SeqCst), false);
153d0a2ff35Sopenharmony_ci    lazy_static::initialize(&PRE_INIT);
154d0a2ff35Sopenharmony_ci    assert_eq!(PRE_INIT_FLAG.load(SeqCst), true);
155d0a2ff35Sopenharmony_ci}
156d0a2ff35Sopenharmony_ci
157d0a2ff35Sopenharmony_cilazy_static! {
158d0a2ff35Sopenharmony_ci    static ref LIFETIME_NAME: for<'a> fn(&'a u8) = { fn f(_: &u8) {} f };
159d0a2ff35Sopenharmony_ci}
160d0a2ff35Sopenharmony_ci
161d0a2ff35Sopenharmony_ci#[test]
162d0a2ff35Sopenharmony_cifn lifetime_name() {
163d0a2ff35Sopenharmony_ci    let _ = LIFETIME_NAME;
164d0a2ff35Sopenharmony_ci}
165