Skip to main content

amaru_uplc/
lib.rs

1pub mod arena;
2pub mod binder;
3pub mod bls;
4pub mod builtin;
5pub mod constant;
6pub mod data;
7pub mod flat;
8pub mod machine;
9pub mod program;
10pub mod syn;
11pub mod term;
12pub mod typ;
13
14pub use bumpalo;
15
16#[cfg(test)]
17mod tests {
18    use pretty_assertions::assert_eq;
19
20    use crate::binder::DeBruijn;
21    use crate::program::Version;
22
23    use super::arena::Arena;
24    use super::program::Program;
25    use super::term::Term;
26
27    #[test]
28    fn add_integer() {
29        let arena = Arena::new();
30
31        let term = Term::add_integer(&arena)
32            .apply(&arena, Term::integer_from(&arena, 1))
33            .apply(&arena, Term::integer_from(&arena, 3));
34
35        let version = Version::plutus_v3(&arena);
36
37        let program = Program::<DeBruijn>::new(&arena, version, term);
38
39        let result = program.eval(&arena);
40
41        assert_eq!(result.term.unwrap(), Term::integer_from(&arena, 4));
42    }
43
44    #[test]
45    fn fibonacci() {
46        let arena = &Arena::new();
47
48        let double_force = Term::var(arena, DeBruijn::new(arena, 1))
49            .apply(arena, Term::var(arena, DeBruijn::new(arena, 1)))
50            .lambda(arena, DeBruijn::zero(arena))
51            .delay(arena)
52            .force(arena)
53            .apply(
54                arena,
55                Term::var(arena, DeBruijn::new(arena, 3))
56                    .apply(
57                        arena,
58                        Term::var(arena, DeBruijn::new(arena, 1))
59                            .apply(arena, Term::var(arena, DeBruijn::new(arena, 1)))
60                            .lambda(arena, DeBruijn::zero(arena))
61                            .delay(arena)
62                            .force(arena)
63                            .apply(arena, Term::var(arena, DeBruijn::new(arena, 2))),
64                    )
65                    .apply(arena, Term::var(arena, DeBruijn::new(arena, 1)))
66                    .lambda(arena, DeBruijn::zero(arena))
67                    .lambda(arena, DeBruijn::zero(arena)),
68            )
69            .lambda(arena, DeBruijn::zero(arena))
70            .delay(arena)
71            .delay(arena)
72            .force(arena)
73            .force(arena);
74
75        let if_condition = Term::if_then_else(arena)
76            .force(arena)
77            .apply(arena, Term::var(arena, DeBruijn::new(arena, 3)))
78            .apply(arena, Term::var(arena, DeBruijn::new(arena, 2)))
79            .apply(arena, Term::var(arena, DeBruijn::new(arena, 1)))
80            .apply(arena, Term::unit(arena))
81            .lambda(arena, DeBruijn::zero(arena))
82            .lambda(arena, DeBruijn::zero(arena))
83            .lambda(arena, DeBruijn::zero(arena))
84            .delay(arena)
85            .force(arena);
86
87        let add = Term::add_integer(arena)
88            .apply(
89                arena,
90                Term::var(arena, DeBruijn::new(arena, 3)).apply(
91                    arena,
92                    Term::subtract_integer(arena)
93                        .apply(arena, Term::var(arena, DeBruijn::new(arena, 2)))
94                        .apply(arena, Term::integer_from(arena, 1)),
95                ),
96            )
97            .apply(
98                arena,
99                Term::var(arena, DeBruijn::new(arena, 3)).apply(
100                    arena,
101                    Term::subtract_integer(arena)
102                        .apply(arena, Term::var(arena, DeBruijn::new(arena, 2)))
103                        .apply(arena, Term::integer_from(arena, 2)),
104                ),
105            )
106            .lambda(arena, DeBruijn::zero(arena));
107
108        let term = double_force
109            .apply(
110                arena,
111                if_condition
112                    .apply(
113                        arena,
114                        Term::less_than_equals_integer(arena)
115                            .apply(arena, Term::var(arena, DeBruijn::new(arena, 1)))
116                            .apply(arena, Term::integer_from(arena, 1)),
117                    )
118                    .apply(
119                        arena,
120                        Term::var(arena, DeBruijn::new(arena, 2))
121                            .lambda(arena, DeBruijn::zero(arena)),
122                    )
123                    .apply(arena, add)
124                    .lambda(arena, DeBruijn::zero(arena))
125                    .lambda(arena, DeBruijn::zero(arena)),
126            )
127            .apply(arena, Term::var(arena, DeBruijn::new(arena, 1)))
128            .lambda(arena, DeBruijn::zero(arena))
129            .apply(arena, Term::integer_from(arena, 15));
130
131        let version = Version::plutus_v3(arena);
132
133        let program = Program::new(arena, version, term);
134
135        let result = program.eval(arena);
136
137        assert_eq!(result.term.unwrap(), Term::integer_from(arena, 610));
138    }
139}