// This class exists to not apply animations when in unit tests, since we can't really // wait for animation Promises to resovle. Instead, we use this custom TestAnimator // to show/hide elements and resolve Promises immediately. export var TestAnimator = {

// IMPORTANT: we have to use a manual Promise creation inside animation methods here
// because browsers don't yet support Animation.finished. See https://developer.mozilla.org/en-US/docs/Web/API/Animation/finished 

"show": function(elements, ms, { display_value="block" }={}) {
  return this._applyToCollection(elements, (el) => {
    el.style.display = "block";
    el.style.opacity = "1";
    return new Promise((resolve, reject) => {
      resolve("show behavior resolved");
    });
  });
},

"hide": function(elements, ms) {
  return this._applyToCollection(elements, (el) => {
    el.style.display = "none";
    el.style.opacity = "0";
    return new Promise((resolve, reject) => {
      resolve("hide behavior resolved");
    });
  });
},

"scrollDown": function(elements, ms, { display_value="block" }={}) {
  return this._applyToCollection(elements, (el) => {
    el.style.display = "block";
    el.style.opacity = "1";
    return new Promise((resolve, reject) => {
      resolve("scrollDown behavior resolved");
    });
  });
},

"scrollUp": function(elements, ms) {
  return this._applyToCollection(elements, (el) => {
    el.style.display = "none";
    el.style.opacity = "0";
    return new Promise((resolve, reject) => {
      resolve("scrollUp behavior resolved");
    });
  });
},

"_applyToCollection": function(elements, func) {
  if(!(elements instanceof Array))
    elements = [elements];

  elements = elements.map((el) => {
    if(/Component$/.test(el.constructor.name))
      return el.dom_element;
    else
      return el;
  });

  return Promise.all(elements.map((el) => {
    return func(el);
  }));

}

}