let NewD3 = function () {
  function returnThis() {
    return this;
  }
  return {
    append: function () {
      return NewD3();
    },
    lower: returnThis,
    attr: returnThis,
    style: returnThis,
    text: returnThis,
    0: {
      0: {
        getBBox: function () {
          return {
            height: 10,
            width: 20,
          };
        },
      },
    },
  };
};

export const select = function () {
  return new NewD3();
};

export const selectAll = function () {
  return new NewD3();
};

export const curveBasis = 'basis';
export const curveLinear = 'linear';
export const curveCardinal = 'cardinal';

export const MockD3 = (name, parent) => {
  const children = [];
  const elem = {
    get __children() {
      return children;
    },
    get __name() {
      return name;
    },
    get __parent() {
      return parent;
    },
  };
  elem.append = (name) => {
    const mockElem = MockD3(name, elem);
    children.push(mockElem);
    return mockElem;
  };
  elem.lower = jest.fn(() => elem);
  elem.attr = jest.fn(() => elem);
  elem.text = jest.fn(() => elem);
  elem.style = jest.fn(() => elem);
  return elem;
};
