gausplat_loader/source/polygon/header/
encode.rs

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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
//! Polygon header encoding implementation.

pub use super::*;

use std::io::Write;

impl Encoder for Header {
    type Err = Error;

    #[inline]
    fn encode(
        &self,
        writer: &mut impl Write,
    ) -> Result<(), Self::Err> {
        let header = self.to_string();
        if !header.is_ascii() {
            return Err(Error::InvalidAscii(header));
        }

        #[cfg(all(debug_assertions, not(test)))]
        log::debug!(target: "gausplat-loader::polygon::header", "Header::encode");

        Ok(write!(writer, "{header}")?)
    }
}

#[cfg(test)]
mod tests {
    use std::io::Cursor;

    /// This test **ensures** idempotence of header encoded outputs.
    #[test]
    fn encode_on_example_ok_and_idempotent() {
        use super::*;

        assert(
            &include_bytes!(
                "../../../../examples/data/polygon/another-cube.greg-turk.ascii.ply"
            )[..],
        );
        assert(
            &include_bytes!(
                "../../../../examples/data/polygon/another-cube.greg-turk.binary-be.ply"
            )[..],
        );
        assert(
            &include_bytes!(
                "../../../../examples/data/polygon/another-cube.greg-turk.binary-le.ply"
            )[..],
        );
        assert(
            &include_bytes!(
                "../../../../examples/data/polygon/another-cube.greg-turk.zeros.binary-le.ply"
            )[..],
        );
        assert(
            &include_bytes!("../../../../examples/data/polygon/empty-element.ascii.ply")
                [..],
        );
        assert(
            &include_bytes!(
                "../../../../examples/data/polygon/empty-element.binary-le.ply"
            )[..],
        );
        assert(
            &include_bytes!("../../../../examples/data/polygon/empty-head.ascii.ply")[..],
        );
        assert(
            &include_bytes!(
                "../../../../examples/data/polygon/supported-data-types-common.ply"
            )[..],
        );
        assert(
            &include_bytes!(
                "../../../../examples/data/polygon/supported-data-types-special.ply"
            )[..],
        );
        assert(
            &include_bytes!("../../../../examples/data/polygon/triangle.binary-le.ply")[..],
        );
        assert(
            &include_bytes!("../../../../examples/data/polygon/valid-keyword.ascii.ply")
                [..],
        );

        fn assert(source: &[u8]) {
            let reader = &mut Cursor::new(source);

            let header = Header::decode(reader).unwrap();
            let writer = &mut vec![];
            header.encode(writer).unwrap();
            let output_1 = writer.to_owned();

            let header = Header::decode(&mut Cursor::new(writer)).unwrap();
            let writer = &mut vec![];
            header.encode(writer).unwrap();
            let output_2 = writer.to_owned();

            assert_eq!(output_1, output_2);

            let target = true;
            let output = output_1.is_ascii();
            assert_eq!(output, target);

            let target = true;
            let output = output_1.len() > 4 && output_1.len() <= source.len();
            assert_eq!(output, target);
        }
    }

    #[test]
    fn encode_on_empty_slice() {
        use super::*;

        Header::default().encode(&mut &mut [][..]).unwrap_err();
    }

    #[test]
    fn encode_on_invalid_ascii() {
        use super::*;

        Header {
            version: "\u{2077}".into(),
            ..Default::default()
        }
        .encode(&mut &mut [][..])
        .unwrap_err();
    }
}