# Main commitのテストシナリオ
###### tags: `テスト設計`
## コントラクト
```javascript=
describe("Main commit", () => {
it("proofがcalldataに載っている", () => {});
it("正常なproofの場合zkVerifyが通る", () => {});
it("不正なproofの場合zkVerifyが通らない", () => {});
it("public inputの引数の1つが前のrootになっている", () => {});
it("public inputの引数の1つが前のrootになっていなければrevertする", () => {});
it("新しいブロックが作られたeventが発火する", () => {});
it("最初のブロックの場合はrecursive proofがなくてもコミットできる", () => {});
it("最初のブロックではないのに最初のブロックだと偽った場合は、コミットできない", () => {});
it("前回のMain commitから今回のmain commitまでのproofをrecursiveで証明しcommitできる", () => {});
it("前回のMain commitから適当にpre commitをスキップしてrecursiveしてもcommitできない", () => {});
it("適当なpre commitから今回のmain commitまでのproofをrecursiveで証明していてもcommitできない", () => {});
});
```
## 回路のテスト
これはmain commitのrollup回路と全く同じなのでそちらを参照する。
```javascript=
describe("Main commit Recursive Circuits", () => {
it("前回のmain commitから今回のmain commitまでのpre commitのproofが全部inputに入っている", () => {});
it("1つでも変なproofがあったら通らない", () => {});
it("pre commitのproofをverifyできる", () => {});
it("proofによってstateの遷移が確定しているので、任意のrootを設定することはできない", () => {});
});
describe("Rollup Circuits", () => {
it("txsがinputになっている", () => {});
it("ERC20のtransferができる", () => {});
it("ERC721のtransferができる", () => {});
it("ERC1155のtransferができる", () => {});
it("txのuser state zkpのverifyができる", () => {});
it("txの署名zkpのverifyができる", () => {});
it("state diffのupdate zkpをverifyできる", () => {});
it("いずれかのverifyが1つでもこけると回路がfailする", () => {});
it("onetime addressがすでに使われてないことを検証する", () => {});
it("onetime addressが使われていると回路がfailする", () => {});
it("1つのバッチで同じonetime addressが使われていた場合も回路がfailする", () => {});
});
```
## ここに書かないこと
- pre commit
- exit