import Test from "helper/Test";
import Bus from "Tone/core/Bus";
import Tone from "Tone/core/Tone";
import Offline from "helper/Offline";
import PassAudio from "helper/PassAudio";
import Signal from "Tone/signal/Signal";
import Gain from "Tone/core/Gain";
import Merge from "Tone/component/Merge";

describe("Bus", function(){
	it("provides a send and receive method", function(){
		expect(Tone.prototype.send).is.a("function");
		expect(Tone.prototype.receive).is.a("function");
	});

	it("passes audio from a send to a receive with the same name", function(){
		return PassAudio(function(input){
			//make them pass through nodes
			var send = new Gain();
			var recv = new Gain().toMaster();
			input.connect(send);
			send.send("test");
			recv.receive("test");
		});
	});

	it("can create the recieve before the send", function(){
		return PassAudio(function(input){
			//make them pass through nodes
			var send = new Gain();
			var recv = new Gain().toMaster();
			input.connect(send);
			recv.receive("test");
			send.send("test");
		});
	});

	it("passes audio from a send to a receive at the given level", function(){
		return Offline(function(){
			var sig = new Signal(1);
			var recv = new Gain().toMaster();
			sig.send("test", -12);
			recv.receive("test");
		}, 0.05).then(function(buffer){
			buffer.forEach(function(sample){
				expect(sample).to.be.closeTo(0.25, 0.1);
			});
		});
	});

	it("can receive from a specific channel", function(){
		return Offline(function(){
			var sig = new Signal(2);
			var recv = new Merge().toMaster();
			sig.send("test");
			recv.receive("test", 1);
		}, 0.05, 2).then(function(buffer){
			buffer.forEach(function(l, r){
				expect(l).to.be.closeTo(0, 0.01);
				expect(r).to.be.closeTo(2, 0.01);
			});
		});
	});
});