text: var Transmuxer = require('../lib/partial/transmuxer.js');
  var utils = require('./utils');
  var generatePMT = utils.generatePMT;
  var videoPes = utils.videoPes;
  var audioPes = utils.audioPes;
  var packetize = utils.packetize;
  var PAT = utils.PAT;
  
  QUnit.module('Partial Transmuxer - Options');
  [
    {options: {keepOriginalTimestamps: false}},
    {options: {keepOriginalTimestamps: true}},
    {options: {keepOriginalTimestamps: false, baseMediaDecodeTime: 15000}},
    {options: {keepOriginalTimestamps: true, baseMediaDecodeTime: 15000}},
    {options: {keepOriginalTimestamps: false}, baseMediaSetter: 15000},
    {options: {keepOriginalTimestamps: true}, baseMediaSetter: 15000}
  ].forEach(function(test) {
    var createTransmuxer = function() {
      var transmuxer = new Transmuxer(test.options);
  
      if (test.baseMediaSetter) {
        transmuxer.setBaseMediaDecodeTime(test.baseMediaSetter);
      }
  
      return transmuxer;
    };
  
    var name = '';
  
    Object.keys(test.options).forEach(function(optionName) {
      name += '' + optionName + ' ' + test.options[optionName] + ' ';
    });
  
    if (test.baseMediaSetter) {
      name += 'baseMediaDecodeTime setter ' + test.baseMediaSetter;
    }
  
    QUnit.test('Audio frames after video not trimmed, ' + name, function(assert) {
      var
      segments = [],
        earliestDts = 15000,
        transmuxer = createTransmuxer();
  
      transmuxer.on('data', function(segment) {
        segments.push(segment);
      });
  
      // the following transmuxer pushes add tiny video and
      // audio data to the transmuxer. When we add the data
      // we also set the pts/dts time so that audio should
      // not be trimmed.
      transmuxer.push(packetize(PAT));
      transmuxer.push(packetize(generatePMT({
        hasVideo: true,
        hasAudio: true
      })));
  
      transmuxer.push(packetize(audioPes([
        0x19, 0x47
      ], true, earliestDts + 1)));
      transmuxer.push(packetize(videoPes([
        0x09, 0x01 // access_unit_delimiter_rbsp
      ], true, earliestDts)));
      transmuxer.push(packetize(videoPes([
        0x08, 0x01 // pic_parameter_set_rbsp
      ], true, earliestDts)));
      transmuxer.push(packetize(videoPes([
        0x07, // seq_parameter_set_rbsp
        0x27, 0x42, 0xe0, 0x0b,
        0xa9, 0x18, 0x60, 0x9d,
        0x80, 0x53, 0x06, 0x01,
        0x06, 0xb6, 0xc2, 0xb5,
        0xef, 0x7c, 0x04
      ], false, earliestDts)));
      transmuxer.push(packetize(videoPes([
        0x05, 0x01 // slice_layer_without_partitioning_rbsp_idr
      ], true, earliestDts)));
      transmuxer.flush();
  
      // the partial transmuxer only generates a video segment
      // when all audio frames are trimmed. So we should have an audio and video
      // segment
      assert.equal(segments.length, 2, 'generated a video and an audio segment');
      assert.equal(segments[0].type, 'video', 'video segment exists');
      assert.equal(segments[1].type, 'audio', 'audio segment exists');
    });
  
    QUnit.test('Audio frames trimmed before video, ' + name, function(assert) {
      var
      segments = [],
        earliestDts = 15000,
        baseTime = test.options.baseMediaDecodeTime || test.baseMediaSetter || 0,
        transmuxer = createTransmuxer();
  
      transmuxer.on('data', function(segment) {
        segments.push(segment);
      });
  
      // the following transmuxer pushes add tiny video and
      // audio data to the transmuxer. When we add the data
      // we also set the pts/dts time so that audio should
      // be trimmed.
      transmuxer.push(packetize(PAT));
      transmuxer.push(packetize(generatePMT({
        hasVideo: true,
        hasAudio: true
      })));
  
      transmuxer.push(packetize(audioPes([
        0x19, 0x47
      ], true, earliestDts - baseTime - 1)));
      transmuxer.push(packetize(videoPes([
        0x09, 0x01 // access_unit_delimiter_rbsp
      ], true, earliestDts)));
      transmuxer.push(packetize(videoPes([
        0x08, 0x01 // pic_parameter_set_rbsp
      ], true, earliestDts)));
      transmuxer.push(packetize(videoPes([
        0x07, // seq_parameter_set_rbsp
        0x27, 0x42, 0xe0, 0x0b,
        0xa9, 0x18, 0x60, 0x9d,
        0x80, 0x53, 0x06, 0x01,
        0x06, 0xb6, 0xc2, 0xb5,
        0xef, 0x7c, 0x04
      ], false, earliestDts)));
      transmuxer.push(packetize(videoPes([
        0x05, 0x01 // slice_layer_without_partitioning_rbsp_idr
      ], true, earliestDts)));
      transmuxer.flush();
  
      // the partial transmuxer only generates a video segment
      // when all audio frames are trimmed.
      if (test.options.keepOriginalTimestamps && !baseTime) {
        assert.equal(segments.length, 2, 'generated both a video/audio segment');
        assert.equal(segments[0].type, 'video', 'segment is video');
        assert.equal(segments[1].type, 'audio', 'segment is audio');
      } else {
        assert.equal(segments.length, 1, 'generated only a video segment');
        assert.equal(segments[0].type, 'video', 'segment is video');
      }
    });
  });
  