import {initTextareaMarkdown} from './EditorMarkdown.ts';

test('EditorMarkdown', () => {
  const textarea = document.createElement('textarea');
  initTextareaMarkdown(textarea);

  type ValueWithCursor = string | {
    value: string;
    pos: number;
  }
  const testInput = (input: ValueWithCursor, result: ValueWithCursor) => {
    const intputValue = typeof input === 'string' ? input : input.value;
    const inputPos = typeof input === 'string' ? intputValue.length : input.pos;
    textarea.value = intputValue;
    textarea.setSelectionRange(inputPos, inputPos);

    const e = new KeyboardEvent('keydown', {key: 'Enter', cancelable: true});
    textarea.dispatchEvent(e);
    if (!e.defaultPrevented) textarea.value += '\n'; // simulate default behavior

    const expectedValue = typeof result === 'string' ? result : result.value;
    const expectedPos = typeof result === 'string' ? expectedValue.length : result.pos;
    expect(textarea.value).toEqual(expectedValue);
    expect(textarea.selectionStart).toEqual(expectedPos);
  };

  testInput('-', '-\n');
  testInput('1.', '1.\n');

  testInput('- ', '');
  testInput('1. ', '');
  testInput({value: '1. \n2. ', pos: 3}, {value: '\n2. ', pos: 0});

  testInput('- x', '- x\n- ');
  testInput('1. foo', '1. foo\n1. ');
  testInput({value: '1. a\n2. b\n3. c', pos: 4}, {value: '1. a\n1. \n2. b\n3. c', pos: 8});
  testInput('- [ ]', '- [ ]\n- ');
  testInput('- [ ] foo', '- [ ] foo\n- [ ] ');
  testInput('* [x] foo', '* [x] foo\n* [ ] ');
  testInput('1. [x] foo', '1. [x] foo\n1. [ ] ');
});