polytrack-codes 0.3.0

Collection of utilities to work with PolyTrack's track codes
Documentation
use super::*;

#[test]
fn full_convert() {
    let test_values = [
        (
            "PolyTrack24p9i0XLjMgsD1nSz23q8JF3jMdniKSH9K98LuSPrMZnCMxyCIQPAAgOBM0K",
            "704c83ef3a9995b904ea019e330d0e747ddcbdee1891258e665ecb03608cbdc7",
        ),
        (
            "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",
            "f5b52ea03467511a56ce4544e0095d0878630fee84a22dadba0113a108d488fa",
        ),
    ];
    for (code, id) in test_values {
        let result = export_to_id(code);
        assert_eq!(result, Some(id.to_string()));
    }
}

#[test]
fn track_decode() {
    let test_values = [
        (
            "PolyTrack24p9i0XLjMgsD1nSz23q8JF3jMdniKSH9K98LuSPrMZnCMxyCIQPAAgOBM0K",
            Track {
                author: Some("".to_string()),
                name: "Testing".to_string(),
                last_modified: None,
                track_data: vec![
                    0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                    0, 0, 0,
                ],
            },
        ),
        (
            "PolyTrack24pdFJHtDCCCFAA9Xqtcr8RueemB21WCWjeBIixocuJDf1Xde6xylEH9G1hdby4iZtoXveNfSbJb3v51tD3D2Oe8iqMqwMPN83zRo2WUJe5UAeAyeYtFI4sTSCaU6kvcf9huUuBRHMnIbTSXRs6mOj4xk0IE0VqnlfC0ePqYI",
            Track {
                author: Some("Ireozar".to_string()),
                name: "lsdkghlkgsdgriugh".to_string(),
                last_modified: Some(1770992675),
                track_data: vec![
                    0, 28, 152, 255, 255, 255, 4, 0, 0, 0, 208, 255, 255, 255, 21, 0, 5, 0, 0, 0,
                    8, 0, 4, 0, 0, 8, 0, 8, 0, 0, 8, 0, 16, 0, 0, 8, 0, 20, 0, 0, 8, 0, 24, 0, 0,
                    5, 1, 0, 0, 0, 8, 0, 28, 0, 0, 0, 0, 0, 0, 36, 2, 0, 0, 0, 0, 0, 20, 0, 0, 8,
                    0, 0, 0, 0, 146, 1, 0, 0, 0, 12, 0, 12, 1, 2,
                ],
            },
        ),
    ];
    for (code, track) in test_values {
        let result = decode_track_code(code);
        assert_eq!(result, Some(track));
    }
}

#[test]
fn track_encode() {
    let test_values = [
        (
            Track {
                author: Some("".to_string()),
                name: "Testing".to_string(),
                last_modified: None,
                track_data: vec![
                    0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                    0, 0, 0,
                ],
            },
            "PolyTrack24p9i0XLjMgsD1nSz23q8JF3jMdniKSH9K98LuSPrMZnCMxyCIQPAAgOBM0K",
        ),
        (
            Track {
                author: Some("Ireozar".to_string()),
                name: "lsdkghlkgsdgriugh".to_string(),
                last_modified: Some(1770992675),
                track_data: vec![
                    0, 28, 152, 255, 255, 255, 4, 0, 0, 0, 208, 255, 255, 255, 21, 0, 5, 0, 0, 0,
                    8, 0, 4, 0, 0, 8, 0, 8, 0, 0, 8, 0, 16, 0, 0, 8, 0, 20, 0, 0, 8, 0, 24, 0, 0,
                    5, 1, 0, 0, 0, 8, 0, 28, 0, 0, 0, 0, 0, 0, 36, 2, 0, 0, 0, 0, 0, 20, 0, 0, 8,
                    0, 0, 0, 0, 146, 1, 0, 0, 0, 12, 0, 12, 1, 2,
                ],
            },
            "PolyTrack24pdFJHtDCCCFAA9Xqtcr8RueemB21WCWjeBIixocuJDf1Xde6xylEH9G1hdby4iZtoXveNfSbJb3v51tD3D2Oe8iqMqwMPN83zRo2WUJe5UAeAyeYtFI4sTSCaU6kvcf9huUuBRHMnIbTSXRs6mOj4xk0IE0VqnlfC0ePqYI",
        ),
    ];
    for (track, code) in test_values {
        let result = encode_track_code(&track);
        assert_eq!(result, Some(code.to_string()));
    }
}

#[test]
fn data_decode() {
    let test_values = [(
        vec![
            0, 28, 152, 255, 255, 255, 4, 0, 0, 0, 208, 255, 255, 255, 21, 5, 1, 0, 0, 0, 8, 0, 28,
            0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 8, 0, 24, 0, 0, 8, 0, 20, 0, 0, 8, 0, 16, 0, 0, 8, 0,
            8, 0, 0, 8, 0, 4, 0, 0, 36, 2, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 20, 0, 0, 146, 1, 0, 0, 0,
            12, 0, 12, 1, 2,
        ],
        TrackInfo {
            env: Environment::Summer,
            sun_dir: 28,
            min_x: -104,
            min_y: 4,
            min_z: -48,
            data_bytes: 21,
            parts: vec![
                Part {
                    id: 5,
                    amount: 1,
                    blocks: vec![Block {
                        x: 8,
                        y: 0,
                        z: 28,
                        rotation: 0,
                        dir: Direction::YPos,
                        color: 0,
                        cp_order: None,
                        start_order: Some(0),
                    }],
                },
                Part {
                    id: 0,
                    amount: 5,
                    blocks: vec![
                        Block {
                            x: 8,
                            y: 0,
                            z: 24,
                            rotation: 0,
                            dir: Direction::YPos,
                            color: 0,
                            cp_order: None,
                            start_order: None,
                        },
                        Block {
                            x: 8,
                            y: 0,
                            z: 20,
                            rotation: 0,
                            dir: Direction::YPos,
                            color: 0,
                            cp_order: None,
                            start_order: None,
                        },
                        Block {
                            x: 8,
                            y: 0,
                            z: 16,
                            rotation: 0,
                            dir: Direction::YPos,
                            color: 0,
                            cp_order: None,
                            start_order: None,
                        },
                        Block {
                            x: 8,
                            y: 0,
                            z: 8,
                            rotation: 0,
                            dir: Direction::YPos,
                            color: 0,
                            cp_order: None,
                            start_order: None,
                        },
                        Block {
                            x: 8,
                            y: 0,
                            z: 4,
                            rotation: 0,
                            dir: Direction::YPos,
                            color: 0,
                            cp_order: None,
                            start_order: None,
                        },
                    ],
                },
                Part {
                    id: 36,
                    amount: 2,
                    blocks: vec![
                        Block {
                            x: 8,
                            y: 0,
                            z: 0,
                            rotation: 0,
                            dir: Direction::YPos,
                            color: 0,
                            cp_order: None,
                            start_order: None,
                        },
                        Block {
                            x: 0,
                            y: 0,
                            z: 20,
                            rotation: 0,
                            dir: Direction::YPos,
                            color: 0,
                            cp_order: None,
                            start_order: None,
                        },
                    ],
                },
                Part {
                    id: 146,
                    amount: 1,
                    blocks: vec![Block {
                        x: 12,
                        y: 0,
                        z: 12,
                        rotation: 1,
                        dir: Direction::YPos,
                        color: 2,
                        cp_order: None,
                        start_order: None,
                    }],
                },
            ],
        },
    )];
    for (data, track_data) in test_values {
        let result = decode_track_data(&data);
        assert_eq!(result, Some(track_data));
    }
}

#[test]
fn data_encode() {
    let test_values = [(
        TrackInfo {
            env: Environment::Summer,
            sun_dir: 28,
            min_x: -104,
            min_y: 4,
            min_z: -48,
            data_bytes: 21,
            parts: vec![
                Part {
                    id: 5,
                    amount: 1,
                    blocks: vec![Block {
                        x: 8,
                        y: 0,
                        z: 28,
                        rotation: 0,
                        dir: Direction::YPos,
                        color: 0,
                        cp_order: None,
                        start_order: Some(0),
                    }],
                },
                Part {
                    id: 0,
                    amount: 5,
                    blocks: vec![
                        Block {
                            x: 8,
                            y: 0,
                            z: 24,
                            rotation: 0,
                            dir: Direction::YPos,
                            color: 0,
                            cp_order: None,
                            start_order: None,
                        },
                        Block {
                            x: 8,
                            y: 0,
                            z: 20,
                            rotation: 0,
                            dir: Direction::YPos,
                            color: 0,
                            cp_order: None,
                            start_order: None,
                        },
                        Block {
                            x: 8,
                            y: 0,
                            z: 16,
                            rotation: 0,
                            dir: Direction::YPos,
                            color: 0,
                            cp_order: None,
                            start_order: None,
                        },
                        Block {
                            x: 8,
                            y: 0,
                            z: 8,
                            rotation: 0,
                            dir: Direction::YPos,
                            color: 0,
                            cp_order: None,
                            start_order: None,
                        },
                        Block {
                            x: 8,
                            y: 0,
                            z: 4,
                            rotation: 0,
                            dir: Direction::YPos,
                            color: 0,
                            cp_order: None,
                            start_order: None,
                        },
                    ],
                },
                Part {
                    id: 36,
                    amount: 2,
                    blocks: vec![
                        Block {
                            x: 8,
                            y: 0,
                            z: 0,
                            rotation: 0,
                            dir: Direction::YPos,
                            color: 0,
                            cp_order: None,
                            start_order: None,
                        },
                        Block {
                            x: 0,
                            y: 0,
                            z: 20,
                            rotation: 0,
                            dir: Direction::YPos,
                            color: 0,
                            cp_order: None,
                            start_order: None,
                        },
                    ],
                },
                Part {
                    id: 146,
                    amount: 1,
                    blocks: vec![Block {
                        x: 12,
                        y: 0,
                        z: 12,
                        rotation: 1,
                        dir: Direction::YPos,
                        color: 2,
                        cp_order: None,
                        start_order: None,
                    }],
                },
            ],
        },
        vec![
            0, 28, 152, 255, 255, 255, 4, 0, 0, 0, 208, 255, 255, 255, 21, 5, 1, 0, 0, 0, 8, 0, 28,
            0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 8, 0, 24, 0, 0, 8, 0, 20, 0, 0, 8, 0, 16, 0, 0, 8, 0,
            8, 0, 0, 8, 0, 4, 0, 0, 36, 2, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 20, 0, 0, 146, 1, 0, 0, 0,
            12, 0, 12, 1, 2,
        ],
    )];
    for (track_data, data) in test_values {
        let result = encode_track_data(&track_data);
        assert_eq!(result, Some(data));
    }
}