Skip to main content

munemo_rs/
encoder.rs

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}