include_data 1.0.1

Include typed data directly in your executable
Documentation
#![allow(clippy::modulo_one)]

use include_data::{include_slice, include_u16s};

#[test]
fn include_bytes() {
    static BYTES_32: &[u8] = include_slice!(u8, "test_data/binary_32");

    assert_eq!(BYTES_32.len(), 32);
    for i in 0..32 {
        assert_eq!(BYTES_32[i as usize], i);
    }
}

#[test]
fn include_u16() {
    static BYTES_32: &[u16] = include_slice!(u16, "test_data/binary_32");
    static BYTES_64: &[u16] = include_u16s!("test_data/binary_64");

    assert_eq!(BYTES_32.as_ptr().align_offset(2), 0);
    assert_eq!(BYTES_32.len(), 16);
    for i in 0..16 {
        let i2 = (i as u16) * 2;
        assert_eq!(BYTES_32[i], i2 + ((i2 + 1) << 8));
    }

    assert_eq!(BYTES_32.as_ptr().align_offset(2), 0);
    assert_eq!(BYTES_64.len(), 32);
}

#[test]
fn include_u32() {
    static BYTES_32: &[u32] = include_slice!(u32, "test_data/binary_32");

    assert_eq!(BYTES_32.as_ptr().align_offset(4), 0);
    assert_eq!(BYTES_32.len(), 8);
    for i in 0..8 {
        let i4 = (i as u32) * 4;
        assert_eq!(
            BYTES_32[i],
            i4 + ((i4 + 1) << 8) + ((i4 + 2) << 16) + ((i4 + 3) << 24),
        );
    }
}

#[test]
fn include_31_u8s() {
    static BYTES_31: &[u8] = include_slice!(u8, "test_data/binary_31");

    assert_eq!(BYTES_31.as_ptr().align_offset(1), 0);
    assert_eq!(BYTES_31.len(), 31);
    for i in 0..31 {
        assert_eq!(BYTES_31[i as usize], i);
    }
}

#[test]
fn include_i128() {
    static BYTES_64: &[i128] = include_slice!(i128, "test_data/binary_64");

    assert_eq!(BYTES_64.as_ptr().align_offset(8), 0);
    assert_eq!(BYTES_64.len(), 4);
    for i in 0..4 {
        let i16 = (i as i128) * 16;
        let mut val = 0;
        for j in 0..16 {
            val += (i16 + j) << (8 * j);
        }

        assert_eq!(BYTES_64[i], val);
    }
}

#[test]
fn bad_use() {
    let t = trybuild::TestCases::new();
    t.compile_fail("tests/bad/include_slice/*.rs");
}

mod noincs {
    #[test]
    fn no_include_i32() {
        static INTS: &[i32] = include_data::include_i32s!("test_data/binary_32");

        assert_eq!(INTS.as_ptr().align_offset(4), 0);
        assert_eq!(INTS.len(), 8);
    }
}