mirror of
https://github.com/arthur-pbty/arthur-os.git
synced 2026-08-01 20:28:16 +02:00
94 lines
4.1 KiB
Bash
94 lines
4.1 KiB
Bash
#!/bin/bash
|
|
|
|
set -euo pipefail
|
|
|
|
source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh"
|
|
|
|
grep -q '^ConditionPathIsDirectory=/sys/class/bluetooth$' "$ROOT/default/systemd/user/bt-agent.service" || \
|
|
fail "bt-agent is skipped on machines without Bluetooth hardware"
|
|
pass "bt-agent is skipped on machines without Bluetooth hardware"
|
|
|
|
run_node_test <<'JS'
|
|
const bluetooth = requireFromRoot('shell/plugins/panels/bluetooth/Model.js')
|
|
|
|
assert(bluetooth.isUuidLike('0000110b-0000-1000-8000-00805f9b34fb'), 'bluetooth detects UUID-like names')
|
|
assert(bluetooth.isAddressLike('AA:BB:CC:DD:EE:FF'), 'bluetooth detects address-like names')
|
|
assertEqual(bluetooth.normalizedAddress('AA:BB_CC-dd-ee-ff'), 'aabbccddeeff', 'bluetooth normalizes BlueZ and PipeWire address formats')
|
|
assert(!bluetooth.hasHumanName({ name: 'AA:BB:CC:DD:EE:FF' }), 'bluetooth rejects address-only device labels')
|
|
assert(bluetooth.hasHumanName({ deviceName: 'MX Master 3S' }), 'bluetooth accepts human device labels')
|
|
|
|
const devices = [
|
|
{ name: 'Speaker', connected: false, paired: true, address: '2' },
|
|
{ name: 'Headphones', connected: true, address: '1' },
|
|
{ name: 'Keyboard', connected: false, address: '3' },
|
|
{ name: 'AA:BB:CC:DD:EE:FF', connected: true, address: '4' },
|
|
{ name: 'Mouse', connected: false, trusted: true, address: '5' }
|
|
]
|
|
|
|
const arrayLikeDevices = {
|
|
0: devices[0],
|
|
1: devices[1],
|
|
length: 2
|
|
}
|
|
assertDeepEqual(
|
|
bluetooth.toArray(arrayLikeDevices).map(bluetooth.deviceLabel),
|
|
['Speaker', 'Headphones'],
|
|
'bluetooth converts Quickshell QObjectList-style values into arrays'
|
|
)
|
|
|
|
const lists = bluetooth.deviceLists(devices)
|
|
assertDeepEqual(lists.connected.map(bluetooth.deviceLabel), ['Headphones'], 'bluetooth groups connected devices')
|
|
assertDeepEqual(lists.known.map(bluetooth.deviceLabel), ['Mouse', 'Speaker'], 'bluetooth groups known devices by label')
|
|
assertDeepEqual(lists.discovered.map(bluetooth.deviceLabel), ['Keyboard'], 'bluetooth groups discovered devices')
|
|
assertDeepEqual(bluetooth.visibleSections(lists, true), ['connected', 'known', 'discovered'], 'bluetooth shows discovered section while scanning')
|
|
assertDeepEqual(bluetooth.visibleSections(lists, false), ['connected', 'known'], 'bluetooth hides discovered section when not scanning')
|
|
|
|
const arrayLikeLists = bluetooth.deviceLists({
|
|
0: { name: 'Earbuds', connected: true, address: '6' },
|
|
1: { name: 'Trackpad', paired: true, address: '7' },
|
|
2: { name: 'Gamepad', address: '8' },
|
|
length: 3
|
|
})
|
|
assertDeepEqual(arrayLikeLists.connected.map(bluetooth.deviceLabel), ['Earbuds'], 'bluetooth groups connected devices from array-like values')
|
|
assertDeepEqual(arrayLikeLists.known.map(bluetooth.deviceLabel), ['Trackpad'], 'bluetooth groups known devices from array-like values')
|
|
assertDeepEqual(arrayLikeLists.discovered.map(bluetooth.deviceLabel), ['Gamepad'], 'bluetooth groups discovered devices from array-like values')
|
|
|
|
assertDeepEqual(
|
|
bluetooth.withPendingAction({ a: 'connecting' }, 'b', 'forgetting'),
|
|
{ a: 'connecting', b: 'forgetting' },
|
|
'bluetooth adds pending actions immutably'
|
|
)
|
|
assertDeepEqual(bluetooth.withPendingAction({ a: 'connecting' }, 'a', ''), {}, 'bluetooth clears pending actions immutably')
|
|
|
|
const bluetoothSink = {
|
|
isSink: true,
|
|
isStream: false,
|
|
ready: true,
|
|
name: 'bluez_output.AA_BB_CC_DD_EE_FF.1',
|
|
properties: {
|
|
'device.product.name': 'JBL Go 3'
|
|
}
|
|
}
|
|
assert(
|
|
bluetooth.bluetoothSinkMatchesDevice(bluetoothSink, { address: 'AA:BB:CC:DD:EE:FF', name: 'JBL Go 3' }),
|
|
'bluetooth matches audio sinks by device address'
|
|
)
|
|
assert(
|
|
bluetooth.bluetoothSinkMatchesDevice(
|
|
{
|
|
isSink: true,
|
|
isStream: false,
|
|
ready: true,
|
|
name: 'alsa_output.usb-speaker',
|
|
properties: { 'device.product.name': 'JBL Go 3' }
|
|
},
|
|
{ address: '11:22:33:44:55:66', name: 'JBL Go 3' }
|
|
),
|
|
'bluetooth matches audio sinks by human device label when address is unavailable'
|
|
)
|
|
assert(
|
|
!bluetooth.bluetoothSinkMatchesDevice({ isSink: false, isStream: false, ready: true, name: 'bluez_output.AA_BB_CC_DD_EE_FF.1', properties: {} }, { address: 'AA:BB:CC:DD:EE:FF', name: 'JBL Go 3' }),
|
|
'bluetooth ignores non-sink nodes when matching audio outputs'
|
|
)
|
|
JS
|