1use crate::constants::*;
2use std::convert::TryInto;
3
4fn encode_unit(index: usize, buffer: &mut String) {
5 let tens = index / SYLLABLES.len();
6 if tens > 0 {
7 encode_unit(tens, buffer);
8 }
9
10 let units = index % SYLLABLES.len();
11 buffer.push_str(SYLLABLES[units]);
12}
13
14pub fn encode(value: i64) -> String {
15 let mut buffer = String::new();
16 let index: usize = if value < 0 {
17 buffer.push_str(NEGATIVE_SYLLABLE);
18 -1 * value
19 } else {
20 value
21 }
22 .try_into()
23 .unwrap();
24
25 encode_unit(index, &mut buffer);
26 buffer
27}
28
29#[cfg(test)]
30mod tests {
31 use super::*;
32 use rand::Rng;
33
34 #[test]
35 fn single_syllable() {
36 let units = rand::thread_rng().gen_range(0, SYLLABLES.len());
37 let value = units as i64;
38
39 assert_eq!(encode(value), SYLLABLES[units]);
40 }
41
42 #[test]
43 fn one_tens() {
44 let tens = 1;
45 let units = rand::thread_rng().gen_range(0, SYLLABLES.len());
46 let value = (tens * SYLLABLES.len() + units) as i64;
47
48 assert_eq!(encode(value), [SYLLABLES[tens], SYLLABLES[units]].concat());
49 }
50
51 #[test]
52 fn many_tens() {
53 let tens = rand::thread_rng().gen_range(2, SYLLABLES.len());
54 let units = rand::thread_rng().gen_range(0, SYLLABLES.len());
55 let value = (tens * SYLLABLES.len() + units) as i64;
56
57 assert_eq!(encode(value), [SYLLABLES[tens], SYLLABLES[units]].concat());
58 }
59
60 #[test]
61 fn many_hundreds() {
62 let hundreds = rand::thread_rng().gen_range(1, SYLLABLES.len());
63 let tens = rand::thread_rng().gen_range(0, SYLLABLES.len());
64 let units = rand::thread_rng().gen_range(0, SYLLABLES.len());
65 let value =
66 (hundreds * SYLLABLES.len() * SYLLABLES.len() + tens * SYLLABLES.len() + units) as i64;
67
68 assert_eq!(
69 encode(value),
70 [SYLLABLES[hundreds], SYLLABLES[tens], SYLLABLES[units]].concat()
71 );
72 }
73
74 #[test]
75 fn negative() {
76 let units = rand::thread_rng().gen_range(1, SYLLABLES.len());
77 let value = (units as i64) * -1;
78
79 assert_eq!(
80 encode(value),
81 [NEGATIVE_SYLLABLE, SYLLABLES[units]].concat()
82 );
83 }
84}