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 _ != ©_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