1mod api;
2mod error;
3mod wrapper;
4
5pub use error::*;
6pub use wrapper::*;
7
8#[cfg(test)]
9mod tests {
10 use std::str::FromStr;
11
12 use crate::*;
13
14 const SAMPLE_IMEIS_IPHONE_X: [&str; 10] = [
15 "356741089728686",
16 "356741088901532",
17 "356741086755328",
18 "356741084004687",
19 "356741081753138",
20 "356741082891218",
21 "356741080856916",
22 "356741082001776",
23 "356741089053275",
24 "356741089625577",
25 ];
26
27 const SAMPLE_IMEIS_IPHONE_11: [&str; 10] = [
28 "356656424381449",
29 "356656422684059",
30 "356656420949041",
31 "356656420595471",
32 "356656426436027",
33 "356656426168323",
34 "356656425227245",
35 "356656427178131",
36 "356656420946799",
37 "356656426277561",
38 ];
39
40 const SAMPLE_IMEIS_IPHONE_12: [&str; 10] = [
41 "356741089728686",
42 "356741088901532",
43 "356741086755328",
44 "356741084004687",
45 "356741081753138",
46 "356741082891218",
47 "356741080856916",
48 "356741082001776",
49 "356741089053275",
50 "356741089625577",
51 ];
52
53 const SAMPLE_IMEIS_IPHONE_13: [&str; 10] = [
54 "353031119769899",
55 "353031114733023",
56 "353031119889093",
57 "353031119201240",
58 "353031117066769",
59 "353031114152638",
60 "353031119177119",
61 "353031112524432",
62 "353031112510548",
63 "353031117786374",
64 ];
65
66 const SAMPLE_IMEIS_IPHONE_14: [&str; 10] = [
67 "356663518856450",
68 "356663512611182",
69 "356663512926382",
70 "356663514502413",
71 "356663514265169",
72 "356663516845729",
73 "356663519115005",
74 "356663512314985",
75 "356663514250344",
76 "356663511213253",
77 ];
78
79 const SAMPLE_IMEIS_IPHONE_15: [&str; 10] = [
80 "357292743045215",
81 "357292742100441",
82 "357292742720628",
83 "357292745630642",
84 "357292748317395",
85 "357292743231849",
86 "357292749889186",
87 "357292746950403",
88 "357292744783558",
89 "357292746107053",
90 ];
91
92 const SAMPLE_IMEIS_SAMSUNG_S10: [&str; 10] = [
93 "351725105350612",
94 "351725107128370",
95 "351725102267413",
96 "351725101223904",
97 "351725108018653",
98 "351725102151096",
99 "351725101792791",
100 "351725106100842",
101 "351725101698170",
102 "351725100178711",
103 ];
104
105 const SAMPLE_IMEIS_SAMSUNG_S20: [&str; 10] = [
106 "355623112952700",
107 "355623114222326",
108 "355623115133407",
109 "355623112353826",
110 "355623114613797",
111 "355623116570979",
112 "355623114819972",
113 "355623113858104",
114 "355623111265039",
115 "355623114676307",
116 ];
117
118 const SAMPLE_IMEIS_SAMSUNG_S21: [&str; 10] = [
119 "359043379809723",
120 "359043370680651",
121 "359043375805360",
122 "359043373735551",
123 "359043370097328",
124 "359043377664872",
125 "359043371381523",
126 "359043371473957",
127 "359043375057335",
128 "359043372667672",
129 ];
130
131 const SAMPLE_IMEIS_SAMSUNG_S22: [&str; 10] = [
132 "351561161836263",
133 "351561165123825",
134 "351561168188320",
135 "351561168458202",
136 "351561169492820",
137 "351561166778957",
138 "351561162831321",
139 "351561167705132",
140 "351561166478160",
141 "351561163409762",
142 ];
143
144 #[tokio::test]
145 #[ignore]
146 async fn get_iphone_info() {
147 dotenvy::dotenv().unwrap();
148 let api_key = std::env::var("API_KEY").unwrap();
149
150 assert_eq!(
151 get_imei_info(&api_key, SAMPLE_IMEIS_IPHONE_X[0]).await,
152 Ok(PhoneInfo {
153 imei: SAMPLE_IMEIS_IPHONE_X[0].try_into().unwrap(),
154 manufacturer: "APPLE".to_owned(),
155 model: "iPhone X".to_owned(),
156 })
157 );
158 }
159
160 #[tokio::test]
161 #[ignore]
162 async fn valid_tac_check() {
163 dotenvy::dotenv().unwrap();
164 let api_key = std::env::var("API_KEY").unwrap();
165 let tac = &SAMPLE_IMEIS_SAMSUNG_S10[0][0..8];
166
167 assert_eq!(
168 get_tac_info(&api_key, tac).await,
169 Ok(PhoneInfo {
170 imei: Tac::from_str(tac).unwrap().into(),
171 manufacturer: "SAMSUNG".to_owned(),
172 model: "Galaxy S10 Exynos".to_owned(),
173 })
174 );
175 }
176
177 #[test]
178 fn try_good_imei_from_string() {
179 macro_rules! try_imeis {
180 ( $prefix:expr; $( $postfix:expr ),* ) => {
181 $(
182 paste::paste! {
183 for sample_imei in [<SAMPLE_IMEIS_ $prefix _ $postfix>] {
184 println!("{}", sample_imei);
185 let imei = Imei::from_str(sample_imei);
186 println!("{:#?}", &imei);
187 assert!(imei.is_ok());
188 }
189 }
190 )*
191 };
192 }
193
194 try_imeis!(IPHONE; X, 11, 12, 13, 14, 15);
195 try_imeis!(SAMSUNG; S10, S20, S21, S22);
196 }
197
198 #[test]
199 fn try_good_imei_from_int() {
200 macro_rules! try_good_imei {
201 ( $value:literal; $( $numeric_type:ty ),*; $separated:expr ) => {
202 $(
203 assert_eq!(Imei::try_from($value as $numeric_type), Ok(Imei { digits: $separated }),);
204 )*
205 };
206 }
207
208 try_good_imei!(1234567897; i32, u32; [0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 7]);
209 try_good_imei!(
210 123456789012347; i64, u64, i128, u128, isize, usize;
211 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 7]
212 );
213 }
214
215 #[test]
216 fn try_good_tac_from_int() {
217 macro_rules! try_good_tac {
218 ( $value:literal; $( $numeric_type:ty ),*; $separated:expr ) => {
219 $(
220 assert_eq!(Tac::try_from($value as $numeric_type), Ok(Tac { digits: $separated }),);
221 )*
222 };
223 }
224
225 try_good_tac!(12345678; i32, u32, i64, u64, i128, u128, isize, usize; [1, 2, 3, 4, 5, 6, 7, 8]);
226 }
227
228 #[test]
229 fn try_bad_imei_from_int() {
230 macro_rules! try_bad_imei {
231 ( $value:literal; $( $numeric_type:ty ),* ) => {
232 $(
233 assert_eq!(Imei::try_from($value as $numeric_type), Err(ImeiWrapperError::ValueOutOfRange),);
234 )*
235 };
236 }
237
238 try_bad_imei!(-1; i32, i64, i128, isize);
239 try_bad_imei!(1234567890123456; i64, u64, i128, u128, isize, usize);
240 }
241
242 #[test]
243 fn try_bad_tac_from_int() {
244 macro_rules! try_bad_tac {
245 ( $value:literal; $( $numeric_type:ty ),* ) => {
246 $(
247 assert_eq!(Tac::try_from($value as $numeric_type), Err(ImeiWrapperError::ValueOutOfRange),);
248 )*
249 };
250 }
251
252 try_bad_tac!(-1; i32, i64, i128, isize);
253 try_bad_tac!(123456789; i32, u32, i64, u64, i128, u128, isize, usize);
254 }
255}