intuicio_frontend_simpleton/
lib.rs

1pub mod library;
2pub mod nodes;
3pub mod parser;
4pub mod script;
5
6use intuicio_core::{IntuicioVersion, crate_version};
7
8pub use intuicio_framework_dynamic::{
9    Array, Boolean, Function, Integer, Map, Real, Reference, Text, Transferable, Transferred, Type,
10};
11
12pub fn frontend_simpleton_version() -> IntuicioVersion {
13    crate_version!()
14}
15
16#[cfg(test)]
17mod tests {
18    use crate::{
19        Integer, Real, Reference,
20        library::{ObjectBuilder, jobs::Jobs},
21        script::{SimpletonContentParser, SimpletonPackage, SimpletonScriptExpression},
22    };
23    use intuicio_backend_vm::scope::VmScope;
24    use intuicio_core::{
25        context::Context,
26        host::{Host, HostProducer},
27        registry::Registry,
28        script::FileContentProvider,
29    };
30
31    #[test]
32    fn test_simpleton_script() {
33        let mut content_provider = FileContentProvider::new("simp", SimpletonContentParser);
34        let package =
35            SimpletonPackage::new("../../resources/package.simp", &mut content_provider).unwrap();
36        let host_producer = HostProducer::new(move || {
37            let mut registry = Registry::default();
38            crate::library::install(&mut registry);
39            package
40                .compile()
41                .install::<VmScope<SimpletonScriptExpression>>(
42                    &mut registry,
43                    None,
44                    // Some(
45                    //     PrintDebugger::full()
46                    //         .basic_printables()
47                    //         .stack_bytes(false)
48                    //         .registers_bytes(false)
49                    //         .into_handle(),
50                    // ),
51                );
52            let context = Context::new(10240, 10240);
53            Host::new(context, registry.into())
54        });
55        let mut vm = host_producer.produce();
56        vm.context()
57            .set_custom(Jobs::HOST_PRODUCER_CUSTOM, host_producer);
58
59        let adder = Reference::new_raw(
60            ObjectBuilder::new("Adder", "adder")
61                .field("a", Reference::new_integer(40, vm.registry()))
62                .field("b", Reference::new_integer(2, vm.registry()))
63                .build(vm.registry()),
64        );
65        let (result,) = vm
66            .call_function::<(Reference,), _>("add", "adder", None)
67            .unwrap()
68            .run((adder,));
69        assert_eq!(vm.context().stack().position(), 0);
70        assert_eq!(*result.read::<Integer>().unwrap(), 42);
71
72        let (result,) = vm
73            .call_function::<(Reference,), _>("main", "test", None)
74            .unwrap()
75            .run(());
76        assert_eq!(vm.context().stack().position(), 0);
77        assert_eq!(*result.read::<Real>().unwrap(), 42.0);
78    }
79}