rpu 0.3.0

RPU is a GLSL-compatible language for rendering procedural graphics on the CPU.
Documentation
#[cfg(test)]
mod tests_rpu {
    use crate::prelude::*;

    #[test]
    fn sanity() {
        let rpu = RPU::new();
        assert_eq!(
            rpu.compile_and_run(
                "export int main(int x) {
                    return x;
                }
                ",
                "main",
                vec![WasmValue::I64(2)],
                true
            ),
            Ok(vec![WasmValue::I64(2)])
        );
    }

    #[test]
    fn scalar_mul() {
        let rpu = RPU::new();
        assert_eq!(
            rpu.compile_and_run(
                "export ivec2 main() {
                    return 2 * ivec2(1, 2) * 3;
                }
                ",
                "main",
                vec![],
                true
            ),
            Ok(vec![WasmValue::I64(6), WasmValue::I64(12)])
        );
        assert_eq!(
            rpu.compile_and_run(
                "export vec2 main() {
                    return 2.0 * vec2(1.0, 2.0) * 3.0;
                }
                ",
                "main",
                vec![],
                true
            ),
            Ok(vec![WasmValue::F64(6.0), WasmValue::F64(12.0)])
        );
    }

    #[test]
    fn vec_mul() {
        let rpu = RPU::new();
        assert_eq!(
            rpu.compile_and_run(
                "export ivec2 main() {
                    return ivec2(6, 5) * ivec2(1, 2);
                }
                ",
                "main",
                vec![],
                true
            ),
            Ok(vec![WasmValue::I64(6), WasmValue::I64(10)])
        );
        assert_eq!(
            rpu.compile_and_run(
                "export vec2 main() {
                    return vec2(6.0, 5.0) * vec2(1.0, 2.0);
                }
                ",
                "main",
                vec![],
                true
            ),
            Ok(vec![WasmValue::F64(6.0), WasmValue::F64(10.0)])
        );
        assert_eq!(
            rpu.compile_and_run(
                "export ivec3 main() {
                    return ivec3(6, 5, 4) * ivec3(1, 2, 3);
                }
                ",
                "main",
                vec![],
                true
            ),
            Ok(vec![
                WasmValue::I64(6),
                WasmValue::I64(10),
                WasmValue::I64(12)
            ])
        );
        assert_eq!(
            rpu.compile_and_run(
                "export vec3 main() {
                    return vec3(6.0, 5.0, 4.0) * vec3(1.0, 2.0, 3.0);
                }
                ",
                "main",
                vec![],
                true
            ),
            Ok(vec![
                WasmValue::F64(6.0),
                WasmValue::F64(10.0),
                WasmValue::F64(12.0)
            ])
        );
        assert_eq!(
            rpu.compile_and_run(
                "export ivec4 main() {
                    return ivec4(6, 5, 4, 3) * ivec4(1, 2, 3, 4);
                }
                ",
                "main",
                vec![],
                true
            ),
            Ok(vec![
                WasmValue::I64(6),
                WasmValue::I64(10),
                WasmValue::I64(12),
                WasmValue::I64(12)
            ])
        );
        assert_eq!(
            rpu.compile_and_run(
                "export vec4 main() {
                    return vec4(6.0, 5.0, 4.0, 3.0) * vec4(1.0, 2.0, 3.0, 4.0);
                }
                ",
                "main",
                vec![],
                true
            ),
            Ok(vec![
                WasmValue::F64(6.0),
                WasmValue::F64(10.0),
                WasmValue::F64(12.0),
                WasmValue::F64(12.0)
            ])
        );
    }

    #[test]
    fn vec_length() {
        let rpu = RPU::new();
        assert_eq!(
            rpu.compile_and_run(
                "export float main() {
                    return length(vec3(1.0, 3.0, 5.0));
                }
                ",
                "main",
                vec![],
                true
            ),
            Ok(vec![WasmValue::F64(5.916079783099616)])
        );
    }

    #[test]
    fn dot_product() {
        let rpu = RPU::new();
        assert_eq!(
            rpu.compile_and_run(
                "export float main() {
                    return dot(vec3(1.0, 3.0, 5.0), vec3(7.0, 9.0, 11.0));
                }
                ",
                "main",
                vec![],
                true
            ),
            Ok(vec![WasmValue::F64(89.0)])
        );
    }

    #[test]
    fn cross_product() {
        let rpu = RPU::new();
        assert_eq!(
            rpu.compile_and_run(
                "export vec3 main() {
                    return cross(vec3(1.0, 3.0, 5.0), vec3(7.0, 9.0, 11.0));
                }
                ",
                "main",
                vec![],
                true
            ),
            Ok(vec![
                WasmValue::F64(-12.0),
                WasmValue::F64(24.0),
                WasmValue::F64(-12.0)
            ])
        );
    }

    #[test]
    fn vec_normalize() {
        let rpu = RPU::new();
        assert_eq!(
            rpu.compile_and_run(
                "export vec3 main() {
                    vec3 result = normalize(vec3(1.0, 3.0, 5.0));
                    return result;
                }
                ",
                "main",
                vec![],
                true
            ),
            Ok(vec![
                WasmValue::F64(0.1690308509457033),
                WasmValue::F64(0.50709255283711),
                WasmValue::F64(0.8451542547285166)
            ])
        );
    }

    #[test]
    fn fib() {
        let rpu = RPU::new();
        let rc =
            rpu.compile_to_wat_from_path(std::path::PathBuf::from("../examples/fib.rpu"), true);
        match rc {
            Ok(wat) => {
                assert_eq!(
                    rpu.compile_wat_and_run(&wat, "main", vec![WasmValue::I64(10)], true),
                    Ok(vec![WasmValue::I64(55)])
                );
            }
            Err(err) => {
                panic!("{}", err);
            }
        }
    }
}