import React, { useEffect, useRef } from 'react';
import TestRenderer from 'react-test-renderer';
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
import '@testing-library/jest-dom';
import userEvent from '@testing-library/user-event';
import TextareaCodeEditor from '../';
it('Should output a TextareaCodeEditor', async () => {
const component = TestRenderer.create();
let tree = component.toJSON();
if (tree && !Array.isArray(tree)) {
expect(tree.type).toEqual('div');
expect(tree.props.disabled).toBeFalsy();
expect(tree.props.className).toEqual('w-tc-editor ');
expect(tree.props.style).toEqual({
position: 'relative',
textAlign: 'left',
boxSizing: 'border-box',
padding: 0,
overflow: 'hidden',
});
}
render(
,
);
const textbox = screen.getByTestId('textbox');
expect(textbox).toHaveStyle({
margin: '0px',
border: '0px',
background: 'none',
'box-sizing': 'inherit',
display: 'inherit',
'font-family': 'inherit',
// 'font-size': 'inherit',
'font-style': 'inherit',
'font-variant-ligatures': 'inherit',
'font-weight': 'inherit',
'letter-spacing': 'inherit',
'line-height': 'inherit',
'tab-size': 'inherit',
'text-indent': 'inherit',
'text-rendering': 'inherit',
'text-transform': 'inherit',
'white-space': 'pre-wrap',
'word-break': 'keep-all',
'overflow-wrap': 'break-word',
outline: 0,
position: 'absolute',
top: '0px',
left: '0px',
height: '100%',
width: '100%',
resize: 'none',
// color: 'inherit',
opacity: 0.8,
overflow: 'hidden',
// '-webkit-font-smoothing': 'antialiased',
// '-webkit-text-fill-color': 'transparent',
padding: '10px 10px 10px 10px',
// 'minHeight:': '16px',
// 'min-height:': '80px',
});
});
it('TextareaCodeEditor language="html"', async () => {
render(
,
);
const textbox = screen.getByRole('textbox');
expect(textbox.getAttribute('style')).toEqual(
'margin: 0px; border: 0px; background: none; box-sizing: inherit; display: inherit; font-family: inherit; font-style: inherit; font-variant-ligatures: inherit; font-weight: inherit; letter-spacing: inherit; line-height: inherit; tab-size: inherit; text-indent: inherit; text-rendering: inherit; text-transform: inherit; white-space: pre-wrap; word-break: keep-all; overflow-wrap: break-word; outline: 0; position: absolute; top: 0px; left: 0px; height: 100%; width: 100%; resize: none; opacity: 0.8; overflow: hidden; padding: 10px 10px 10px 10px; min-height: 16px;',
);
// eslint-disable-next-line testing-library/no-node-access
expect(textbox.nextElementSibling?.getAttribute('style')).toEqual(
'margin: 0px; border: 0px; background: none; box-sizing: inherit; display: inherit; font-family: inherit; font-style: inherit; font-variant-ligatures: inherit; font-weight: inherit; letter-spacing: inherit; line-height: inherit; tab-size: inherit; text-indent: inherit; text-rendering: inherit; text-transform: inherit; white-space: pre-wrap; word-break: keep-all; overflow-wrap: break-word; outline: 0; padding: 10px 10px 10px 10px; min-height: 16px;',
);
const component = TestRenderer.create(
{}} value="Hello World!
" />,
);
let tree = component.toJSON();
if (tree && !Array.isArray(tree)) {
expect(tree.type).toEqual('div');
expect(tree.props.disabled).toBeFalsy();
expect(tree.props.className).toEqual('w-tc-editor ');
expect(tree.props.style).toEqual({
position: 'relative',
textAlign: 'left',
boxSizing: 'border-box',
padding: 0,
overflow: 'hidden',
});
}
});
it('TextareaCodeEditor onChange 1', async () => {
const MyComponent = () => {
const txtRef = useRef(null);
const [code] = React.useState(`function add(a, b) {\n return a + b;\n}`);
useEffect(() => {
expect(txtRef.current?.getAttribute('autoCorrect')).toEqual('off');
});
return (
{
expect(evn.target.value).toEqual('a');
}}
/>
);
};
render();
});
it('TextareaCodeEditor onChange', async () => {
const onChange = jest.fn();
render(
,
);
const textarea = screen.getAllByTestId('textarea');
textarea[0].focus();
fireEvent.input(textarea[0], { target: { value: 'a' } });
expect(textarea[0]).toHaveValue(`a`);
});
// it('TextareaCodeEditor Tab Input', async () => {
// const onKeyDown = jest.fn();
// render(
// ,
// );
// const textarea = screen.getAllByTestId('textarea');
// userEvent.type(textarea[0], '{backspace}good')
// expect(textarea[0]).toHaveValue(`console.log('This is a good example')`);
// });
it('TextareaCodeEditor onKeyDown Tab Input', async () => {
const onKeyDown = jest.fn();
render(
,
);
const textarea = screen.getByPlaceholderText('Please enter JS code.');
// console.log(textarea.value);
// const signinModal = document.getElementsByTagName('textarea');
// console.log('firstChild', textarea)
fireEvent.input(textarea, { target: { value: 'This is a bad example' } });
expect(textarea).toHaveFocus();
expect(textarea).toHaveValue('This is a bad example');
const elmTextarea = screen.getByDisplayValue('This is a bad example');
(elmTextarea as HTMLTextAreaElement).setSelectionRange(1, 1);
elmTextarea.focus();
await waitFor(async () => {
await userEvent.keyboard('a');
expect(onKeyDown).toHaveBeenCalledTimes(1);
// expect(onKeyDown.mock.calls[0][0]).toHaveProperty('keyCode', 97);
await userEvent.keyboard('[Enter]');
expect(onKeyDown).toHaveBeenCalledTimes(2);
// expect(onKeyDown.mock.calls[1][0]).toHaveProperty('keyCode', 13);
});
elmTextarea.focus();
expect(elmTextarea).toHaveValue('Ta\nhis is a bad example');
elmTextarea.focus();
await (elmTextarea as HTMLTextAreaElement).setSelectionRange(1, 1);
fireEvent.keyDown(elmTextarea, {
key: 'Tab',
code: 'Tab',
charCode: 9,
});
// ⚠️ ============================================================
// await userEvent.keyboard('{Tab}{f}{o}{o}');
expect(elmTextarea).toHaveValue('T a\nhis is a bad example');
});
it('TextareaCodeEditor Tab2', async () => {
const example = `function add(a, b)`;
const expected = `function add(a, b)`;
render();
const textbox = screen.getByTestId('textbox');
expect(textbox).toHaveFocus();
textbox.setSelectionRange(8, 9);
fireEvent.keyDown(textbox, {
key: 'Tab',
code: 'Tab',
charCode: 9,
});
expect(textbox).toHaveValue(expected);
});
it('TextareaCodeEditor Tab', async () => {
const example = `function add(a, b) {\n return a + b;\n}`;
const expected = ` function add(a, b) {\n return a + b;\n}`;
render();
const textbox = screen.getByTestId('textbox');
expect(textbox).toHaveFocus();
textbox.setSelectionRange(5, 26);
fireEvent.keyDown(textbox, {
key: 'Tab',
code: 'Tab',
charCode: 9,
});
expect(textbox).toHaveValue(expected);
});
it('TextareaCodeEditor onKeyDown Tab One-Line input', async () => {
const example = `console.log('This is a bad example')\nconsole.log('This is a good example')`;
const expected = `console.log('This is a bad example')\n console.log('This is a good example')`;
render();
const textbox = screen.getByTestId('textarea');
textbox.setSelectionRange(37, 37);
textbox.focus();
fireEvent.keyDown(textbox, {
key: 'Tab',
code: 'Tab',
charCode: 9,
});
expect(textbox).toHaveValue(expected);
});
it('TextareaCodeEditor onKeyDown Tab Multi-Line Input', async () => {
const example = `\nfunction stopPropagation(e) {\n e.stopPropagation();\n e.preventDefault();\n}`;
const expected = `\nfunction stopPropagation(e) {\ne.stopPropagation();\ne.preventDefault();\n}`;
render();
const textbox = screen.getByTestId('textarea');
textbox.setSelectionRange(38, 67);
textbox.focus();
fireEvent.keyDown(textbox, {
key: 'Tab',
code: 'Tab',
charCode: 9,
shiftKey: true,
});
expect(textbox).toHaveValue(expected);
});
it('TextareaCodeEditor onKeyDown Tab Multi-Line 2 Input', async () => {
const example = `\nfunction stopPropagation(e) {\n e.stopPropagation();\n e.preventDefault();\n}`;
const expected = `\nfunction stopPropagation(e) {\ne.stopPropagation();\ne.preventDefault();\n}`;
render();
const textbox = screen.getByTestId('textarea');
textbox.setSelectionRange(6, 67);
textbox.focus();
fireEvent.keyDown(textbox, {
key: 'Tab',
code: 'Tab',
charCode: 9,
shiftKey: true,
});
expect(textbox).toHaveValue(expected);
});
it('TextareaCodeEditor onKeyDown Enter Input', async () => {
const example = `\nfunction stopPropagation(e) {\n e.stopPropagation();\n e.preventDefault();\n}`;
const expected = `\nfunction stopPropagation(e) {\n \n e.stopPropagation();\n e.preventDefault();\n}`;
render();
const textbox = screen.getByTestId('textarea');
textbox.setSelectionRange(32, 32);
textbox.focus();
fireEvent.keyDown(textbox, {
key: 'Enter',
code: 'Enter',
charCode: 13,
});
expect(textbox).toHaveValue(expected);
});
it('TextareaCodeEditor onKeyDown Input `()`', async () => {
const example = `/** Hello Wold **/`;
const expected = `/** (Hello) Wold **/`;
render();
const textbox = screen.getByTestId('textarea');
textbox.setSelectionRange(4, 9);
textbox.focus();
fireEvent.keyDown(textbox, {
key: '(',
code: 'Digit9',
charCode: 57,
shiftKey: true,
});
expect(textbox).toHaveValue(expected);
});
it('TextareaCodeEditor onKeyDown Input `<>`', async () => {
const example = `/** Hello World **/`;
const expected = `/** World **/`;
render();
const textbox = screen.getByTestId('textarea');
textbox.setSelectionRange(4, 9);
textbox.focus();
fireEvent.keyDown(textbox, {
key: '[',
code: 'Comma',
charCode: 188,
shiftKey: true,
});
expect(textbox).toHaveValue(expected);
});
it('TextareaCodeEditor onKeyDown Input `[]`', async () => {
const example = `/** Hello World **/`;
const expected = `/** [Hello] World **/`;
render();
const textbox = screen.getByTestId('textarea');
textbox.setSelectionRange(4, 9);
textbox.focus();
fireEvent.keyDown(textbox, {
key: '[',
code: 'BracketLeft',
charCode: 219,
});
expect(textbox).toHaveValue(expected);
});
it('TextareaCodeEditor onKeyDown Input `{}`', async () => {
const example = `/** Hello World **/`;
const expected = `/** {Hello} World **/`;
render();
const textbox = screen.getByTestId('textarea');
textbox.setSelectionRange(4, 9);
textbox.focus();
// userEvent.keyboard(`{Shift>}'{/Shift}`)
fireEvent.keyDown(textbox, {
key: '{',
code: 'BracketLeft',
charCode: 219,
shiftKey: true,
});
expect(textbox).toHaveValue(expected);
});
it("TextareaCodeEditor onKeyDown Input ~ `''`", async () => {
const example = `/** Hello World **/`;
const expected = `/** 'Hello' World **/`;
render();
const textbox = screen.getByTestId('textarea');
textbox.setSelectionRange(4, 9);
textbox.focus();
fireEvent.keyDown(textbox, {
key: '"',
code: 'Quote',
charCode: 222,
});
expect(textbox).toHaveValue(expected);
});
it('TextareaCodeEditor onKeyDown Input `""`', async () => {
const example = `/** Hello World **/`;
const expected = `/** "Hello" World **/`;
render();
const textbox = screen.getByTestId('textarea');
textbox.setSelectionRange(4, 9);
textbox.focus();
fireEvent.keyDown(textbox, {
key: '"',
code: 'Quote',
charCode: 222,
shiftKey: true,
});
expect(textbox).toHaveValue(expected);
});
it('TextareaCodeEditor onKeyDown Input ``', async () => {
const example = `/** Hello World **/`;
const expected = `/** \`Hello\` World **/`;
render();
const textbox = screen.getByTestId('textbox');
textbox.setSelectionRange(4, 9);
textbox.focus();
fireEvent.keyDown(textbox || document.body, {
key: '`',
code: 'Backquote',
charCode: 192,
});
expect(textbox).toHaveValue(expected);
});