package auratests.dsp;

import utest.Assert;

import aura.Aura;
import aura.dsp.FractionalDelayLine;
import aura.types.AudioBuffer;
import aura.utils.TestSignals;

@:access(aura.dsp.FractionalDelayLine)
class TestFractionalDelayLine extends utest.Test {
	var audioBuffer: AudioBuffer;
	var delayLine: FractionalDelayLine;

	function setup() {
		audioBuffer = new AudioBuffer(2, 8);
		delayLine = new FractionalDelayLine(2, 8);
	}

	function test_zeroDelayTime_noDelay() {
		TestSignals.fillUnitImpulse(audioBuffer.getChannelView(0));
		TestSignals.fillUnitImpulse(audioBuffer.getChannelView(1));

		delayLine.at_setDelayLength(Left, 0.0);
		delayLine.at_setDelayLength(Right, 0.0);

		delayLine.process(audioBuffer);

		Assert.floatEquals(1.0, audioBuffer.getChannelView(0)[0]);
		Assert.floatEquals(0.0, audioBuffer.getChannelView(0)[1]);

		Assert.floatEquals(1.0, audioBuffer.getChannelView(1)[0]);
		Assert.floatEquals(0.0, audioBuffer.getChannelView(1)[1]);
	}

	function test_integralDelayTime_independentChannels() {
		TestSignals.fillUnitImpulse(audioBuffer.getChannelView(0));
		TestSignals.fillUnitImpulse(audioBuffer.getChannelView(1));

		delayLine.at_setDelayLength(Left, 1.0);
		delayLine.at_setDelayLength(Right, 3.0);

		delayLine.process(audioBuffer);

		Assert.floatEquals(0.0, audioBuffer.getChannelView(0)[0]);
		Assert.floatEquals(1.0, audioBuffer.getChannelView(0)[1]);

		Assert.floatEquals(0.0, audioBuffer.getChannelView(1)[0]);
		Assert.floatEquals(1.0, audioBuffer.getChannelView(1)[3]);
	}

	function test_floatDelayTime_independentChannels() {
		TestSignals.fillUnitImpulse(audioBuffer.getChannelView(0));
		TestSignals.fillUnitImpulse(audioBuffer.getChannelView(1));

		delayLine.at_setDelayLength(Left, 0.8);
		delayLine.at_setDelayLength(Right, 3.4);

		delayLine.process(audioBuffer);

		Assert.floatEquals(0.2, audioBuffer.getChannelView(0)[0]);
		Assert.floatEquals(0.8, audioBuffer.getChannelView(0)[1]);

		Assert.floatEquals(0.6, audioBuffer.getChannelView(1)[3]);
		Assert.floatEquals(0.4, audioBuffer.getChannelView(1)[4]);
	}
}