package circuitcompiler import ( "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 flat := ` func test(x): aux = x*x y = aux*x z = x + y out = z + 5 ` parser := NewParser(strings.NewReader(flat)) circuit, err := parser.Parse() assert.Nil(t, err) fmt.Println(circuit) // flat code to R1CS fmt.Println("generating R1CS from flat code") a, b, c := circuit.GenerateR1CS() fmt.Print("function with inputs: ") fmt.Println(circuit.Inputs) fmt.Print("signals: ") fmt.Println(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, b1, b0, b0, b0, b0}, []*big.Int{b0, b0, b0, b1, b0, b0}, []*big.Int{b0, b1, b0, b0, b1, b0}, []*big.Int{b5, b0, b0, b0, b0, b1}, } bExpected := [][]*big.Int{ []*big.Int{b0, b1, b0, b0, b0, b0}, []*big.Int{b0, b1, b0, 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, b0, b1, 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)) inputs := []*big.Int{b3} // Calculate Witness w, err := circuit.CalculateWitness(inputs) assert.Nil(t, err) fmt.Println("w", w) }