-
Notifications
You must be signed in to change notification settings - Fork 99
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test(Pagination): add smoke visual tests (#1785)
- Loading branch information
1 parent
24bbb05
commit 092b880
Showing
88 changed files
with
223 additions
and
2 deletions.
There are no files selected for viewing
Binary file added
BIN
+10.8 KB
...ation-not-compact-smoke-default-click-on-page-10-button-dark-chromium-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+8.85 KB
...ination-not-compact-smoke-default-click-on-page-10-button-dark-webkit-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+10.2 KB
...tion-not-compact-smoke-default-click-on-page-10-button-light-chromium-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+8.49 KB
...nation-not-compact-smoke-default-click-on-page-10-button-light-webkit-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+10.1 KB
...nation-not-compact-smoke-default-click-on-page-2-button-dark-chromium-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+8 KB
...gination-not-compact-smoke-default-click-on-page-2-button-dark-webkit-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+9.5 KB
...ation-not-compact-smoke-default-click-on-page-2-button-light-chromium-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+7.66 KB
...ination-not-compact-smoke-default-click-on-page-2-button-light-webkit-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+9.92 KB
...test.tsx-snapshots/Pagination-not-compact-smoke-default-dark-chromium-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+8.37 KB
...l.test.tsx-snapshots/Pagination-not-compact-smoke-default-dark-webkit-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+10.6 KB
...ation-not-compact-smoke-default-hover-on-page-10-button-dark-chromium-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+8.44 KB
...ination-not-compact-smoke-default-hover-on-page-10-button-dark-webkit-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+9.86 KB
...tion-not-compact-smoke-default-hover-on-page-10-button-light-chromium-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+8.05 KB
...nation-not-compact-smoke-default-hover-on-page-10-button-light-webkit-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+10.3 KB
...nation-not-compact-smoke-default-hover-on-page-2-button-dark-chromium-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+8.71 KB
...gination-not-compact-smoke-default-hover-on-page-2-button-dark-webkit-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+9.72 KB
...ation-not-compact-smoke-default-hover-on-page-2-button-light-chromium-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+8.38 KB
...ination-not-compact-smoke-default-hover-on-page-2-button-light-webkit-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+9.44 KB
...est.tsx-snapshots/Pagination-not-compact-smoke-default-light-chromium-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+8.1 KB
....test.tsx-snapshots/Pagination-not-compact-smoke-default-light-webkit-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+5.76 KB
...agination-regular-smoke-default-click-on-page-10-button-dark-chromium-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+5.1 KB
.../Pagination-regular-smoke-default-click-on-page-10-button-dark-webkit-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+5.46 KB
...gination-regular-smoke-default-click-on-page-10-button-light-chromium-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+4.9 KB
...Pagination-regular-smoke-default-click-on-page-10-button-light-webkit-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+5.08 KB
...Pagination-regular-smoke-default-click-on-page-2-button-dark-chromium-linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+4.41 KB
...s/Pagination-regular-smoke-default-click-on-page-2-button-dark-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+4.75 KB
...agination-regular-smoke-default-click-on-page-2-button-light-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+4.22 KB
.../Pagination-regular-smoke-default-click-on-page-2-button-light-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+5.34 KB
...ual.test.tsx-snapshots/Pagination-regular-smoke-default-dark-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+4.78 KB
...isual.test.tsx-snapshots/Pagination-regular-smoke-default-dark-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+5.52 KB
...agination-regular-smoke-default-hover-on-page-10-button-dark-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+4.84 KB
.../Pagination-regular-smoke-default-hover-on-page-10-button-dark-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+5.13 KB
...gination-regular-smoke-default-hover-on-page-10-button-light-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+4.59 KB
...Pagination-regular-smoke-default-hover-on-page-10-button-light-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+5.69 KB
...Pagination-regular-smoke-default-hover-on-page-2-button-dark-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+5.09 KB
...s/Pagination-regular-smoke-default-hover-on-page-2-button-dark-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+5.26 KB
...agination-regular-smoke-default-hover-on-page-2-button-light-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+4.83 KB
.../Pagination-regular-smoke-default-hover-on-page-2-button-light-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+5.02 KB
...al.test.tsx-snapshots/Pagination-regular-smoke-default-light-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+4.56 KB
...sual.test.tsx-snapshots/Pagination-regular-smoke-default-light-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+8.68 KB
...gination-with-page-input-smoke-default-after-type-enter-dark-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+7.67 KB
...Pagination-with-page-input-smoke-default-after-type-enter-dark-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+8.23 KB
...ination-with-page-input-smoke-default-after-type-enter-light-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+7.37 KB
...agination-with-page-input-smoke-default-after-type-enter-light-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+6.52 KB
...on-with-page-input-smoke-default-after-type-page-number-dark-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+5.82 KB
...tion-with-page-input-smoke-default-after-type-page-number-dark-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+6.15 KB
...n-with-page-input-smoke-default-after-type-page-number-light-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+5.59 KB
...ion-with-page-input-smoke-default-after-type-page-number-light-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+7.68 KB
....tsx-snapshots/Pagination-with-page-input-smoke-default-dark-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+6.83 KB
...st.tsx-snapshots/Pagination-with-page-input-smoke-default-dark-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+8.28 KB
...Pagination-with-page-input-smoke-default-focus-on-input-dark-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+7.33 KB
...s/Pagination-with-page-input-smoke-default-focus-on-input-dark-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+7.78 KB
...agination-with-page-input-smoke-default-focus-on-input-light-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+7.05 KB
.../Pagination-with-page-input-smoke-default-focus-on-input-light-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+7.28 KB
...tsx-snapshots/Pagination-with-page-input-smoke-default-light-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+6.6 KB
...t.tsx-snapshots/Pagination-with-page-input-smoke-default-light-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+20.4 KB
...ze-select-smoke-default-after-click-on-page-size-select-dark-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+17.4 KB
...size-select-smoke-default-after-click-on-page-size-select-dark-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+21.1 KB
...e-select-smoke-default-after-click-on-page-size-select-light-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+18.1 KB
...ize-select-smoke-default-after-click-on-page-size-select-light-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+20 KB
...-with-page-size-select-smoke-default-after-hover-option-dark-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+16.9 KB
...on-with-page-size-select-smoke-default-after-hover-option-dark-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+20.7 KB
...with-page-size-select-smoke-default-after-hover-option-light-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+17.6 KB
...n-with-page-size-select-smoke-default-after-hover-option-light-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+13.7 KB
...with-page-size-select-smoke-default-after-select-option-dark-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+11.9 KB
...n-with-page-size-select-smoke-default-after-select-option-dark-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+13.3 KB
...ith-page-size-select-smoke-default-after-select-option-light-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+11.7 KB
...-with-page-size-select-smoke-default-after-select-option-light-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+13.1 KB
...napshots/Pagination-with-page-size-select-smoke-default-dark-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+11 KB
...-snapshots/Pagination-with-page-size-select-smoke-default-dark-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+12.7 KB
...apshots/Pagination-with-page-size-select-smoke-default-light-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+10.8 KB
...snapshots/Pagination-with-page-size-select-smoke-default-light-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+2.99 KB
...n-without-pages-smoke-default-click-on-next-page-button-dark-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+2.67 KB
...ion-without-pages-smoke-default-click-on-next-page-button-dark-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+2.62 KB
...-without-pages-smoke-default-click-on-next-page-button-light-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+2.37 KB
...on-without-pages-smoke-default-click-on-next-page-button-light-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+2.54 KB
...st.tsx-snapshots/Pagination-without-pages-smoke-default-dark-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+2.4 KB
...test.tsx-snapshots/Pagination-without-pages-smoke-default-dark-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+2.48 KB
...n-without-pages-smoke-default-hover-on-next-page-button-dark-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+2.42 KB
...ion-without-pages-smoke-default-hover-on-next-page-button-dark-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+2.31 KB
...-without-pages-smoke-default-hover-on-next-page-button-light-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+2.14 KB
...on-without-pages-smoke-default-hover-on-next-page-button-light-webkit-linux.png
Oops, something went wrong.
Binary file added
BIN
+2.23 KB
...t.tsx-snapshots/Pagination-without-pages-smoke-default-light-chromium-linux.png
Oops, something went wrong.
Binary file added
BIN
+2.08 KB
...est.tsx-snapshots/Pagination-without-pages-smoke-default-light-webkit-linux.png
Oops, something went wrong.
186 changes: 186 additions & 0 deletions
186
src/components/Pagination/__tests__/Pagination.visual.test.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,186 @@ | ||
import React from 'react'; | ||
|
||
import {test} from '~playwright/core'; | ||
|
||
import {createSmokeScenarios} from '../../../stories/tests-factory/create-smoke-scenarios'; | ||
import {PaginationQa, getPaginationPageQa, getPaginationPageSizeOptionQa} from '../constants'; | ||
import type {PaginationProps} from '../types'; | ||
|
||
import {PaginationStateWrap} from './helpers'; | ||
|
||
test.describe('Pagination', {tag: '@Pagination'}, () => { | ||
const defaultProps: Omit<PaginationProps, 'onUpdate'> = { | ||
page: 1, | ||
pageSize: 100, | ||
total: 950, | ||
}; | ||
|
||
createSmokeScenarios(defaultProps, {}).forEach(([title, details, props]) => { | ||
test(`regular ${title}`, details, async ({mount, expectScreenshot}) => { | ||
const root = await mount(<PaginationStateWrap {...props} />); | ||
|
||
await expectScreenshot({}); | ||
|
||
await root.locator(`button[data-qa="${getPaginationPageQa(2)}"]`).hover(); | ||
|
||
await expectScreenshot({ | ||
nameSuffix: 'hover on page 2 button', | ||
}); | ||
|
||
await root.locator(`button[data-qa="${getPaginationPageQa(2)}"]`).click(); | ||
|
||
await expectScreenshot({ | ||
nameSuffix: 'click on page 2 button', | ||
}); | ||
|
||
await root.locator(`button[data-qa="${getPaginationPageQa(10)}"]`).hover(); | ||
|
||
await expectScreenshot({ | ||
nameSuffix: 'hover on page 10 button', | ||
}); | ||
|
||
await root.locator(`button[data-qa="${getPaginationPageQa(10)}"]`).click(); | ||
|
||
await expectScreenshot({ | ||
nameSuffix: 'click on page 10 button', | ||
}); | ||
}); | ||
}); | ||
|
||
createSmokeScenarios( | ||
{ | ||
...defaultProps, | ||
compact: false, | ||
}, | ||
{}, | ||
).forEach(([title, details, props]) => { | ||
test(`not compact ${title}`, details, async ({mount, expectScreenshot}) => { | ||
const root = await mount(<PaginationStateWrap {...props} />); | ||
|
||
await expectScreenshot({}); | ||
|
||
await root.locator(`button[data-qa="${getPaginationPageQa(2)}"]`).hover(); | ||
|
||
await expectScreenshot({ | ||
nameSuffix: 'hover on page 2 button', | ||
}); | ||
|
||
await root.locator(`button[data-qa="${getPaginationPageQa(2)}"]`).click(); | ||
|
||
await expectScreenshot({ | ||
nameSuffix: 'click on page 2 button', | ||
}); | ||
|
||
await root.locator(`button[data-qa="${getPaginationPageQa(10)}"]`).hover(); | ||
|
||
await expectScreenshot({ | ||
nameSuffix: 'hover on page 10 button', | ||
}); | ||
|
||
await root.locator(`button[data-qa="${getPaginationPageQa(10)}"]`).click(); | ||
|
||
await expectScreenshot({ | ||
nameSuffix: 'click on page 10 button', | ||
}); | ||
}); | ||
}); | ||
|
||
createSmokeScenarios( | ||
{ | ||
...defaultProps, | ||
showPages: false, | ||
}, | ||
{}, | ||
).forEach(([title, details, props]) => { | ||
test(`without pages ${title}`, details, async ({mount, expectScreenshot}) => { | ||
const root = await mount(<PaginationStateWrap {...props} />); | ||
|
||
await expectScreenshot({}); | ||
|
||
await root.locator(`button[data-qa="${PaginationQa.PaginationButtonNext}"]`).hover(); | ||
|
||
await expectScreenshot({ | ||
nameSuffix: 'hover on next page button', | ||
}); | ||
|
||
await root.locator(`button[data-qa="${PaginationQa.PaginationButtonNext}"]`).click(); | ||
|
||
await expectScreenshot({ | ||
nameSuffix: 'click on next page button', | ||
}); | ||
}); | ||
}); | ||
|
||
createSmokeScenarios( | ||
{ | ||
...defaultProps, | ||
showInput: true, | ||
}, | ||
{}, | ||
).forEach(([title, details, props]) => { | ||
test(`with page input ${title}`, details, async ({mount, page, expectScreenshot}) => { | ||
const root = await mount(<PaginationStateWrap {...props} />); | ||
|
||
await expectScreenshot({}); | ||
|
||
await root | ||
.locator(`span[data-qa="${PaginationQa.PaginationInput}"]`) | ||
.locator(`input`) | ||
.focus(); | ||
|
||
await expectScreenshot({ | ||
nameSuffix: 'focus on input', | ||
}); | ||
|
||
await page.keyboard.type('10'); | ||
|
||
await expectScreenshot({ | ||
nameSuffix: 'after type page number', | ||
}); | ||
|
||
await page.keyboard.press('Enter'); | ||
|
||
await expectScreenshot({ | ||
nameSuffix: 'after type enter', | ||
}); | ||
}); | ||
}); | ||
|
||
createSmokeScenarios( | ||
{ | ||
...defaultProps, | ||
pageSizeOptions: [20, 50, 100], | ||
}, | ||
{}, | ||
).forEach(([title, details, props]) => { | ||
test(`with page size select ${title}`, details, async ({mount, page, expectScreenshot}) => { | ||
await page.setViewportSize({width: 500, height: 500}); | ||
|
||
const root = await mount( | ||
<div style={{width: '500px', height: '500px'}}> | ||
<PaginationStateWrap {...props} /> | ||
</div>, | ||
); | ||
|
||
await expectScreenshot({}); | ||
|
||
await root.locator(`button[data-qa="${PaginationQa.PaginationPageSizer}"]`).click(); | ||
|
||
await expectScreenshot({ | ||
nameSuffix: 'after click on page size select', | ||
}); | ||
|
||
await page.locator(`[data-qa="${getPaginationPageSizeOptionQa(50)}"]`).hover(); | ||
|
||
await expectScreenshot({ | ||
nameSuffix: 'after hover option', | ||
}); | ||
|
||
await page.locator(`[data-qa="${getPaginationPageSizeOptionQa(50)}"]`).click(); | ||
|
||
await expectScreenshot({ | ||
nameSuffix: 'after select option', | ||
}); | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
import React from 'react'; | ||
|
||
import {Pagination} from '../Pagination'; | ||
import type {PaginationProps} from '../types'; | ||
|
||
type PageOptions = { | ||
page: PaginationProps['page']; | ||
pageSize: PaginationProps['pageSize']; | ||
}; | ||
|
||
const usePaginationState = (initPageOptions: PageOptions) => { | ||
const [pageOptions, setPageOptions] = React.useState<PageOptions>(initPageOptions); | ||
|
||
const onUpdate: PaginationProps['onUpdate'] = (page, pageSize) => { | ||
setPageOptions({ | ||
page, | ||
pageSize, | ||
}); | ||
}; | ||
|
||
return {...pageOptions, onUpdate}; | ||
}; | ||
|
||
export const PaginationStateWrap = (props: Omit<PaginationProps, 'onUpdate'>) => { | ||
const {page, pageSize, onUpdate} = usePaginationState({ | ||
page: props.page, | ||
pageSize: props.pageSize, | ||
}); | ||
|
||
return <Pagination {...props} page={page} pageSize={pageSize} onUpdate={onUpdate} />; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters