summaryrefslogtreecommitdiff
path: root/dhall/tests/misc.rs
blob: 3eecf038a2afba13e50879f5c90b47b9a140f443 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use dhall::error::Error;
use dhall::semantics::*;
use dhall::syntax::*;
use dhall::*;

/// Test that showcases someone using the `dhall` crate directly for a simple operation. If
/// possible try not to break this too much. See
/// https://github.com/Nadrieril/dhall-rust/issues/208.
#[test]
fn manual_function_application() {
    /// Apply a `Natural -> Natural` function to an argument.
    fn apply_natnat_fn<'cx>(f: &Nir<'cx>, n: u64) -> u64 {
        let n_nir = Nir::from_kind(NirKind::Num(NumKind::Natural(n)));
        match f.app(n_nir).kind() {
            NirKind::Num(NumKind::Natural(m)) => *m,
            _ => panic!("`f` was not `Natural -> Natural`"),
        }
    }
    /// Auxiliary function to make `?` work.
    fn run<'cx>(cx: Ctxt<'cx>) -> Result<(), Error> {
        let f_ty = "Natural -> Natural";
        let f = "\\(x: Natural) -> x + 3";
        let f_ty = Parsed::parse_str(f_ty)?
            .skip_resolve(cx)?
            .typecheck(cx)?
            .normalize(cx);
        let f = Parsed::parse_str(f)?
            .skip_resolve(cx)?
            .typecheck_with(cx, &f_ty.to_hir())?
            .normalize(cx);
        for i in 0..5 {
            let n = apply_natnat_fn(f.as_nir(), i);
            assert_eq!(n, i + 3);
        }
        Ok(())
    }
    Ctxt::with_new(run).unwrap();
}