# Exit(normal)のテストシナリオ
###### tags: `テスト設計`
## ZKP
```javascript=
describe("ZKP回路", () => {
it("user state内の任意の資産の量をmerkle proofで証明をする", () => {});
it("資産がないのにあると偽るとfailする", () => {});
it("適当なmerkle Proofをinputに入れてもfailする", () => {});
it("適当なkeyHashedをinputに入れてもfailする", () => {});
it("適当なprivateKeyをinputに入れてもonetime Addressが一致しないのでfailする", () => {});
});
```
## コントラクト
```javascript=
describe("contract", () => {
it("main commitされたstateはそれ以降exitできるようになる", () => {});
it("オペレーターのpre commitかmain commit時にexit申請があれば、同時にexitのtransferが処理される", () => {});
it("Contract address mappingを頼りにL2のアドレスからL1のアドレスに変換される", () => {});
it("指定されたaddressに資産をtransferしている", () => {});
it("不正して適当なaddressにexitしようとしても、zkpのverifyが通らないのでexitでいない", () => {});
});
```
## オペレーター
```javascript=
describe("オペレーター", () => {
it("ユーザーからzkproofを受け取りverifyする", () => {});
it("inputが不適切な場合エラーを返す", () => {});
it("validなproofの場合、user state rootのupdateをしexitを含めたrollup zkpを行う", () => {});
it("invalidなproofの場合エラーを返す", () => {});
});
```
## ユーザー(Wallet)
```javascript=
describe("ユーザー(Wallet)", () => {
it("資産を選択して、任意の量をexitするためにzkpできる", () => {});
it("exitするL1アドレスを選択できる", () => {});
it("お急ぎexitの場合main commitのコストを肩代わりすることができる", () => {});
it("お急ぎfeeを払うことができる", () => {});
it("proofをオペレーターに投げれる", () => {});
it("エラーがあればエラーが返ってくる", () => {});
it("stateがmain commit通過後の場合はすぐにexitできることをUIで表示する", () => {});
it("stateがmain commit通過前の場合はすぐにexitできるないことをUIで表示する", () => {});
});
```
## ここに書かないこと
- exit(freeze)
- deposit系