Port number parsing tests to Rust
authorJakob Cornell <jakob+gpg@jcornell.net>
Sat, 30 Sep 2023 20:21:08 +0000 (15:21 -0500)
committerJakob Cornell <jakob+gpg@jcornell.net>
Sun, 1 Oct 2023 18:37:57 +0000 (13:37 -0500)
sharedmodel/src/update_parse.rs

index 758a5af64830bd89cd9025660e33c2255b5c7e2d..04495cb78fbae9de2866cb235c2c801bdfd315bd 100644 (file)
@@ -18,6 +18,7 @@ pub struct ParsedUpdate {
        deletable: bool,
 }
 
+#[derive(Debug)]
 pub enum ParseError {
        InvalidElement(String),
 }
@@ -322,6 +323,8 @@ fn is_special(count: Count) -> bool {
 
 #[cfg(test)]
 mod tests {
+       use crate::parse_html;
+
        use super::*;
 
        #[test]
@@ -338,4 +341,69 @@ mod tests {
                assert!(is_special(12341234));
                assert!(!is_special(1937592));
        }
+
+       fn expect_update(result: Result<ParsedUpdate, ParseError>) -> ParsedUpdate {
+               result.expect("parse should have succeeded")
+       }
+
+       #[test]
+       fn test_valid_counts() {
+               let update = expect_update(parse_update(parse_html("<div>12,345,678 spaghetti</div>"), None, ""));
+               assert_eq!(update.number, Some(12_345_678));
+               assert_eq!(update.deletable, false);
+
+               let update = expect_update(parse_update(parse_html("<div><p>0</p><br/>oz</div>"), None, ""));
+               assert_eq!(update.number, Some(0));
+               assert_eq!(update.deletable, false);
+
+               let update = expect_update(parse_update(parse_html("<div>121 345 621</div>"), Some(121), ""));
+               assert_eq!(update.number, Some(121));
+               assert_eq!(update.deletable, false);
+
+               let update = expect_update(parse_update(parse_html("28 336 816"), Some(28_336_816), ""));
+               assert_eq!(update.number, Some(28_336_816));
+               assert_eq!(update.deletable, true);
+       }
+
+       #[test]
+       fn test_non_counts() {
+               let update = expect_update(parse_update(parse_html("<div><table><tbody><tr><td>zoo</td></tr></tbody></table></div>"), None, ""));
+               assert_eq!(update.count_attempt, false);
+               assert_eq!(update.deletable, false);
+       }
+
+       #[test]
+       fn test_typos() {
+               let update = expect_update(parse_update(parse_html("<span>v9</span>"), Some(888), ""));
+               assert_eq!(update.number, None);
+               assert_eq!(update.count_attempt, true);
+
+               let update = expect_update(parse_update(parse_html("<div>v11.585 Empire</div>"), None, ""));
+               assert_eq!(update.number, None);
+               assert_eq!(update.count_attempt, true);
+               assert_eq!(update.deletable, false);
+
+               let update = expect_update(parse_update(parse_html("<div>11, 585, 22 </div>"), Some(11_585_202), ""));
+               assert_eq!(update.number, None);
+               assert_eq!(update.count_attempt, true);
+               assert_eq!(update.deletable, true);
+
+               let update = expect_update(parse_update(parse_html("<span>0490499</span>"), Some(4_999), ""));
+               assert_eq!(update.number, None);
+               assert_eq!(update.count_attempt, true);
+
+               // this update is marked non-deletable, but I'm not sure it should be
+               let update = expect_update(parse_update(parse_html("12,123123"), Some(12_123_123), ""));
+               assert_eq!(update.number, None);
+               assert_eq!(update.count_attempt, true);
+       }
+
+       #[test]
+       fn test_html_handling() {
+               let update = expect_update(parse_update(parse_html("123<hr>,456"), None, ""));
+               assert_eq!(update.number, Some(123));
+
+               let update = expect_update(parse_update(parse_html("<pre>123\n456</pre>"), None, ""));
+               assert_eq!(update.number, Some(123));
+       }
 }