Back to Repositories

Testing AudioTrackList Management in video.js

This test suite validates the functionality of AudioTrackList implementation in video.js, focusing on track enablement states and change event handling. The tests ensure proper management of audio tracks and their enabled/disabled states within the video player.

Test Coverage Overview

The test suite provides comprehensive coverage of AudioTrackList functionality, focusing on track enablement and event handling.

  • Tests track enablement state management
  • Verifies change event triggering
  • Validates track addition and removal behavior
  • Ensures mutual exclusivity of enabled tracks

Implementation Analysis

The testing approach uses QUnit framework to systematically verify AudioTrackList behavior. Tests utilize EventTarget and AudioTrack classes to simulate real-world track management scenarios.

Key patterns include:
  • Event handler verification
  • State transition testing
  • Track list manipulation validation

Technical Details

Testing infrastructure includes:
  • QUnit test framework
  • ESLint for code quality
  • Custom EventTarget implementation
  • AudioTrack and AudioTrackList modules
  • Mock track objects for isolation testing

Best Practices Demonstrated

The test suite exemplifies high-quality testing practices through isolated test cases and comprehensive state verification.

  • Clear test case organization
  • Thorough cleanup after tests
  • Explicit state assertions
  • Event handler lifecycle management

videojs/videoJs

test/unit/tracks/audio-track-list.test.js

            
/* eslint-env qunit */
import AudioTrackList from '../../../src/js/tracks/audio-track-list.js';
import AudioTrack from '../../../src/js/tracks/audio-track.js';
import EventTarget from '../../../src/js/event-target.js';

QUnit.module('Audio Track List');

QUnit.test('trigger "change" when "enabledchange" is fired on a track', function(assert) {
  const track = new EventTarget();

  track.loaded_ = true;
  const audioTrackList = new AudioTrackList([track]);
  let changes = 0;
  const changeHandler = function() {
    changes++;
  };

  audioTrackList.on('change', changeHandler);
  track.trigger('enabledchange');
  assert.equal(changes, 1, 'one change events for trigger');

  audioTrackList.off('change', changeHandler);
  audioTrackList.onchange = changeHandler;

  track.trigger('enabledchange');
  assert.equal(changes, 2, 'one change events for another trigger');

  audioTrackList.removeTrack(track);
  audioTrackList.off('change');
});

QUnit.test('only one track is ever enabled', function(assert) {
  const track = new AudioTrack({enabled: true});
  const track2 = new AudioTrack({enabled: true});
  const track3 = new AudioTrack({enabled: true});
  const track4 = new AudioTrack();
  const list = new AudioTrackList([track, track2]);

  assert.equal(track.enabled, false, 'track is disabled');
  assert.equal(track2.enabled, true, 'track2 is enabled');

  track.enabled = true;
  assert.equal(track.enabled, true, 'track is enabled');
  assert.equal(track2.enabled, false, 'track2 is disabled');

  list.addTrack(track3);
  assert.equal(track.enabled, false, 'track is disabled');
  assert.equal(track2.enabled, false, 'track2 is disabled');
  assert.equal(track3.enabled, true, 'track3 is enabled');

  track2.enabled = true;
  assert.equal(track.enabled, false, 'track is disabled');
  assert.equal(track2.enabled, true, 'track2 is enabled');
  assert.equal(track3.enabled, false, 'track3 is disabled');

  list.addTrack(track4);
  assert.equal(track.enabled, false, 'track is disabled');
  assert.equal(track2.enabled, true, 'track2 is enabled');
  assert.equal(track3.enabled, false, 'track3 is disabled');
  assert.equal(track4.enabled, false, 'track4 is disabled');

  list.removeTrack(track);
  list.removeTrack(track2);
  list.removeTrack(track3);
  list.removeTrack(track4);
});

QUnit.test('all tracks can be disabled', function(assert) {
  const track = new AudioTrack();
  const track2 = new AudioTrack();

  // we need audiotracklist here to verify that it does not
  // re-enable a track
  const list = new AudioTrackList([track, track2]);

  assert.equal(track.enabled, false, 'track is disabled');
  assert.equal(track2.enabled, false, 'track2 is disabled');

  track.enabled = true;
  assert.equal(track.enabled, true, 'track is enabled');
  assert.equal(track2.enabled, false, 'track2 is disabled');

  track.enabled = false;
  assert.equal(track.enabled, false, 'track is disabled');
  assert.equal(track2.enabled, false, 'track2 is disabled');

  list.removeTrack(track);
  list.removeTrack(track2);
});

QUnit.test('trigger a change event per enabled change', function(assert) {
  const track = new AudioTrack({enabled: true});
  const track2 = new AudioTrack({enabled: true});
  const track3 = new AudioTrack({enabled: true});
  const track4 = new AudioTrack();
  const list = new AudioTrackList([track, track2]);
  let change = 0;

  list.on('change', () => change++);
  track.enabled = true;
  assert.equal(change, 1, 'one change triggered');

  list.addTrack(track3);
  assert.equal(change, 2, 'another change triggered by adding an enabled track');

  track.enabled = true;
  assert.equal(change, 3, 'another change trigger by changing enabled');

  track.enabled = false;
  assert.equal(change, 4, 'another change trigger by changing enabled');

  list.addTrack(track4);
  assert.equal(change, 4, 'no change triggered by adding a disabled track');

  list.removeTrack(track);
  list.removeTrack(track2);
  list.removeTrack(track3);
  list.removeTrack(track4);
  list.off();
});