File: test.rs

package info (click to toggle)
rust-escaper 0.1.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 252 kB
  • sloc: makefile: 2
file content (105 lines) | stat: -rw-r--r-- 3,390 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
extern crate escaper;

extern crate num;
extern crate rand;

use std::char;

use escaper::DecodeErrKind::*;
use escaper::*;

macro_rules! test_decode_err(($name: ident, $inp: expr, $pos: expr, $kind: expr) => (
        #[test]
        fn $name() {
            match decode_html($inp) {
                Ok(s) => panic!("Expected error, got '{}'", s),
                Err(e) => assert_eq!(DecodeErr{position: $pos, kind: $kind}, e)
            }
        }));

#[test]
fn test_encode_minimal() {
    let data = [
        // (input, expected_output)
        ("", ""),
        ("Håll älgen, Örjan!", "Håll älgen, Örjan!"),
        ("<p>hej!</p>", "&lt;p&gt;hej!&lt;/p&gt;"),
        ("bread & butter", "bread &amp; butter"),
        ("\"bread\" & butter", "&quot;bread&quot; &amp; butter"),
        ("< less than", "&lt; less than"),
        ("greater than >", "greater than &gt;"),
    ];

    for &(input, expected) in data.iter() {
        let actual = encode_minimal(input);
        assert_eq!(&actual, expected);
    }
}

#[test]
fn test_encode_attribute() {
    let data = [
        ("", ""),
        ("0 3px", "0&#x20;3px"),
        ("<img \"\"\">", "&lt;img&#x20;&quot;&quot;&quot;&gt;"),
        ("hej; hå", "hej&#x3B;&#x20;h&#xE5;"),
    ];
    for &(input, expected) in data.iter() {
        let actual = encode_attribute(input);
        assert_eq!(&actual, expected);
    }
}

#[test]
fn test_decode() {
    let data = [
        ("", ""),
        ("Håll älgen, Örjan!", "Håll älgen, Örjan!"),
        ("&lt;p&gt;hej!&lt;/p&gt;", "<p>hej!</p>"),
        ("hej&#x3B;&#x20;hå", "hej; hå"),
        ("&quot;width&#x3A;&#32;3px&#59;&quot;", "\"width: 3px;\""),
        ("&#x2b;", "+"),
    ];
    for &(input, expected) in data.iter() {
        match decode_html(input) {
            Ok(actual) => assert_eq!(&actual, expected),
            Err(reason) => panic!("Failed at \"{}\", reason \"{:?}\"", input, reason),
        }
    }
}

test_decode_err!(overflow_num, "&#100000000000000;", 0, MalformedNumEscape);
test_decode_err!(bad_unicode, "&#xffffffff;", 0, InvalidCharacter);
test_decode_err!(unterminated_named, "hej &amp", 4, PrematureEnd);
test_decode_err!(unterminated_dec, "hej &#", 4, PrematureEnd);
test_decode_err!(unterminated_hex, "hej &#x", 4, PrematureEnd);
test_decode_err!(dec_with_x, " &#01x1", 1, MalformedNumEscape);
test_decode_err!(unknown_entity, "  &hopp;", 2, UnknownEntity);
test_decode_err!(negative_dec, "   &#-1;", 3, MalformedNumEscape);
// test_decode_err!(double_amp, "&&gt;;", 0, UnknownEntity);
test_decode_err!(empty_named, "&;", 0, UnknownEntity);
test_decode_err!(empty_dec, "&#;", 0, MalformedNumEscape);
test_decode_err!(empty_hex, "&#x;", 0, MalformedNumEscape);

#[test]
fn random_roundtrip() {
    let mut rng = rand::thread_rng();
    for _ in 1..100 {
        let original = random_str(&mut rng);
        let encoded = encode_attribute(&original);
        match decode_html(&encoded) {
            Err(reason) => panic!("error at \"{}\", reason: {:?}", original, reason),
            Ok(decoded) => assert_eq!(original, decoded),
        };
    }
}

fn random_str<R: rand::Rng>(rng: &mut R) -> String {
    let len = rng.gen_range::<usize, _>(0..40);
    let mut s = String::new();
    for _ in 0..len {
        let c = char::from_u32(rng.gen_range::<usize, _>(1..512) as u32).unwrap();
        s.push(c);
    }
    return s;
}