テストコードほぼ完成っと
ドキュメントクラスのInsert/Delete/Replace関数それぞれのテストが完了。見つけたバグは3つほど。再帰を使ってパターンを列挙している。コードのイメージとしては次のような感じ。パターンを列挙しつつ、状態保存→Insert→比較→再帰呼び出し→返ってきたら状態復元(Undo)→比較 という流れ。Undo/Redo周りの状態保存はCDoCState側で実装している(BUFLEN, InsertBufはあらかじめ用意した挿入用のバッファ)。
void test_insert_core(CDocumentImpl *doc, CDocState *state, int n) { const int idxMax = doc->GetSize(); const int insMax = BUFLEN; for ( int i = 0; i < idxMax; i++ ) { for ( int j = 1; j < insMax; j++ ) { // 状態保存 std::string str; toString( doc, str ); // Insert state->Push( doc->NewInsert(i, InsertBuf, j) ); str.insert( i, InsertBuf, j ); // ここでInsert実行後のドキュメントを比較 COMPARE(); // std::string strとCDocImplを比較検査 // 再帰呼び出し if ( n - 1 ) { test_insert_core( doc, state, n - 1 ); } // Undoしてドキュメントをまた比較 CPPUNIT_ASSERT( state->Pop() ); } } }
呼び出しは「test_insert_core(doc, state, 2);」のような感じ。最近になってようやく再帰を使ったコードが書けるようになってきたと思いきや、コーディングにかかる時間が長くなっているという状態です。次はファイル入出力とマルチスレッド化、検索の実装に入ります。
ソースコードはは完成次第公開するつもりです。久々の日記でした(´・ω・`;)