import { AutoWah } from "./AutoWah.js";
import { BasicTests } from "../../test/helper/Basic.js";
import { EffectTests } from "../../test/helper/EffectTests.js";
import { expect } from "chai";
import { CompareToFile } from "../../test/helper/CompareToFile.js";
import { Synth } from "../instrument/Synth.js";

describe("AutoWah", () => {

	BasicTests(AutoWah);
	EffectTests(AutoWah);

	it("matches a file", () => {
		return CompareToFile(() => {
			const wah = new AutoWah().toDestination();
			wah.follower = 0.4;
			const synth = new Synth().connect(wah);
			synth.triggerAttackRelease("C4", 0.5);
		}, "autoWah.wav", 0.01);
	});

	context("API", () => {

		it("can pass in options in the constructor", () => {
			const autoWah = new AutoWah({
				baseFrequency: 150,
				octaves: 3,
				sensitivity: -10
			});
			expect(autoWah.baseFrequency).to.be.closeTo(150, 0.01);
			autoWah.baseFrequency = 250;
			expect(autoWah.baseFrequency).to.be.closeTo(250, 0.01);
			expect(autoWah.octaves).to.be.closeTo(3, 0.01);
			autoWah.octaves = 2;
			expect(autoWah.octaves).to.be.closeTo(2, 0.01);
			expect(autoWah.sensitivity).to.be.closeTo(-10, 0.1);
			autoWah.sensitivity = -20;
			expect(autoWah.sensitivity).to.be.closeTo(-20, 0.1);
			autoWah.dispose();
		});

		it("can get/set the options", () => {
			const autoWah = new AutoWah();
			autoWah.set({
				Q: 2.4,
			});
			expect(autoWah.get().Q).to.be.closeTo(2.4, 0.01);
			autoWah.dispose();
		});

		it("can set the gain and follower values", () => {
			const autoWah = new AutoWah();
			autoWah.gain.value = 1.2;
			autoWah.follower = 0.4;
			expect(autoWah.gain.value).to.be.closeTo(1.2, 0.01);
			expect(autoWah.follower).to.be.closeTo(0.4, 0.01);
			autoWah.dispose();
		});
	});
});