<!DOCTYPE html>
<meta charset=utf-8>
<title>KeyframeEffectReadOnly spacing attribute tests</title>
<link rel="help"
href="https://w3c.github.io/web-animations/#dom-keyframeeffectreadonly-spacing">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../testcommon.js"></script>
<body>
<div id="log"></div>
<script>
"use strict";

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: '' });
  });
}, 'Test throwing TypeError if using empty string');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'dist' });
  });
}, 'Test throwing TypeError if not using the correct keyword');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: ' paced(margin-left)' });
  });
}, 'Test throwing TypeError if adding leading spaces');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(margin-left) ' });
  });
}, 'Test throwing TypeError if adding trailing spaces');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced( margin-left)' });
  });
}, 'Test throwing TypeError if adding leading spaces before the ' +
   'paced property');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(margin-left )' });
  });
}, 'Test throwing TypeError if adding trailing spaces after the ' +
   'paced property');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced()' });
  });
}, 'Test throwing TypeError if these is no paced property');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(.margin)' });
  });
}, 'Test throwing TypeError if using a non-ident started string');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(1margin)' });
  });
}, 'Test throwing TypeError if using a non-ident started string');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(\\)' });
  });
}, 'Test throwing TypeError if using a non-ident started string with ' +
   'an invalid escape');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(\\\fmargin)' });
  });
}, 'Test throwing TypeError if using a non-ident started string with ' +
   'an invalid escape (FF)');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(\\\rmargin)' });
  });
}, 'Test throwing TypeError if using a non-ident started string with ' +
   'an invalid escape (CR)');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(\\\nmargin)' });
  });
}, 'Test throwing TypeError if using a non-ident started string with ' +
   'an invalid escape (LF)');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(- )' });
  });
}, 'Test throwing TypeError if using a non-ident started string with ' +
   'a leading minus and an invalid name-start code point');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(-\\)' });
  });
}, 'Test throwing TypeError if using a non-ident started string with ' +
   'a leading minus and an invalid escape');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(-\\\fmargin)' });
  });
}, 'Test throwing TypeError if using a non-ident started string with ' +
   'a leading minus and an invalid escape (FF)');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(-\\\rmargin)' });
  });
}, 'Test throwing TypeError if using a non-ident started string with ' +
   'a leading minus and an invalid escape (CR)');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(-\\\nmargin)' });
  });
}, 'Test throwing TypeError if using a non-ident started string with ' +
   'a leading minus and an invalid escape (LF)');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(--\\)' });
  });
}, 'Test throwing TypeError if using a non-ident string with an invalid ' +
   'escape');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(--\\\fmargin)' });
  });
}, 'Test throwing TypeError if using a non-ident string with an invalid ' +
   'escape (FF)');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(--\\\rmargin)' });
  });
}, 'Test throwing TypeError if using a non-ident string with an invalid ' +
   'escape (CR)');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(--\\\nmargin)' });
  });
}, 'Test throwing TypeError if using a non-ident string with an invalid ' +
   'escape (LF)');

test(function(t) {
  assert_throws(new TypeError, function() {
    createDiv(t).animate(null, { spacing: 'paced(margin.left)' });
  });
}, 'Test throwing TypeError if using a non-ident string with an invalid name ' +
   'code point');

test(function(t) {
  var anim = createDiv(t).animate(null, { spacing: 'paced(A)' });
  assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
}, 'Test falling back to distribute spacing if using a unrecognized property');

test(function(t) {
  var anim = createDiv(t).animate(null, { spacing: 'paced(\\.margin)' });
  assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
}, 'Test falling back to distribute spacing if using a unrecognized property ' +
   'which starts with a valid escape (Full stop)');

test(function(t) {
  var anim = createDiv(t).animate(null, { spacing: 'paced(\\ margin)' });
  assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
}, 'Test falling back to distribute spacing if using a unrecognized property ' +
   'which starts with a valid escape (white space)');

test(function(t) {
  var anim = createDiv(t).animate(null, { spacing: 'paced(_margin)' });
  assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
}, 'Test falling back to distribute spacing if using a unrecognized property ' +
   'which starts with a valid escape (low line)');

test(function(t) {
  var anim = createDiv(t).animate(null, { spacing: 'paced(-_margin)' });
  assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
}, 'Test falling back to distribute spacing if using a unrecognized property ' +
   'which starts with a minus and a low line');

test(function(t) {
  var anim = createDiv(t).animate(null, { spacing: 'paced(-\\.margin)' });
  assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
}, 'Test falling back to distribute spacing if using a unrecognized property ' +
   'which starts with a minus and a valid escape');

test(function(t) {
  var anim = createDiv(t).animate(null, { spacing: 'paced(--bg-color)' });
  assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
}, 'Test falling back to distribute spacing if using CSS variables');

test(function(t) {
  var anim = createDiv(t).animate(null, { spacing: 'paced(animation)' });
  assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
}, 'Test falling back to distribute spacing if using a non-animatable ' +
   'shorthand property');

test(function(t) {
  var anim = createDiv(t).animate(null,
                                  { spacing: 'paced(animation-duration)' });
  assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
}, 'Test falling back to distribute spacing if using a non-animatable ' +
   'property');

test(function(t) {
  var anim = createDiv(t).animate(null);
  assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
}, 'Test default value of spacing');

test(function(t) {
  var anim = createDiv(t).animate(null, { spacing: 'distribute' });
  assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
}, 'Test spacing value if setting distribute');

test(function(t) {
  var anim = createDiv(t).animate(null, { spacing: 'paced(margin-left)' });
  assert_equals(anim.effect.spacing, 'paced(margin-left)', 'spacing mode');
}, 'Test spacing value if setting paced');

</script>
</body>