simplicityhl 0.6.0

Rust-like language that compiles to Simplicity bytecode.
Documentation
use std::cell::RefCell;
use std::rc::Rc;

use simplicityhl::ast::CoreJetHinter;
use simplicityhl::simplicity::jet::CoreEnv;
use simplicityhl::tracker::DefaultTracker;
use simplicityhl::{Arguments, TemplateProgram, WitnessValues};

const CORE_PROGRAM: &str = r#"fn main() {
    let (_, sum): (bool, u32) = jet::add_32(10, 20);
    assert!(jet::eq_32(sum, 30));
}"#;

fn satisfied_core_program() -> simplicityhl::SatisfiedProgram {
    TemplateProgram::new(CORE_PROGRAM, Box::new(CoreJetHinter::new()))
        .unwrap()
        .instantiate(Arguments::default(), true)
        .unwrap()
        .satisfy(WitnessValues::default())
        .unwrap()
}

#[test]
fn core_program_prunes_without_tracker() {
    let satisfied = satisfied_core_program();
    satisfied.redeem().prune(&CoreEnv::new()).unwrap();
}

#[test]
fn core_program_should_not_panic_with_core_tracker() {
    let satisfied = satisfied_core_program();
    let mut tracker =
        DefaultTracker::build(satisfied.debug_symbols(), Box::new(CoreJetHinter::new()));

    satisfied
        .redeem()
        .prune_with_tracker(&CoreEnv::new(), &mut tracker)
        .unwrap();
}

#[test]
fn core_program_traces_core_jets() {
    let satisfied = satisfied_core_program();
    let traced_jets = Rc::new(RefCell::new(Vec::new()));
    let traced_jets_clone = traced_jets.clone();
    let mut tracker =
        DefaultTracker::build(satisfied.debug_symbols(), Box::new(CoreJetHinter::new()))
            .with_jet_trace_sink(move |jet, _args, _result| {
                traced_jets_clone.borrow_mut().push(jet.to_string());
            });

    satisfied
        .redeem()
        .prune_with_tracker(&CoreEnv::new(), &mut tracker)
        .unwrap();

    assert!(
        traced_jets.borrow().iter().any(|jet| jet == "add_32"),
        "expected add_32 to be traced as a Core jet"
    );
}