var DomelementTest = function()

in 2019/functional/domelementTest.js [24:293]


var DomelementTest = function() {
  var testVersion = 'Current Editor\'s Draft';

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

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

  var createElementTest = 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 || 'Element';
    if (typeof mandatory === 'boolean') {
      t.prototype.mandatory = mandatory;
    }
    tests.push(t);
    return t;
  };

  var createTemplateElementTest = function(
      name, category, title, evaluate, mandatory) {
    var test = createElementTest(name, category, mandatory);
    test.prototype.title = title;
    test.prototype.start = function() {
      try {
        if (evaluate())
          this.runner.succeed();
        else
          throw name + 'failed';
      } catch (e) {
        this.runner.fail(e);
      }
    }
  };

  var createCommonElementTest = function(
      name, value, mandatory, evaluate, title) {
    evaluate = evaluate || function() {
      return !(
          document.createElement(value) instanceof window.HTMLUnknownElement);
    };
    var title = title || 'Test ' + name + ' by create ' + value + ' Element.';
    createTemplateElementTest(
      name + ' Element', 'Element', title, evaluate, mandatory);
  };


  createCommonElementTest(
      'Unknown',
      null,
      true,
      function() {
        return document.createElement('UNKNOWN') instanceof
            window.HTMLUnknownElement;
      },
      'Test creating unknown element.');

  createCommonElementTest('Anchor', 'a');

  createCommonElementTest(
      'Audio',
      'audio',
      false,
      function() {
        return document.createElement('audio') !=
            '[object HTMLUnknownElement]' && Modernizr.audio;
      },
      'Test creation of audio element by Modernizr.');

  createCommonElementTest('Area', 'area', false);
  createCommonElementTest('Base', 'base', false);
  createCommonElementTest('BaseFont', 'basefont', false);
  createCommonElementTest('Blockquote', 'blockquote', false);
  createCommonElementTest('Body', 'body');
  createCommonElementTest('BR', 'br');
  createCommonElementTest('Button', 'button', false);

  createCommonElementTest(
      'Canvas',
      null,
      harnessConfig.support_webgl && !harnessConfig.is_cobalt,
      function() {
        return Modernizr.canvas;
      },
      'Test Canvas element by Modernizr.');


  createCommonElementTest('Deleted', 'del', false);
  createCommonElementTest('Directory', 'dir', false);
  createCommonElementTest('Div', 'div');
  createCommonElementTest('DList', 'dl', false);
  createCommonElementTest('FieldSet', 'fieldset', false);
  createCommonElementTest('Font', 'font', false);
  createCommonElementTest('Form', 'form', false);
  createCommonElementTest('Frame', 'frame', false);
  createCommonElementTest('FrameSet', 'frameset', false);
  createCommonElementTest('Head', 'head');
  createCommonElementTest('Heading 1', 'h1');
  createCommonElementTest('Heading 2', 'h2');
  createCommonElementTest('Heading 3', 'h3');
  createCommonElementTest('HR', 'hr', false);
  createCommonElementTest('HTML', 'html');
  createCommonElementTest('HTMLCollection', 'src', false);
  createCommonElementTest('Iframe', 'iframe', false);
  createCommonElementTest('Image', 'img');
  createCommonElementTest('Input', 'input', false);
  createCommonElementTest('Inserted', 'ins', false);
  createCommonElementTest('Label', 'label', false);
  createCommonElementTest('Legend', 'legend', false);
  createCommonElementTest('Link', 'link');
  createCommonElementTest('List', 'li', false);
  createCommonElementTest('Map', 'map', false);
  createCommonElementTest('Menu', 'menu', false);
  createCommonElementTest('Meta', 'meta');
  createCommonElementTest('Obejct', 'object', false);
  createCommonElementTest('Olist', 'ol', false);
  createCommonElementTest('OptGroup', 'optgroup', false);
  createCommonElementTest('Option', 'option', false);
  createCommonElementTest('Paragraph', 'p');
  createCommonElementTest('Param', 'param', false);
  createCommonElementTest('Pre', 'pre', false);
  createCommonElementTest('Quote', 'q', false);
  createCommonElementTest('Script', 'script');
  createCommonElementTest('Select', 'select', false);
  createCommonElementTest('Span', 'span');
  createCommonElementTest('Style', 'style');
  createCommonElementTest('Table Body', 'tbody', false);
  createCommonElementTest('Table', 'table', false);
  createCommonElementTest('Table Foot', 'tfoot', false);
  createCommonElementTest('Table Head', 'thead', false);
  createCommonElementTest('TableCol', 'col', false);
  createCommonElementTest('TableDataCell', 'td', false);
  createCommonElementTest('TableHeadCell', 'th', false);
  createCommonElementTest('TableRow', 'tr', false);
  createCommonElementTest('TextArea', 'textarea', false);
  createCommonElementTest('Title', 'title');
  createCommonElementTest('UList', 'ul', false);
  createCommonElementTest('Video', 'video');


  /**
   * Validate videoElement fields is correctly handled.
   */
  var createVideoFieldTest = function(name, evaluate, mandatory) {
    var setupVideoElement = function() {
      var videoElement = document.createElement('video');
      if (!(videoElement instanceof window.HTMLUnknownElement)) {
        return evaluate(videoElement);
      } else {
        return false;
      }
    };

    var title = 'Test video.' + name + ' by create video Element.';
    createTemplateElementTest(
        'video.' + name, 'Video', title, setupVideoElement, mandatory);
  };

  createVideoFieldTest('height', function(videoElement) {
    if (videoElement.height == 0) {
      videoElement.height = 1080;
      if (videoElement.height == 1080) return true;
    }
    return false;
  });

  createVideoFieldTest('width', function(videoElement) {
    if (videoElement.width == 0) {
      videoElement.width = 1920;
      if (videoElement.width == 1920) return true;
    }
    return false;
  });

  createVideoFieldTest('videoHeight', function(videoElement) {
    if (videoElement.videoHeight == 0) {
      try {
        // read only
        videoElement.videoHeight = 1080;
      } catch (e) {
        return videoElement.videoHeight != 1080;
      }
    }
    return false;
  });

  createVideoFieldTest('videoWidth', function(videoElement) {
    if (videoElement.videoWidth == 0) {
      try {
        // read only
        videoElement.videoWidth = 1920;
      } catch (e) {
        return videoElement.videoWidth != 1920;
      }
    }
    return false;
  });

  createVideoFieldTest('poster', function(videoElement) {
    return videoElement.poster == '';
  }, false);


  /**
   * Setup element attributes for testing.
   */
  var setupAttrElement = function() {
    var attrElement = document.createElement('div');
    attrElement.className = 'attr-class';
    attrElement.id = 'attr-test';
    document.getElementById('testArea').appendChild(attrElement);
    console.log('setup');
  };

  /**
   * Teardown element attributes for testing.
   */
  var tearDownAttrElement = function() {
    var attrElement = document.getElementById('attr-test');
    attrElement.parentNode.removeChild(attrElement);
    console.log('teardown');
  };

  /**
   * Ensure element.attributes behave as expected.
   */
  var createAttrFieldTest = function(name, evaluate, mandatory) {
    var title = 'Test Attr.' + name + '.';
    var test = createElementTest('Attr.' + name, 'Attribute', mandatory);
    test.prototype.title = title;
    test.prototype.start = function() {
      try {
        setupAttrElement()
        var attrElement = document.getElementById('attr-test');
        if (evaluate(attrElement))
          this.runner.succeed();
        else
          throw name + 'failed';
      } catch (e) {
        this.runner.fail(e);
      } finally {
        tearDownAttrElement();
      }
    }
  };

  createAttrFieldTest('name', function(attrElement) {
    return attrElement.attributes.getNamedItem('id').name == 'id';
  });

  createAttrFieldTest('owner', function(attrElement) {
    return attrElement.attributes.getNamedItem('id').ownerElement ==
        attrElement;
  }, false);

  createAttrFieldTest('specified', function(attrElement) {
    return attrElement.attributes.getNamedItem('id').specified;
  }, false);

  createAttrFieldTest('value', function(attrElement) {
    return attrElement.attributes.getNamedItem('class').value == 'attr-class';
  });


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