pintc 0.14.0

Compiler for the Pint language
Documentation
use super::{check, compile};

#[test]
fn local_predicate_calls() {
    check(
        &format!(
            "{}",
            compile(
                r#"
            predicate Foo(x: int) {
            }
            predicate Bar(foo_x: int) {
                constraint Foo@[](foo_x);
                constraint foo_x == 0;
            }
            "#,
            )
        ),
        expect_test::expect![[r#"
            predicate ::Foo {
                --- Nodes ---
            }

            predicate ::Bar {
                --- Nodes ---
                node 0 (,leaf)
                  Stack(Push(0))
                  Stack(Push(0))
                  Stack(Push(1))
                  Access(PredicateData)
                  Stack(Push(0))
                  Pred(Eq)
                node 1 (,leaf)
                  Stack(Push(1))
                  Stack(Push(0))
                  Stack(Push(0))
                  Stack(Push(1))
                  Access(PredicateData)
                  Access(ThisContractAddress)
                  Stack(Push(-2360060374177730597))
                  Stack(Push(4636202025757824840))
                  Stack(Push(-1551618867720337012))
                  Stack(Push(-1727934474626789095))
                  Stack(Push(80))
                  Crypto(Sha256)
                  Access(PredicateExists)
            }

        "#]],
    );
}

#[test]
fn external_predicate_calls() {
    check(
        &format!(
            "{}",
            compile(
                r#"
interface Foo { predicate Bar (x: int, y: b256); }
predicate Bar(x: int, y: b256, bar_1: { x: int, y: b256 }, bar_2: { x: int, y: b256 }) {
    let c_addr = 0x0000000000000000000000000000000000000000000000000000000000000000;
    let p_addr = 0x1111111111111111111111111111111111111111111111111111111111111111;

    constraint Foo@[c_addr]::Bar@[p_addr](bar_1.x, bar_1.y);
    constraint Foo@[c_addr]::Bar@[p_addr](bar_2.x, bar_2.y);

    constraint x == bar_1.x;
    constraint y == bar_2.y;
}
            "#,
            )
        ),
        expect_test::expect![[r#"
            predicate ::Bar {
                --- Nodes ---
                node 0 (,leaf)
                  Stack(Push(1))
                  Stack(Push(0))
                  Stack(Push(4))
                  Access(PredicateData)
                  Stack(Push(3))
                  Stack(Push(0))
                  Stack(Push(1))
                  Alu(Add)
                  Stack(Push(4))
                  Access(PredicateData)
                  Stack(Push(4))
                  Pred(EqRange)
                node 1 (,leaf)
                  Stack(Push(0))
                  Stack(Push(0))
                  Stack(Push(1))
                  Access(PredicateData)
                  Stack(Push(2))
                  Stack(Push(0))
                  Stack(Push(1))
                  Access(PredicateData)
                  Pred(Eq)
                node 2 (,leaf)
                  Stack(Push(1))
                  Stack(Push(3))
                  Stack(Push(0))
                  Stack(Push(1))
                  Access(PredicateData)
                  Stack(Push(4))
                  Stack(Push(3))
                  Stack(Push(0))
                  Stack(Push(1))
                  Alu(Add)
                  Stack(Push(4))
                  Access(PredicateData)
                  Stack(Push(0))
                  Stack(Push(0))
                  Stack(Push(0))
                  Stack(Push(0))
                  Stack(Push(1229782938247303441))
                  Stack(Push(1229782938247303441))
                  Stack(Push(1229782938247303441))
                  Stack(Push(1229782938247303441))
                  Stack(Push(120))
                  Crypto(Sha256)
                  Access(PredicateExists)
                node 3 (,leaf)
                  Stack(Push(1))
                  Stack(Push(2))
                  Stack(Push(0))
                  Stack(Push(1))
                  Access(PredicateData)
                  Stack(Push(4))
                  Stack(Push(2))
                  Stack(Push(0))
                  Stack(Push(1))
                  Alu(Add)
                  Stack(Push(4))
                  Access(PredicateData)
                  Stack(Push(0))
                  Stack(Push(0))
                  Stack(Push(0))
                  Stack(Push(0))
                  Stack(Push(1229782938247303441))
                  Stack(Push(1229782938247303441))
                  Stack(Push(1229782938247303441))
                  Stack(Push(1229782938247303441))
                  Stack(Push(120))
                  Crypto(Sha256)
                  Access(PredicateExists)
            }

        "#]],
    );
}