gnome-shell/tests/unit/signalTracker.js
Florian Müllner 105abab1e4 js: Remove modelines
We already include an .editorconfig that is supported by many
editors, including emacs, so no need to repeat an emacs-specific
modeline in every source file.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3431>
2024-07-30 18:20:55 +00:00

179 lines
5.1 KiB
JavaScript

import 'resource:///org/gnome/shell/ui/environment.js';
import GObject from 'gi://GObject';
import * as Signals from 'resource:///org/gnome/shell/misc/signals.js';
import {TransientSignalHolder, registerDestroyableType} from 'resource:///org/gnome/shell/misc/signalTracker.js';
const Destroyable = GObject.registerClass({
Signals: {'destroy': {}},
}, class Destroyable extends GObject.Object {});
registerDestroyableType(Destroyable);
const GObjectEmitter = GObject.registerClass({
Signals: {
'signal1': {},
'signal2': {},
},
}, class GObjectEmitter extends Destroyable {});
describe('connectObject()', () => {
let gobjectEmitter, eventEmitter;
let trackedObject;
beforeEach(() => {
gobjectEmitter = new GObjectEmitter();
eventEmitter = new Signals.EventEmitter();
trackedObject = {};
});
it('connects to GObject signals', () => {
const handler = jasmine.createSpy();
gobjectEmitter.connectObject('signal1', handler, trackedObject);
gobjectEmitter.emit('signal1');
expect(handler).toHaveBeenCalled();
});
it('connects to EventEmitter signals', () => {
const handler = jasmine.createSpy();
eventEmitter.connectObject('signal1', handler, trackedObject);
eventEmitter.emit('signal1');
expect(handler).toHaveBeenCalled();
});
it('can connect multiple GObject signals', () => {
const handler1 = jasmine.createSpy();
const handler2 = jasmine.createSpy();
gobjectEmitter.connectObject(
'signal1', handler1,
'signal2', handler2,
trackedObject);
gobjectEmitter.emit('signal1');
gobjectEmitter.emit('signal2');
expect(handler1).toHaveBeenCalled();
expect(handler2).toHaveBeenCalled();
});
it('can connect multiple EventEmitter signals', () => {
const handler1 = jasmine.createSpy();
const handler2 = jasmine.createSpy();
eventEmitter.connectObject(
'signal1', handler1,
'signal2', handler2,
trackedObject);
eventEmitter.emit('signal1');
eventEmitter.emit('signal2');
expect(handler1).toHaveBeenCalled();
expect(handler2).toHaveBeenCalled();
});
it('supports ConnectFlags for GObject signals', () => {
const handler1 = jasmine.createSpy();
const handler2 = jasmine.createSpy();
gobjectEmitter.connectObject(
'signal1', handler1,
'signal2', handler2, GObject.ConnectFlags.AFTER,
trackedObject);
gobjectEmitter.emit('signal1');
gobjectEmitter.emit('signal2');
expect(handler1).toHaveBeenCalled();
expect(handler2).toHaveBeenCalled();
});
it('supports ConnectFlags for EventEmitter signals', () => {
const handler1 = jasmine.createSpy();
const handler2 = jasmine.createSpy();
eventEmitter.connectObject(
'signal1', handler1,
'signal2', handler2, GObject.ConnectFlags.AFTER,
trackedObject);
eventEmitter.emit('signal1');
eventEmitter.emit('signal2');
expect(handler1).toHaveBeenCalled();
expect(handler2).toHaveBeenCalled();
});
});
describe('disconnectObject()', () => {
let emitter;
let trackedDestroyable, trackedObject;
beforeEach(() => {
emitter = new GObjectEmitter();
trackedDestroyable = new Destroyable();
trackedObject = {};
});
it('disconnects signals by tracked object', () => {
const handler = jasmine.createSpy();
emitter.connectObject(
'signal1', handler,
'signal2', handler,
trackedObject);
emitter.disconnectObject(trackedObject);
emitter.emit('signal1');
emitter.emit('signal2');
expect(handler).not.toHaveBeenCalled();
});
it('is called when a tracked destroyable is destroyed', () => {
const handler = jasmine.createSpy();
emitter.connectObject('signal1', handler, trackedDestroyable);
trackedDestroyable.emit('destroy');
emitter.emit('signal1');
expect(handler).not.toHaveBeenCalled();
});
});
describe('TransientSignalHolder', () => {
let emitter;
let tracked, transientHolder;
beforeEach(() => {
emitter = new GObjectEmitter();
tracked = new Destroyable();
transientHolder = new TransientSignalHolder(tracked);
});
it('destroys with its owner', () => {
const handler = jasmine.createSpy();
emitter.connectObject('signal1', handler, transientHolder);
tracked.emit('destroy');
emitter.emit('signal1');
expect(handler).not.toHaveBeenCalled();
});
it('can be destroyed without affecting its owner', () => {
const handler1 = jasmine.createSpy();
const handler2 = jasmine.createSpy();
emitter.connectObject('signal1', handler1, tracked);
emitter.connectObject('signal1', handler2, transientHolder);
transientHolder.destroy();
emitter.emit('signal1');
expect(handler1).toHaveBeenCalled();
expect(handler2).not.toHaveBeenCalled();
});
});