テストコードほぼ完成っと

 ドキュメントクラスの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);」のような感じ。最近になってようやく再帰を使ったコードが書けるようになってきたと思いきや、コーディングにかかる時間が長くなっているという状態です。次はファイル入出力とマルチスレッド化、検索の実装に入ります。
 ソースコードはは完成次第公開するつもりです。久々の日記でした(´・ω・`;)