signal-desktop/ts/test-both/calling/findBestMatchingDevice_test.ts
2024-10-07 16:32:31 -04:00

180 lines
5.6 KiB
TypeScript

// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { assert } from 'chai';
import { findBestMatchingAudioDeviceIndex } from '../../calling/findBestMatchingDevice';
describe('"find best matching device" helpers', () => {
describe('findBestMatchingAudioDeviceIndex', () => {
const itReturnsUndefinedIfNoDevicesAreAvailable = () => {
it('returns undefined if no devices are available', () => {
[
undefined,
{ name: 'Big Microphone', index: 1, uniqueId: 'abc123' },
].forEach(preferred => {
assert.isUndefined(
findBestMatchingAudioDeviceIndex(
{
available: [],
preferred,
},
false
)
);
});
});
};
const itReturnsTheFirstAvailableDeviceIfNoneIsPreferred = () => {
it('returns the first available device if none is preferred', () => {
assert.strictEqual(
findBestMatchingAudioDeviceIndex(
{
available: [
{ name: 'A', index: 123, uniqueId: 'device-A' },
{ name: 'B', index: 456, uniqueId: 'device-B' },
{ name: 'C', index: 789, uniqueId: 'device-C' },
],
preferred: undefined,
},
false
),
0
);
});
};
const testUniqueIdMatch = () => {
assert.strictEqual(
findBestMatchingAudioDeviceIndex(
{
available: [
{ name: 'A', index: 123, uniqueId: 'device-A' },
{ name: 'B', index: 456, uniqueId: 'device-B' },
{ name: 'C', index: 789, uniqueId: 'device-C' },
],
preferred: { name: 'Ignored', index: 99, uniqueId: 'device-C' },
},
false
),
2
);
};
const testNameMatch = () => {
assert.strictEqual(
findBestMatchingAudioDeviceIndex(
{
available: [
{ name: 'A', index: 123, uniqueId: 'device-A' },
{ name: 'B', index: 456, uniqueId: 'device-B' },
{ name: 'C', index: 789, uniqueId: 'device-C' },
],
preferred: { name: 'C', index: 99, uniqueId: 'ignored' },
},
false
),
2
);
};
const itReturnsTheFirstAvailableDeviceIfThePreferredDeviceIsNotFound =
() => {
it('returns the first available device if the preferred device is not found', () => {
assert.strictEqual(
findBestMatchingAudioDeviceIndex(
{
available: [
{ name: 'A', index: 123, uniqueId: 'device-A' },
{ name: 'B', index: 456, uniqueId: 'device-B' },
{ name: 'C', index: 789, uniqueId: 'device-C' },
],
preferred: { name: 'X', index: 123, uniqueId: 'Y' },
},
false
),
0
);
});
};
describe('find best matching device', () => {
itReturnsUndefinedIfNoDevicesAreAvailable();
itReturnsTheFirstAvailableDeviceIfNoneIsPreferred();
it('returns 0 if that was the previous preferred index (and a device is available)', () => {
assert.strictEqual(
findBestMatchingAudioDeviceIndex(
{
available: [
{ name: 'A', index: 123, uniqueId: 'device-A' },
{ name: 'B', index: 456, uniqueId: 'device-B' },
{ name: 'C', index: 789, uniqueId: 'device-C' },
],
preferred: { name: 'C', index: 0, uniqueId: 'device-C' },
},
false
),
0
);
});
it('(windows) returns 1 if that was the previous preferred index (and a device is available)', () => {
assert.strictEqual(
findBestMatchingAudioDeviceIndex(
{
available: [
{ name: 'A', index: 123, uniqueId: 'device-A' },
{ name: 'B', index: 456, uniqueId: 'device-B' },
{ name: 'C', index: 789, uniqueId: 'device-C' },
],
preferred: { name: 'C', index: 1, uniqueId: 'device-C' },
},
true
),
1
);
});
it('(non-windows) returns 2 if the preferred device was at index 1 and is now at index 2', () => {
assert.strictEqual(
findBestMatchingAudioDeviceIndex(
{
available: [
{ name: 'A', index: 123, uniqueId: 'device-A' },
{ name: 'B', index: 456, uniqueId: 'device-B' },
{ name: 'C', index: 789, uniqueId: 'device-C' },
],
preferred: { name: 'C', index: 1, uniqueId: 'device-C' },
},
false
),
2
);
});
it("returns 0 if the previous preferred index was 1 but there's only 1 audio device", () => {
assert.strictEqual(
findBestMatchingAudioDeviceIndex(
{
available: [{ name: 'A', index: 123, uniqueId: 'device-A' }],
preferred: { name: 'C', index: 1, uniqueId: 'device-C' },
},
false
),
0
);
});
it('returns a unique ID match if it exists and the preferred index is not 0 or 1', () => {
testUniqueIdMatch();
});
it('returns a name match if it exists and the preferred index is not 0 or 1', () => {
testNameMatch();
});
itReturnsTheFirstAvailableDeviceIfThePreferredDeviceIsNotFound();
});
});
});