import './index';
import { assert } from 'chai';
import { $$ } from 'common-sk/modules/dom';
import { hexToSlot, slotToHex, UniformColorSk } from './uniform-color-sk';
import { setUpElementUnderTest } from '../test_util';

describe('uniform-color-sk', () => {
  const newInstance = setUpElementUnderTest<UniformColorSk>('uniform-color-sk');

  let element: UniformColorSk;
  beforeEach(() => {
    element = newInstance();
  });

  describe('slotToHex', () => {
    it('prepends a zero to make a two digit hex value', () => {
      assert.equal(slotToHex([4 / 255], 0), '04');
      assert.equal(slotToHex([10 / 255], 0), '0a');
    });
  });

  describe('hexToSlot', () => {
    it('converts the two digit hex into a float and stores it in the right slot.', () => {
      const uniforms = [0, 0, 0];
      hexToSlot('05', uniforms, 1);
      assert.deepEqual(uniforms, [0, 0.0196, 0]);
    });
  });

  describe('hexToSlot and slotToHex', () => {
    it('roundtrip correctly from number to hex and back to number', () => {
      const uniforms = [0, 0, 0];
      for (let i = 0; i < 255; i++) {
        // Convert a known hex and place it in slot 1.
        hexToSlot(i.toString(16), uniforms, 1);

        // Now roundtrip that value out and back into slot 2.
        const hex = slotToHex(uniforms, 1);
        hexToSlot(hex, uniforms, 2);

        assert.equal(uniforms[1], uniforms[2]);
      }
    });
  });

  describe('uniform-color-sk', () => {
    it('puts values in correct spot in uniforms array', () => {
      // Make uniforms longer than needed to show we don't disturb other values.
      const uniforms = [0, 0, 0, 0, 0];

      element.uniform = {
        name: 'color',
        columns: 3,
        rows: 1,
        slot: 1,
      };

      $$<HTMLInputElement>('input', element)!.value = '#8090a0';
      element.applyUniformValues(uniforms);
      assert.deepEqual(
        uniforms,
        [0, 0.5019, 0.5647, 0.6274, 0],
      );
    });

    it('puts values in correct spot in uniforms array with an alpha', () => {
      // Make uniforms longer than needed to show we don't disturb other values.
      const uniforms: number[] = [0, 0, 0, 0, 0, 0];

      element.uniform = {
        name: 'color',
        columns: 4, // float4 implies an alpha channel.
        rows: 1,
        slot: 1,
      };

      $$<HTMLInputElement>('input', element)!.value = '#8090a0';
      element.applyUniformValues(uniforms);
      assert.deepEqual(
        uniforms,
        [0, 0.5019, 0.5647, 0.6274, 0.5, 0],
      );
    });

    it('restores values in correct spot in uniforms array with an alpha', () => {
      // Make uniforms longer than needed to show we don't disturb other values.
      let uniforms: number[] = [0, 128 / 255, 144 / 255, 160 / 255, 0.5, 0];

      element.uniform = {
        name: 'color',
        columns: 4, // float4 implies an alpha channel.
        rows: 1,
        slot: 1,
      };

      $$<HTMLInputElement>('input', element)!.value = '#8090a0';
      element.restoreUniformValues(uniforms);

      // Clear uniforms.
      uniforms = [0, 0, 0, 0, 0, 0];
      element.applyUniformValues(uniforms);
      assert.deepEqual(
        uniforms,
        [0, 0.5019, 0.5647, 0.6274, 0.5, 0],
      );
    });

    it('throws on invalid uniforms', () => {
      // Uniform is too small to be a color.
      assert.throws(() => {
        element.uniform = {
          name: 'color',
          columns: 1,
          rows: 1,
          slot: 1,
        };
      });
    });

    it('does not need raf updates', () => {
      assert.isFalse(element.needsRAF());
    });
  });
});
