読者です 読者をやめる 読者になる 読者になる

亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

TDDで脳がトロトロになるコンパイラ作りその4 イベントのテストとか。

ちょっと開きましたが、例の脳が溶ける言語コンパイラをちょいちょいつくっていきますよっと。
まぁそもそもさっさと作れって話ですが

さて、BrainFuckには入出力がありまして、今回はそれを両方共イベントで定義していました

		public event Action<byte> OutputEvent;
		public event Func<byte> InputEvent;

こいつのテストですねー。まぁ、とりあえず力技で書いてみましょうw

		[Test]
		public void 出力テスト()
		{
			var compiler = new BrainFuckCompiler.BrainFuckCompiler("+++.");
			var answerList = new System.Collections.Generic.List<byte>();
			compiler.OutputEvent += output => {
				answerList.Add(output);
			};
			compiler.Run();
			//一個しか出力されてないことを確認。
			//Chainning Asserition最強説
			answerList.Is((byte)3);
		}

まぁ、普通にイベントに登録して、出力をリストに放り込んで、最後に比較です。ChainningAssertionがあるとこれがまた強力です。非常に便利です。

んで、実装です。まぁ実は実装事態は超単純でして。

	case '.':
		if(OutputEvent != null)
		{
			OutputEvent(_memoryStream[_programPointer]);
		}
		i++;
		break;

んで、Inputも確認しましょう。テストは、普通に入力イベントを走らせた後に、値を確認してみましょう。

		[Test]
		public void 入力テスト()
		{
			var compiler = new BrainFuckCompiler.BrainFuckCompiler("+++,");
			compiler.InputEvent += () => 10;
			compiler.Run();
			compiler.CurrentValue.Is((byte)10);
		}

こうこう。んで、こっちも実装は超単純。

	case ',':
		if(InputEvent != null)
		{
			_memoryStream[_programPointer] = InputEvent();
		}
		i++;
		break;

これで、大体の実装は出来ましたかねー。