var DommiscTest = function()

in 2019/functional/domMiscTest.js [20:310]


var DommiscTest = function() {

/**
 * DOM Miscellaneous Test Suite.
 * @class
 */
var domVersion = 'Current Editor\'s Draft';

var tests = [];
var info = 'Spec Version: ' + domVersion + ' | Default Timeout: ' +
    TestBase.timeout + 'ms';

var fields = ['passes', 'failures', 'timeouts'];

var createDomTest = function(name, category, mandatory) {
  var t = createTest(name);
  t.prototype.index = tests.length;
  t.prototype.passes = 0;
  t.prototype.failures = 0;
  t.prototype.timeouts = 0;
  t.prototype.category = category || 'DOM Misc';
  if (typeof mandatory === 'boolean') {
    t.prototype.mandatory = mandatory;
  }
  tests.push(t);
  return t;
};

/**
 * Validate the existence of value in element.
 */
var isValueInElement = function(value, name, element, runner) {
  try {
    if (Modernizr.prefixed(value, element, false) != false)
      runner.succeed();
    else
      throw 'Failed: ' + name + ': ' +
          Modernizr.prefixed(value, document.implementation, false);
  } catch (e) {
    runner.fail(e);
  }
};

/**
 * Ensure the DOM methods are correctly supported through Modernizr.
 */
var createCommonDomTest = function(value, category, element, mandatory) {
  var name = category.replace(/\s/g, '') + '.' + value;
  var test = createDomTest(name, category, mandatory);
  test.prototype.title = 'Test DOM Implementation of ' + name;
  test.prototype.start = function() {
    isValueInElement(value, name, element, this.runner);
  };
};

// Category: CharacterData.
var createCharDataTest = function(value, mandatory) {
  createCommonDomTest(
      value, 'CharacterData', document.createTextNode('Test'), mandatory);
};

createCharDataTest('appendData', false);
createCharDataTest('data');
createCharDataTest('deleteData', false);
createCharDataTest('insertData', false);
createCharDataTest('length', false);
createCharDataTest('replaceData', false);
createCharDataTest('substringData', false);

// Category: NamedNodeMap.
var createNameNodeMapTest = function(value, mandatory) {
  createCommonDomTest(
      value, 'NamedNodeMap', document.documentElement.attributes, mandatory);
};

createNameNodeMapTest('getNamedItem');
createNameNodeMapTest('getNamedItemNS', false);
createNameNodeMapTest('item');
createNameNodeMapTest('length');
createNameNodeMapTest('removeNamedItem', false);
createNameNodeMapTest('removeNamedItemNS', false);
createNameNodeMapTest('setNamedItem', false);
createNameNodeMapTest('setNamedItemNS', false);

// Category: Node.
var createNodeTest = function(value, mandatory) {
  createCommonDomTest(value, 'Node', document.body, mandatory);
};

createNodeTest('appendChild');
createNodeTest('attributes');
createNodeTest('childNodes');
createNodeTest('cloneNode');
createNodeTest('firstChild');
createNodeTest('hasAttributes', false);
createNodeTest('hasChildNodes');
createNodeTest('insertBefore');
createNodeTest('lastChild');
createNodeTest('nextSibling');
createNodeTest('nodeName');
createNodeTest('nodeType');
createNodeTest('nodeValue');
createNodeTest('normalize', false);
createNodeTest('ownerDocument');
createNodeTest('parentNode');
createNodeTest('previousSibling');
createNodeTest('removeChild');
createNodeTest('replaceChild');

createCommonDomTest('getElementById', 'Node', document, false);
createCommonDomTest('localName', 'Node', document.documentElement, false);
createCommonDomTest('namespaceURI', 'Node', document.documentElement, false);
createCommonDomTest('prefix', 'Node', document.documentElement, false);


// Category: Rect.
var createRectTest = function(value) {
  createCommonDomTest(value, 'Rect', window.getComputedStyle.getRectValue);
};

createRectTest('bottom');
createRectTest('left');
createRectTest('right');
createRectTest('top');

// Category: window.
var createWindowTest = function(value) {
  createCommonDomTest(value, 'window', window);
};

createWindowTest('addEventListener');
createWindowTest('clearInterval');
createWindowTest('clearTimeout');
createWindowTest('location');
createWindowTest('navigator');
createWindowTest('close');
createWindowTest('removeEventListener');
createWindowTest('setInterval');
createWindowTest('setTimeout');

var createEventTest = function(value) {
  var test = createDomTest('window.'+ value, 'window', false);
  test.prototype.title = 'Test event existence of window.' + value;
  test.prototype.start = function() {
    try {
      if (Modernizr.hasEvent(value, window))
        this.runner.succeed();
      else
        throw 'Failed: window.' + value + ': ' +
            Modernizr.hasEvent(value, window);
    } catch (e) {
      this.runner.fail(e);
    }
  }
};

createEventTest('keydown');
createEventTest('keypress');
createEventTest('keyup');

/**
 * Ensure that onerror event is correctly fired.
 */
var testOnerror = createDomTest('Window.onerror stack trace', 'window');
testOnerror.prototype.title = 'Test window.onerror';
testOnerror.prototype.start = function(runner) {
  window.addEventListener('error', function onerror(e) {
    window.removeEventListener('error', onerror);
    // line number should match
    if (e.lineno == 199 && (e.colno == 5 || e.colno == 12)) {
      runner.succeed();
    }
    else {
      runner.fail('Caught Error: line ' + e.lineno + ' : colno ' + e.colno);
    }
  });

  // Line that should raise an error
  setTimeout(function() {
    failure.test;
  }, 500);
};

/**
 * Ensure that device pixel ratio is either 1, 1.5 or 2.
 */
var testDevicePixelRatio = createDomTest('Window.devicePixelRatio', 'window');
testDevicePixelRatio.prototype.title = 'Test window.devicePixelRatio';
testDevicePixelRatio.prototype.start = function() {
  try {
    var devicePixelRatio = window.devicePixelRatio;
    if (devicePixelRatio == 2 ||
        devicePixelRatio == 1.5 || devicePixelRatio == 1 )
      this.runner.succeed();
    else
      throw 'Value returned: devicePixelRatio is ' +
          devicePixelRatio + '. Value must be 1, 1.5 or 2.';
  } catch(e) {
    this.runner.fail(e);
  }
};

// Category: Heap.
/**
 * Validate that totalJSHeapSizs API is supported.
 */
var testTotalJSHeapSize = createDomTest('totalJSHeapSize', 'Heap');
testTotalJSHeapSize.prototype.title = 'Test totalJSHeapSize is valid';
testTotalJSHeapSize.prototype.start = function() {
  try {
    var totalHeap = window.performance.memory.totalJSHeapSize;
    var usedHeap = window.performance.memory.usedJSHeapSize;
    if (totalHeap != undefined && totalHeap > 0 && totalHeap >= usedHeap)
      this.runner.succeed();
    else
      throw 'totalJSHeapSize is ' + totalHeap;
  } catch (e) {
    this.runner.fail(e);
  }
};

/**
 * Validate that usedJSHeapSizs API is supported.
 */
var testUsedJSHeapSize = createDomTest('usedJSHeapSize', 'Heap');
testUsedJSHeapSize.prototype.title = 'Test usedJSHeapSize is valid';
testUsedJSHeapSize.prototype.start = function() {
  try {
    var usedHeap = window.performance.memory.usedJSHeapSize;
    var totalHeap = window.performance.memory.totalJSHeapSize;
    if (usedHeap != undefined && usedHeap > 0 && usedHeap <= totalHeap)
      this.runner.succeed();
    else
      throw 'usedJSHeapSize is ' + usedHeap;
  } catch (e) {
    this.runner.fail(e);
  }
};

// Category: Assorted.
var createAssortedTest = function(value, name, element, mandatory) {
  var test = createDomTest(name, 'Assorted', mandatory);
  test.prototype.title = 'Test DOM Implementation of ' + name;
  test.prototype.start = function() {
    isValueInElement(value, name, element, this.runner);
  }
};

createAssortedTest('item', 'NodeList.list', document.body.div);
createAssortedTest(
    'length', 'NodeList.length', document.documentElement.childNodes);
createAssortedTest('publicId', 'Notation.publicId', document.doctype, false);
createAssortedTest('systemId', 'Notation.systemId', document.doctype, false);
createAssortedTest(
    'data', 'ProcessingInstruction.data', document.body.firstChild);
createAssortedTest('item', 'StyleSheetList.item', document.StyleSheetLists);
createAssortedTest('length', 'StyleSheetList.length', document.StyleSheetLists);
createAssortedTest(
    'splitText', 'Text.splitText', document.body.firstChild, false);
createAssortedTest('getComputedStyle', 'ViewCSS.getComputedStyle', window);
createAssortedTest(
    'sheet',
    'LinkStyle.sheet',
    document.getElementsByTagName('link')[0],
    false);
createAssortedTest('item', 'MediaList.item', document.mediaList);
createAssortedTest('length', 'MediaList.length', document.mediaList);


// Category: CreateEvent.
var createInitEventTest = function(value, event, mandatory) {
  var name = event + '.' + value;
  var test = createDomTest(name, 'CreateEvent', mandatory);
  test.prototype.title = 'Test DOM Implementation of ' + name;
  test.prototype.start = function() {
    try {
      var element = document.createEvent(event);
      isValueInElement(value, name, element, this.runner);
    } catch (e) {
      this.runner.fail(e);
    }
  }
};

createInitEventTest('initUIEvent', 'UIEvents');
createInitEventTest('initMouseEvent', 'MouseEvents', false);
createInitEventTest('initMutationEvent', 'MutationEvents', false);


return {tests: tests, info: info, fields: fields, viewType: 'default'};
};