mirror of
https://github.com/Tonejs/Tone.js
synced 2024-11-15 16:17:58 +00:00
169 lines
4.1 KiB
TypeScript
169 lines
4.1 KiB
TypeScript
import { BasicTests } from "test/helper/Basic";
|
|
import { UserMedia } from "./UserMedia";
|
|
import { GET_USER_MEDIA } from "test/helper/Supports";
|
|
import { expect } from "chai";
|
|
import { OfflineContext } from "Tone/core";
|
|
|
|
describe("UserMedia", () => {
|
|
|
|
// run the common tests
|
|
BasicTests(UserMedia);
|
|
|
|
context("Source Tests", () => {
|
|
|
|
it("can be constructed with the input number", () => {
|
|
const extIn = new UserMedia();
|
|
extIn.dispose();
|
|
});
|
|
|
|
it("can be constructed with an options object", () => {
|
|
const extIn = new UserMedia({
|
|
volume: -10,
|
|
mute: false
|
|
});
|
|
expect(extIn.volume.value).to.be.closeTo(-10, 0.1);
|
|
expect(extIn.mute).to.be.false;
|
|
extIn.dispose();
|
|
});
|
|
|
|
it("indicates if the browser has UserMedia support", () => {
|
|
expect(UserMedia.supported).to.be.a("boolean");
|
|
});
|
|
|
|
});
|
|
|
|
// if it is a manual test (i.e. there is a person to 'allow' the microphone)
|
|
if (GET_USER_MEDIA && UserMedia.supported) {
|
|
|
|
context("Opening and closing", function() {
|
|
|
|
// long timeout to give testers time to allow the microphone
|
|
this.timeout(100000);
|
|
|
|
let HAS_USER_MEDIA_INPUTS = false;
|
|
|
|
before(() => {
|
|
return UserMedia.enumerateDevices().then((devices) => {
|
|
HAS_USER_MEDIA_INPUTS = devices.length > 0;
|
|
});
|
|
});
|
|
|
|
it("open returns a promise", () => {
|
|
if (HAS_USER_MEDIA_INPUTS) {
|
|
const extIn = new UserMedia();
|
|
const promise = extIn.open();
|
|
expect(promise).to.have.property("then");
|
|
return promise.then(() => {
|
|
extIn.dispose();
|
|
});
|
|
}
|
|
});
|
|
|
|
it("can open an input", () => {
|
|
if (HAS_USER_MEDIA_INPUTS) {
|
|
const extIn = new UserMedia();
|
|
return extIn.open().then(() => {
|
|
extIn.dispose();
|
|
});
|
|
}
|
|
});
|
|
|
|
it("can open an input by name", () => {
|
|
if (HAS_USER_MEDIA_INPUTS) {
|
|
const extIn = new UserMedia();
|
|
let name: string;
|
|
return UserMedia.enumerateDevices().then((devices) => {
|
|
name = devices[0].deviceId;
|
|
return extIn.open(name);
|
|
}).then(() => {
|
|
expect(extIn.deviceId).to.equal(name);
|
|
extIn.dispose();
|
|
});
|
|
}
|
|
});
|
|
|
|
it("can open an input by index", () => {
|
|
if (HAS_USER_MEDIA_INPUTS) {
|
|
const extIn = new UserMedia();
|
|
return extIn.open(0).then(() => {
|
|
extIn.dispose();
|
|
});
|
|
}
|
|
});
|
|
|
|
it("throws an error if it cant find the device name", () => {
|
|
if (HAS_USER_MEDIA_INPUTS) {
|
|
const extIn = new UserMedia();
|
|
return extIn.open("doesn't exist").then(() => {
|
|
// shouldn't call 'then'
|
|
throw new Error("shouldnt call 'then'");
|
|
}).catch(() => {
|
|
extIn.dispose();
|
|
});
|
|
}
|
|
});
|
|
|
|
it("is 'started' after media is open and 'stopped' otherwise", () => {
|
|
if (HAS_USER_MEDIA_INPUTS) {
|
|
const extIn = new UserMedia();
|
|
expect(extIn.state).to.equal("stopped");
|
|
return extIn.open().then(() => {
|
|
expect(extIn.state).to.equal("started");
|
|
extIn.dispose();
|
|
});
|
|
}
|
|
});
|
|
|
|
it("has a label, group and device id when open", () => {
|
|
if (HAS_USER_MEDIA_INPUTS) {
|
|
const extIn = new UserMedia();
|
|
return extIn.open().then(() => {
|
|
expect(extIn.deviceId).to.be.a("string");
|
|
expect(extIn.groupId).to.be.a("string");
|
|
expect(extIn.label).to.be.a("string");
|
|
extIn.dispose();
|
|
});
|
|
}
|
|
});
|
|
|
|
it("can reopen an input", () => {
|
|
if (HAS_USER_MEDIA_INPUTS) {
|
|
const extIn = new UserMedia();
|
|
return extIn.open().then(() => {
|
|
return extIn.open();
|
|
}).then(() => {
|
|
extIn.dispose();
|
|
});
|
|
}
|
|
});
|
|
|
|
it("can close an input", () => {
|
|
if (HAS_USER_MEDIA_INPUTS) {
|
|
const extIn = new UserMedia();
|
|
return extIn.open().then(() => {
|
|
extIn.close();
|
|
extIn.dispose();
|
|
});
|
|
}
|
|
});
|
|
|
|
it("can enumerate devices", () => {
|
|
return UserMedia.enumerateDevices().then((devices) => {
|
|
expect(devices).to.be.instanceOf(Array);
|
|
});
|
|
});
|
|
|
|
it("doesn't work in OfflineContext", done => {
|
|
if (HAS_USER_MEDIA_INPUTS) {
|
|
const context = new OfflineContext(2, 2, 44100);
|
|
const extIn = new UserMedia({ context });
|
|
extIn.open().catch(() => {
|
|
done();
|
|
});
|
|
} else {
|
|
done();
|
|
}
|
|
});
|
|
});
|
|
}
|
|
});
|