package circuitcompiler import ( "encoding/json" "fmt" "math/big" "strings" "testing" "github.com/stretchr/testify/assert" ) func TestCircuitParser(t *testing.T) { /* input: def test(): y = x**3 return x + y + 5 flattened: m1 = s1 * s1 m2 = m1 * s1 m3 = m2 + s1 out = m3 + 5 */ // flat code, where er is expected_result // equals(s5, s1) // s1 = s5 * 1 flat := ` func test(private s0, public s1): s2 = s0*s0 s3 = s2*s0 s4 = s0 + s3 s5 = s4 + 5 s5 = s1 * one out = 1 * 1 ` parser := NewParser(strings.NewReader(flat)) circuit, err := parser.Parse() assert.Nil(t, err) fmt.Println("circuit parsed: ", circuit) // flat code to R1CS fmt.Println("generating R1CS from flat code") a, b, c := circuit.GenerateR1CS() fmt.Println("private inputs: ", circuit.PrivateInputs) fmt.Println("public inputs: ", circuit.PublicInputs) fmt.Println("signals:", circuit.Signals) // expected result // b0 := big.NewInt(int64(0)) // b1 := big.NewInt(int64(1)) // b5 := big.NewInt(int64(5)) // aExpected := [][]*big.Int{ // []*big.Int{b0, b0, b1, b0, b0, b0}, // []*big.Int{b0, b0, b0, b1, b0, b0}, // []*big.Int{b0, b0, b1, b0, b1, b0}, // []*big.Int{b5, b0, b0, b0, b0, b1}, // } // bExpected := [][]*big.Int{ // []*big.Int{b0, b0, b1, b0, b0, b0}, // []*big.Int{b0, b0, b1, b0, b0, b0}, // []*big.Int{b1, b0, b0, b0, b0, b0}, // []*big.Int{b1, b0, b0, b0, b0, b0}, // } // cExpected := [][]*big.Int{ // []*big.Int{b0, b0, b0, b1, b0, b0}, // []*big.Int{b0, b0, b0, b0, b1, b0}, // []*big.Int{b0, b0, b0, b0, b0, b1}, // []*big.Int{b0, b1, b0, b0, b0, b0}, // } // // assert.Equal(t, aExpected, a) // assert.Equal(t, bExpected, b) // assert.Equal(t, cExpected, c) fmt.Println(a) fmt.Println(b) fmt.Println(c) b3 := big.NewInt(int64(3)) privateInputs := []*big.Int{b3} b35 := big.NewInt(int64(35)) publicInputs := []*big.Int{b35} // Calculate Witness w, err := circuit.CalculateWitness(privateInputs, publicInputs) assert.Nil(t, err) fmt.Println("w", w) circuitJson, _ := json.Marshal(circuit) fmt.Println("circuit:", string(circuitJson)) assert.Equal(t, circuit.NPublic, 1) assert.Equal(t, len(circuit.PublicInputs), 1) assert.Equal(t, len(circuit.PrivateInputs), 1) }