inflector/cases/classcase/mod.rs
1#![deny(warnings)]
2use cases::case::*;
3#[cfg(feature = "heavyweight")]
4use string::singularize::to_singular;
5#[cfg(feature = "heavyweight")]
6/// Converts a `&str` to `ClassCase` `String`
7///
8/// ```
9/// use inflector::cases::classcase::to_class_case;
10/// let mock_string: &str = "FooBar";
11/// let expected_string: String = "FooBar".to_string();
12/// let asserted_string: String = to_class_case(mock_string);
13/// assert!(asserted_string == expected_string);
14///
15/// ```
16///
17/// ```
18/// use inflector::cases::classcase::to_class_case;
19/// let mock_string: &str = "FooBars";
20/// let expected_string: String = "FooBar".to_string();
21/// let asserted_string: String = to_class_case(mock_string);
22/// assert!(asserted_string == expected_string);
23///
24/// ```
25///
26/// ```
27/// use inflector::cases::classcase::to_class_case;
28/// let mock_string: &str = "Foo Bar";
29/// let expected_string: String = "FooBar".to_string();
30/// let asserted_string: String = to_class_case(mock_string);
31/// assert!(asserted_string == expected_string);
32///
33/// ```
34///
35/// ```
36/// use inflector::cases::classcase::to_class_case;
37/// let mock_string: &str = "foo-bar";
38/// let expected_string: String = "FooBar".to_string();
39/// let asserted_string: String = to_class_case(mock_string);
40/// assert!(asserted_string == expected_string);
41///
42/// ```
43///
44/// ```
45/// use inflector::cases::classcase::to_class_case;
46/// let mock_string: &str = "fooBar";
47/// let expected_string: String = "FooBar".to_string();
48/// let asserted_string: String = to_class_case(mock_string);
49/// assert!(asserted_string == expected_string);
50///
51/// ```
52///
53/// ```
54/// use inflector::cases::classcase::to_class_case;
55/// let mock_string: &str = "FOO_BAR";
56/// let expected_string: String = "FooBar".to_string();
57/// let asserted_string: String = to_class_case(mock_string);
58/// assert!(asserted_string == expected_string);
59///
60/// ```
61///
62/// ```
63/// use inflector::cases::classcase::to_class_case;
64/// let mock_string: &str = "foo_bar";
65/// let expected_string: String = "FooBar".to_string();
66/// let asserted_string: String = to_class_case(mock_string);
67/// assert!(asserted_string == expected_string);
68///
69/// ```
70///
71/// ```
72/// use inflector::cases::classcase::to_class_case;
73/// let mock_string: &str = "foo_bars";
74/// let expected_string: String = "FooBar".to_string();
75/// let asserted_string: String = to_class_case(mock_string);
76/// assert!(asserted_string == expected_string);
77///
78/// ```
79///
80/// ```
81/// use inflector::cases::classcase::to_class_case;
82/// let mock_string: &str = "Foo bar";
83/// let expected_string: String = "FooBar".to_string();
84/// let asserted_string: String = to_class_case(mock_string);
85/// assert!(asserted_string == expected_string);
86///
87/// ```
88pub fn to_class_case(non_class_case_string: &str) -> String {
89 let options = CamelOptions {
90 new_word: true,
91 last_char: ' ',
92 first_word: false,
93 injectable_char: ' ',
94 has_seperator: false,
95 inverted: false,
96 };
97 let class_plural = to_case_camel_like(non_class_case_string, options);
98 let split: (&str, &str) =
99 class_plural.split_at(class_plural.rfind(char::is_uppercase).unwrap_or(0));
100 format!("{}{}", split.0, to_singular(split.1))
101}
102
103#[cfg(feature = "heavyweight")]
104/// Determines if a `&str` is `ClassCase` `bool`
105///
106/// ```
107/// use inflector::cases::classcase::is_class_case;
108/// let mock_string: &str = "Foo";
109/// let asserted_bool: bool = is_class_case(mock_string);
110/// assert!(asserted_bool == true);
111///
112/// ```
113///
114/// ```
115/// use inflector::cases::classcase::is_class_case;
116/// let mock_string: &str = "foo";
117/// let asserted_bool: bool = is_class_case(mock_string);
118/// assert!(asserted_bool == false);
119///
120/// ```
121///
122/// ```
123/// use inflector::cases::classcase::is_class_case;
124/// let mock_string: &str = "FooBarIsAReallyReallyLongStrings";
125/// let asserted_bool: bool = is_class_case(mock_string);
126/// assert!(asserted_bool == false);
127///
128/// ```
129///
130///
131/// ```
132/// use inflector::cases::classcase::is_class_case;
133/// let mock_string: &str = "FooBarIsAReallyReallyLongString";
134/// let asserted_bool: bool = is_class_case(mock_string);
135/// assert!(asserted_bool == true);
136///
137/// ```
138///
139/// ```
140/// use inflector::cases::classcase::is_class_case;
141/// let mock_string: &str = "foo-bar-string-that-is-really-really-long";
142/// let asserted_bool: bool = is_class_case(mock_string);
143/// assert!(asserted_bool == false);
144///
145/// ```
146///
147/// ```
148/// use inflector::cases::classcase::is_class_case;
149/// let mock_string: &str = "foo_bar_is_a_really_really_long_strings";
150/// let asserted_bool: bool = is_class_case(mock_string);
151/// assert!(asserted_bool == false);
152///
153/// ```
154///
155///
156/// ```
157/// use inflector::cases::classcase::is_class_case;
158/// let mock_string: &str = "fooBarIsAReallyReallyLongString";
159/// let asserted_bool: bool = is_class_case(mock_string);
160/// assert!(asserted_bool == false);
161///
162/// ```
163///
164/// ```
165/// use inflector::cases::classcase::is_class_case;
166/// let mock_string: &str = "FOO_BAR_STRING_THAT_IS_REALLY_REALLY_LONG";
167/// let asserted_bool: bool = is_class_case(mock_string);
168/// assert!(asserted_bool == false);
169///
170/// ```
171///
172/// ```
173/// use inflector::cases::classcase::is_class_case;
174/// let mock_string: &str = "foo_bar_string_that_is_really_really_long";
175/// let asserted_bool: bool = is_class_case(mock_string);
176/// assert!(asserted_bool == false);
177///
178/// ```
179///
180/// ```
181/// use inflector::cases::classcase::is_class_case;
182/// let mock_string: &str = "Foo bar string that is really really long";
183/// let asserted_bool: bool = is_class_case(mock_string);
184/// assert!(asserted_bool == false);
185///
186/// ```
187///
188/// ```
189/// use inflector::cases::classcase::is_class_case;
190/// let mock_string: &str = "Foo Bar Is A Really Really Long String";
191/// let asserted_bool: bool = is_class_case(mock_string);
192/// assert!(asserted_bool == false);
193///
194/// ```
195pub fn is_class_case(test_string: &str) -> bool {
196 to_class_case(&test_string.clone()) == test_string
197}
198
199#[cfg(all(feature = "unstable", test))]
200#[cfg(feature = "heavyweight")]
201mod benchmarks {
202 extern crate test;
203 use self::test::Bencher;
204
205 #[bench]
206 fn bench_class_case(b: &mut Bencher) {
207 b.iter(|| super::to_class_case("Foo bar"));
208 }
209
210 #[bench]
211 fn bench_is_class(b: &mut Bencher) {
212 b.iter(|| super::is_class_case("Foo bar"));
213 }
214
215 #[bench]
216 fn bench_class_from_snake(b: &mut Bencher) {
217 b.iter(|| super::to_class_case("foo_bar"));
218 }
219}
220
221#[cfg(test)]
222#[cfg(feature = "heavyweight")]
223mod tests {
224 use ::to_class_case;
225 use ::is_class_case;
226
227 #[test]
228 fn from_camel_case() {
229 let convertable_string: String = "fooBar".to_owned();
230 let expected: String = "FooBar".to_owned();
231 assert_eq!(to_class_case(&convertable_string), expected)
232 }
233
234 #[test]
235 fn from_pascal_case() {
236 let convertable_string: String = "FooBar".to_owned();
237 let expected: String = "FooBar".to_owned();
238 assert_eq!(to_class_case(&convertable_string), expected)
239 }
240
241 #[test]
242 fn from_kebab_case() {
243 let convertable_string: String = "foo-bar".to_owned();
244 let expected: String = "FooBar".to_owned();
245 assert_eq!(to_class_case(&convertable_string), expected)
246 }
247
248 #[test]
249 fn from_sentence_case() {
250 let convertable_string: String = "Foo bar".to_owned();
251 let expected: String = "FooBar".to_owned();
252 assert_eq!(to_class_case(&convertable_string), expected)
253 }
254
255 #[test]
256 fn from_title_case() {
257 let convertable_string: String = "Foo Bar".to_owned();
258 let expected: String = "FooBar".to_owned();
259 assert_eq!(to_class_case(&convertable_string), expected)
260 }
261
262 #[test]
263 fn from_train_case() {
264 let convertable_string: String = "Foo-Bar".to_owned();
265 let expected: String = "FooBar".to_owned();
266 assert_eq!(to_class_case(&convertable_string), expected)
267 }
268
269 #[test]
270 fn from_screaming_class_case() {
271 let convertable_string: String = "FOO_BAR".to_owned();
272 let expected: String = "FooBar".to_owned();
273 assert_eq!(to_class_case(&convertable_string), expected)
274 }
275
276 #[test]
277 fn from_snake_case() {
278 let convertable_string: String = "foo_bar".to_owned();
279 let expected: String = "FooBar".to_owned();
280 assert_eq!(to_class_case(&convertable_string), expected)
281 }
282
283 #[test]
284 fn from_table_case() {
285 let convertable_string: String = "foo_bars".to_owned();
286 let expected: String = "FooBar".to_owned();
287 assert_eq!(to_class_case(&convertable_string), expected)
288 }
289
290 #[test]
291 fn from_case_with_loads_of_space() {
292 let convertable_string: String = "foo bar".to_owned();
293 let expected: String = "FooBar".to_owned();
294 assert_eq!(to_class_case(&convertable_string), expected)
295 }
296
297 #[test]
298 fn a_name_with_a_dot() {
299 let convertable_string: String = "Robert C. Martin".to_owned();
300 let expected: String = "RobertCMartin".to_owned();
301 assert_eq!(to_class_case(&convertable_string), expected)
302 }
303
304 #[test]
305 fn random_text_with_bad_chars() {
306 let convertable_string: String = "Random text with *(bad) chars".to_owned();
307 let expected: String = "RandomTextWithBadChar".to_owned();
308 assert_eq!(to_class_case(&convertable_string), expected)
309 }
310
311 #[test]
312 fn trailing_bad_chars() {
313 let convertable_string: String = "trailing bad_chars*(()())".to_owned();
314 let expected: String = "TrailingBadChar".to_owned();
315 assert_eq!(to_class_case(&convertable_string), expected)
316 }
317
318 #[test]
319 fn leading_bad_chars() {
320 let convertable_string: String = "-!#$%leading bad chars".to_owned();
321 let expected: String = "LeadingBadChar".to_owned();
322 assert_eq!(to_class_case(&convertable_string), expected)
323 }
324
325 #[test]
326 fn wrapped_in_bad_chars() {
327 let convertable_string: String = "-!#$%wrapped in bad chars&*^*&(&*^&(<><?>><?><>))".to_owned();
328 let expected: String = "WrappedInBadChar".to_owned();
329 assert_eq!(to_class_case(&convertable_string), expected)
330 }
331
332 #[test]
333 fn has_a_sign() {
334 let convertable_string: String = "has a + sign".to_owned();
335 let expected: String = "HasASign".to_owned();
336 assert_eq!(to_class_case(&convertable_string), expected)
337 }
338
339 #[test]
340 fn is_correct_from_class_case() {
341 let convertable_string: String = "fooBar".to_owned();
342 assert_eq!(is_class_case(&convertable_string), false)
343 }
344
345 #[test]
346 fn is_correct_from_pascal_case() {
347 let convertable_string: String = "FooBar".to_owned();
348 assert_eq!(is_class_case(&convertable_string), true)
349 }
350
351 #[test]
352 fn is_correct_from_kebab_case() {
353 let convertable_string: String = "foo-bar".to_owned();
354 assert_eq!(is_class_case(&convertable_string), false)
355 }
356
357 #[test]
358 fn is_correct_from_sentence_case() {
359 let convertable_string: String = "Foo bar".to_owned();
360 assert_eq!(is_class_case(&convertable_string), false)
361 }
362
363 #[test]
364 fn is_correct_from_title_case() {
365 let convertable_string: String = "Foo Bar".to_owned();
366 assert_eq!(is_class_case(&convertable_string), false)
367 }
368
369 #[test]
370 fn is_correct_from_train_case() {
371 let convertable_string: String = "Foo-Bar".to_owned();
372 assert_eq!(is_class_case(&convertable_string), false)
373 }
374
375 #[test]
376 fn is_correct_from_screaming_snake_case() {
377 let convertable_string: String = "FOO_BAR".to_owned();
378 assert_eq!(is_class_case(&convertable_string), false)
379 }
380
381 #[test]
382 fn is_correct_from_snake_case() {
383 let convertable_string: String = "foo_bar".to_owned();
384 assert_eq!(is_class_case(&convertable_string), false)
385 }
386
387 #[test]
388 fn is_correct_from_table_case() {
389 let convertable_string: String = "FooBar".to_owned();
390 assert_eq!(is_class_case(&convertable_string), true)
391 }
392}
393