From 42a7f0b163f8919ea8ba167bbf2b02e4ec506569 Mon Sep 17 00:00:00 2001 From: Sokolovskii Ivan Date: Fri, 28 Nov 2025 22:53:07 +0300 Subject: [PATCH 01/42] =?UTF-8?q?feat(reassure):=20=D1=83=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=20reassure=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2?= =?UTF-8?q?=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + .npmignore | 5 +- dangerfile.js | 6 ++ package.json | 3 + reassure-tests.sh | 19 +++++ yarn.lock | 206 +++++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 238 insertions(+), 3 deletions(-) create mode 100644 dangerfile.js create mode 100755 reassure-tests.sh diff --git a/.gitignore b/.gitignore index 7c51f9a..b5454a6 100644 --- a/.gitignore +++ b/.gitignore @@ -55,3 +55,5 @@ web-build/ # direnv .envrc +# Reassure output directory +.reassure diff --git a/.npmignore b/.npmignore index 3d7286e..980a309 100644 --- a/.npmignore +++ b/.npmignore @@ -49,4 +49,7 @@ expo .prettierignore .vscode xcode-installation.png -configs \ No newline at end of file +configs +dangerfile.js +.reassure +reassure-tests.sh diff --git a/dangerfile.js b/dangerfile.js new file mode 100644 index 0000000..029c306 --- /dev/null +++ b/dangerfile.js @@ -0,0 +1,6 @@ +// eslint-disable-next-line import-x/no-nodejs-modules +import path from 'path' + +import { dangerReassure } from 'reassure' + +dangerReassure({ inputFilePath: path.join(__dirname, './.reassure/output.md') }) diff --git a/package.json b/package.json index f4dbd47..4a87c01 100644 --- a/package.json +++ b/package.json @@ -162,5 +162,8 @@ "listUnknownPackages": false } } + }, + "dependencies": { + "reassure": "1.4.0" } } diff --git a/reassure-tests.sh b/reassure-tests.sh new file mode 100755 index 0000000..74290fd --- /dev/null +++ b/reassure-tests.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -e + +BASELINE_BRANCH=${GITHUB_BASE_REF:="main"} + +# Required for `git switch` on CI +git fetch origin + +# Gather baseline perf measurements +git switch "$BASELINE_BRANCH" + +yarn install +yarn reassure --baseline + +# Gather current perf measurements & compare results +git switch --detach - + +yarn install +yarn reassure --branch diff --git a/yarn.lock b/yarn.lock index eff4f9a..b874617 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2509,6 +2509,13 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.25.7": + version: 7.28.4 + resolution: "@babel/runtime@npm:7.28.4" + checksum: 10/6c9a70452322ea80b3c9b2a412bcf60771819213a67576c8cec41e88a95bb7bf01fc983754cda35dc19603eef52df22203ccbf7777b9d6316932f9fb77c25163 + languageName: node + linkType: hard + "@babel/template@npm:^7.25.0, @babel/template@npm:^7.25.9": version: 7.25.9 resolution: "@babel/template@npm:7.25.9" @@ -2696,6 +2703,62 @@ __metadata: languageName: node linkType: hard +"@callstack/reassure-cli@npm:1.4.0": + version: 1.4.0 + resolution: "@callstack/reassure-cli@npm:1.4.0" + dependencies: + "@callstack/reassure-compare": "npm:1.4.0" + "@callstack/reassure-logger": "npm:1.4.0" + chalk: "npm:4.1.2" + simple-git: "npm:^3.27.0" + yargs: "npm:^17.7.2" + bin: + reassure: lib/commonjs/bin.js + checksum: 10/63162c8fc6e424240ef8a1bbeed3e8d0c21ee020e9de420c38203ef8a33a16202f38148be1a732ab7818f2fd4ae9f58121a35b707554bb3c257ce55069c0665a + languageName: node + linkType: hard + +"@callstack/reassure-compare@npm:1.4.0": + version: 1.4.0 + resolution: "@callstack/reassure-compare@npm:1.4.0" + dependencies: + "@callstack/reassure-logger": "npm:1.4.0" + ts-markdown-builder: "npm:0.4.1" + ts-regex-builder: "npm:^1.8.2" + zod: "npm:^3.24.2" + checksum: 10/ae71d84a5bd07410acc725d32b31af123adfe2f3327ff827bfea1bce6a55ca04ab2123929e332a334575ff9d7bda967970d12ee7dc27c1ff047d88b9b49d922b + languageName: node + linkType: hard + +"@callstack/reassure-danger@npm:1.4.0": + version: 1.4.0 + resolution: "@callstack/reassure-danger@npm:1.4.0" + checksum: 10/b0f72c407bfc7c7be353573261442915a82e80765b8c632a5fb0f6c5cd6a85824f5c5a4823cdd62675667eaaa22718dcf8da2be9f302bfdb68ad262a0dcd3e61 + languageName: node + linkType: hard + +"@callstack/reassure-logger@npm:1.4.0": + version: 1.4.0 + resolution: "@callstack/reassure-logger@npm:1.4.0" + dependencies: + chalk: "npm:4.1.2" + checksum: 10/a65c569a615df2ba489ee36c09ff2065f56686c54e825f7664c59e30e5c31e46d36e105bf851dfcbfc6505f88115d185277a57caf46eb6700afecb7040525e6f + languageName: node + linkType: hard + +"@callstack/reassure-measure@npm:1.4.0": + version: 1.4.0 + resolution: "@callstack/reassure-measure@npm:1.4.0" + dependencies: + "@callstack/reassure-logger": "npm:1.4.0" + mathjs: "npm:^13.2.3" + pretty-format: "npm:^29.7.0" + peerDependencies: + react: ">=18.0.0" + checksum: 10/6dcaca3a9c3a81c66fbc16e2cc3410cf75b1a347163fe2e0cb4f6bc0e18ba9a93ce1eafd97534d335685651e3d99589d7d1529187c87eb31471f05e5070dd055 + languageName: node + linkType: hard + "@cdek-it/react-native-ui-kit@workspace:.": version: 0.0.0-use.local resolution: "@cdek-it/react-native-ui-kit@workspace:." @@ -2768,6 +2831,7 @@ __metadata: react-native-reanimated: "npm:3.19.1" react-native-safe-area-context: "npm:5.6.1" react-native-svg: "npm:15.12.1" + reassure: "npm:1.4.0" release-it: "npm:19.0.6" standard-version: "npm:9.5.0" storybook: "npm:8.3.5" @@ -4690,6 +4754,22 @@ __metadata: languageName: node linkType: hard +"@kwsites/file-exists@npm:^1.1.1": + version: 1.1.1 + resolution: "@kwsites/file-exists@npm:1.1.1" + dependencies: + debug: "npm:^4.1.1" + checksum: 10/4ff945de7293285133aeae759caddc71e73c4a44a12fac710fdd4f574cce2671a3f89d8165fdb03d383cfc97f3f96f677d8de3c95133da3d0e12a123a23109fe + languageName: node + linkType: hard + +"@kwsites/promise-deferred@npm:^1.1.1": + version: 1.1.1 + resolution: "@kwsites/promise-deferred@npm:1.1.1" + checksum: 10/07455477a0123d9a38afb503739eeff2c5424afa8d3dbdcc7f9502f13604488a4b1d9742fc7288832a52a6422cf1e1c0a1d51f69a39052f14d27c9a0420b6629 + languageName: node + linkType: hard + "@napi-rs/wasm-runtime@npm:^0.2.11": version: 0.2.12 resolution: "@napi-rs/wasm-runtime@npm:0.2.12" @@ -8282,6 +8362,13 @@ __metadata: languageName: node linkType: hard +"complex.js@npm:^2.2.5": + version: 2.4.3 + resolution: "complex.js@npm:2.4.3" + checksum: 10/904a2b4a09a4cfd94d8636ceb95e15cc077dcdedd07c54e233308210fb38897338dde4e7113811e89c1cfe4c6e3ebcf11735ad5c901e27c6d7e3c132a3078e3c + languageName: node + linkType: hard + "compressible@npm:~2.0.18": version: 2.0.18 resolution: "compressible@npm:2.0.18" @@ -9201,6 +9288,13 @@ __metadata: languageName: node linkType: hard +"decimal.js@npm:^10.4.3": + version: 10.6.0 + resolution: "decimal.js@npm:10.6.0" + checksum: 10/c0d45842d47c311d11b38ce7ccc911121953d4df3ebb1465d92b31970eb4f6738a065426a06094af59bee4b0d64e42e7c8984abd57b6767c64ea90cf90bb4a69 + languageName: node + linkType: hard + "dedent@npm:0.7.0": version: 0.7.0 resolution: "dedent@npm:0.7.0" @@ -10109,6 +10203,13 @@ __metadata: languageName: node linkType: hard +"escape-latex@npm:^1.2.0": + version: 1.2.0 + resolution: "escape-latex@npm:1.2.0" + checksum: 10/73a787319f0965ecb8244bb38bf3a3cba872f0b9a5d3da8821140e9f39fe977045dc953a62b1a2bed4d12bfccbe75a7d8ec786412bf00739eaa2f627d0a8e0d6 + languageName: node + linkType: hard + "escape-string-regexp@npm:^1.0.5": version: 1.0.5 resolution: "escape-string-regexp@npm:1.0.5" @@ -11154,6 +11255,13 @@ __metadata: languageName: node linkType: hard +"fraction.js@npm:^4.3.7": + version: 4.3.7 + resolution: "fraction.js@npm:4.3.7" + checksum: 10/bb5ebcdeeffcdc37b68ead3bdfc244e68de188e0c64e9702197333c72963b95cc798883ad16adc21588088b942bca5b6a6ff4aeb1362d19f6f3b629035dc15f5 + languageName: node + linkType: hard + "freeport-async@npm:^2.0.0": version: 2.0.0 resolution: "freeport-async@npm:2.0.0" @@ -12049,7 +12157,7 @@ __metadata: languageName: node linkType: hard -"import-local@npm:^3.0.2": +"import-local@npm:^3.0.2, import-local@npm:^3.2.0": version: 3.2.0 resolution: "import-local@npm:3.2.0" dependencies: @@ -12958,6 +13066,13 @@ __metadata: languageName: node linkType: hard +"javascript-natural-sort@npm:^0.7.1": + version: 0.7.1 + resolution: "javascript-natural-sort@npm:0.7.1" + checksum: 10/7bf6eab67871865d347f09a95aa770f9206c1ab0226bcda6fdd9edec340bf41111a7f82abac30556aa16a21cfa3b2b1ca4a362c8b73dd5ce15220e5d31f49d79 + languageName: node + linkType: hard + "jest-changed-files@npm:^29.7.0": version: 29.7.0 resolution: "jest-changed-files@npm:29.7.0" @@ -14478,6 +14593,25 @@ __metadata: languageName: node linkType: hard +"mathjs@npm:^13.2.3": + version: 13.2.3 + resolution: "mathjs@npm:13.2.3" + dependencies: + "@babel/runtime": "npm:^7.25.7" + complex.js: "npm:^2.2.5" + decimal.js: "npm:^10.4.3" + escape-latex: "npm:^1.2.0" + fraction.js: "npm:^4.3.7" + javascript-natural-sort: "npm:^0.7.1" + seedrandom: "npm:^3.0.5" + tiny-emitter: "npm:^2.1.0" + typed-function: "npm:^4.2.1" + bin: + mathjs: bin/cli.js + checksum: 10/6906693a97c19f820e280cd7236f0fb07264a855a882fe2c69856508e866fe0c0b1d7054f49fa283bbd20ae8e8355b028bc4f3159e5d543e53a45edef41590e0 + languageName: node + linkType: hard + "mdn-data@npm:2.0.14": version: 2.0.14 resolution: "mdn-data@npm:2.0.14" @@ -16905,6 +17039,21 @@ __metadata: languageName: node linkType: hard +"reassure@npm:1.4.0": + version: 1.4.0 + resolution: "reassure@npm:1.4.0" + dependencies: + "@callstack/reassure-cli": "npm:1.4.0" + "@callstack/reassure-compare": "npm:1.4.0" + "@callstack/reassure-danger": "npm:1.4.0" + "@callstack/reassure-measure": "npm:1.4.0" + import-local: "npm:^3.2.0" + bin: + reassure: lib/commonjs/bin/reassure.js + checksum: 10/267837079c5efa65107e71e9d79eb44d1fad2d05985ae18a36e3a52b54ac0d905266b397ed6685e895ec13a5c8324c249be1d62f0c61cd40b13f15d1d872cc82 + languageName: node + linkType: hard + "recast@npm:^0.23.5": version: 0.23.9 resolution: "recast@npm:0.23.9" @@ -17542,6 +17691,13 @@ __metadata: languageName: node linkType: hard +"seedrandom@npm:^3.0.5": + version: 3.0.5 + resolution: "seedrandom@npm:3.0.5" + checksum: 10/acad5e516c04289f61c2fb9848f449b95f58362b75406b79ec51e101ec885293fc57e3675d2f39f49716336559d7190f7273415d185fead8cd27b171ebf7d8fb + languageName: node + linkType: hard + "semver@npm:2 || 3 || 4 || 5": version: 5.7.2 resolution: "semver@npm:5.7.2" @@ -17821,6 +17977,17 @@ __metadata: languageName: node linkType: hard +"simple-git@npm:^3.27.0": + version: 3.30.0 + resolution: "simple-git@npm:3.30.0" + dependencies: + "@kwsites/file-exists": "npm:^1.1.1" + "@kwsites/promise-deferred": "npm:^1.1.1" + debug: "npm:^4.4.0" + checksum: 10/65f78b2598950d4f7ce163ad736e7ad358199e13dd84096524b9f10b093f92278d6d40c7390330e7603f1a048db7d7ee1f5ea3a157eb382e691b5c85de549a6b + languageName: node + linkType: hard + "simple-plist@npm:^1.1.0": version: 1.4.0 resolution: "simple-plist@npm:1.4.0" @@ -18682,6 +18849,13 @@ __metadata: languageName: node linkType: hard +"tiny-emitter@npm:^2.1.0": + version: 2.1.0 + resolution: "tiny-emitter@npm:2.1.0" + checksum: 10/75633f4de4f47f43af56aff6162f25b87be7efc6f669fda256658f3c3f4a216f23dc0d13200c6fafaaf1b0c7142f0201352fb06aec0b77f68aea96be898f4516 + languageName: node + linkType: hard + "tiny-invariant@npm:^1.3.3": version: 1.3.3 resolution: "tiny-invariant@npm:1.3.3" @@ -18833,6 +19007,13 @@ __metadata: languageName: node linkType: hard +"ts-markdown-builder@npm:0.4.1": + version: 0.4.1 + resolution: "ts-markdown-builder@npm:0.4.1" + checksum: 10/85aa963b4b962e2acc6eaa6f2912d9d2742e08b6d28ecdea618a75304418007f81684f79bf3806a29b15237d0f37eec7d00d991132bf4f0ab624bbbada9d1b5b + languageName: node + linkType: hard + "ts-node@npm:10.9.2": version: 10.9.2 resolution: "ts-node@npm:10.9.2" @@ -18871,6 +19052,13 @@ __metadata: languageName: node linkType: hard +"ts-regex-builder@npm:^1.8.2": + version: 1.8.2 + resolution: "ts-regex-builder@npm:1.8.2" + checksum: 10/d154172ba954a0014c573ab8b0308439d4267653a2be7e06c85449bc506a2aafb7fdeec59f289f8a39c89b49b66c101222b6292382b5be7d91122f7c4662c652 + languageName: node + linkType: hard + "tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0": version: 2.8.0 resolution: "tslib@npm:2.8.0" @@ -19058,6 +19246,13 @@ __metadata: languageName: node linkType: hard +"typed-function@npm:^4.2.1": + version: 4.2.2 + resolution: "typed-function@npm:4.2.2" + checksum: 10/6d0eb312d2fa2c4b9af7a6cba5f3e9123e1e7c0b2521a7cd30a1140f862ffb94ad44353b2798a8c160fb40a9b341f7870d3c05589a7b54472514ff6f1b12e6ac + languageName: node + linkType: hard + "typedarray@npm:^0.0.6": version: 0.0.6 resolution: "typedarray@npm:0.0.6" @@ -19958,7 +20153,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.0.0, yargs@npm:^17.3.1, yargs@npm:^17.6.2": +"yargs@npm:^17.0.0, yargs@npm:^17.3.1, yargs@npm:^17.6.2, yargs@npm:^17.7.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: @@ -20017,6 +20212,13 @@ __metadata: languageName: node linkType: hard +"zod@npm:^3.24.2": + version: 3.25.76 + resolution: "zod@npm:3.25.76" + checksum: 10/f0c963ec40cd96858451d1690404d603d36507c1fc9682f2dae59ab38b578687d542708a7fdbf645f77926f78c9ed558f57c3d3aa226c285f798df0c4da16995 + languageName: node + linkType: hard + "zod@npm:^3.25.0 || ^4.0.0": version: 4.1.12 resolution: "zod@npm:4.1.12" From af7861aab1b723e4792b62e03541190ff739afdb Mon Sep 17 00:00:00 2001 From: Sokolovskii Ivan Date: Fri, 28 Nov 2025 23:05:44 +0300 Subject: [PATCH 02/42] =?UTF-8?q?feat(reassure):=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D1=8B=20=D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20?= =?UTF-8?q?Accordion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- configs/eslint/rules/reactNative.ts | 2 +- package.json | 5 ++-- .../__tests__/Accordion.perf-test.tsx | 26 +++++++++++++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 src/components/Accordion/__tests__/Accordion.perf-test.tsx diff --git a/configs/eslint/rules/reactNative.ts b/configs/eslint/rules/reactNative.ts index bf99a89..99daf9a 100644 --- a/configs/eslint/rules/reactNative.ts +++ b/configs/eslint/rules/reactNative.ts @@ -39,7 +39,7 @@ export const reactNativeConfig = defineConfig([ }, }, { - files: ['**/*.{test,spec}.{js,jsx,cjs,mjs,ts,tsx,mts,cts}'], + files: ['**/*.{test,spec,perf-test}.{js,jsx,cjs,mjs,ts,tsx,mts,cts}'], rules: { 'react-native/no-inline-styles': 'off', 'react-native/no-raw-text': 'off', diff --git a/package.json b/package.json index 4a87c01..1f0c59a 100644 --- a/package.json +++ b/package.json @@ -109,6 +109,7 @@ "react-native-reanimated": "3.19.1", "react-native-safe-area-context": "5.6.1", "react-native-svg": "15.12.1", + "reassure": "1.4.0", "release-it": "19.0.6", "standard-version": "9.5.0", "storybook": "8.3.5", @@ -163,7 +164,5 @@ } } }, - "dependencies": { - "reassure": "1.4.0" - } + "dependencies": {} } diff --git a/src/components/Accordion/__tests__/Accordion.perf-test.tsx b/src/components/Accordion/__tests__/Accordion.perf-test.tsx new file mode 100644 index 0000000..240c484 --- /dev/null +++ b/src/components/Accordion/__tests__/Accordion.perf-test.tsx @@ -0,0 +1,26 @@ +import { fireEvent, screen } from '@testing-library/react-native' +import { View } from 'react-native' +import { measureRenders } from 'reassure' + +import { Accordion, AccordionTestIds } from '../Accordion' + +test('Accordion toggle performance', async () => { + const scenario = async () => { + fireEvent( + screen.getByTestId(AccordionTestIds.contentWrapper, { + includeHiddenElements: true, + }), + 'layout', + { nativeEvent: { layout: { height: 100, width: 200, x: 0, y: 0 } } } + ) + + fireEvent.press(screen.getByText('Accordion')) + } + + await measureRenders( + + + , + { warmupRuns: 5, runs: 10, writeFile: true, removeOutliers: true, scenario } + ) +}) From 356b9f5e35e9d526824959829336aed01f82adf6 Mon Sep 17 00:00:00 2001 From: Sokolovskii Ivan Date: Fri, 28 Nov 2025 23:08:47 +0300 Subject: [PATCH 03/42] =?UTF-8?q?feat(reassure):=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D1=8B=20=D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20Avatar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Avatar/__tests__/Avatar.perf-test.tsx | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/components/Avatar/__tests__/Avatar.perf-test.tsx diff --git a/src/components/Avatar/__tests__/Avatar.perf-test.tsx b/src/components/Avatar/__tests__/Avatar.perf-test.tsx new file mode 100644 index 0000000..27e360d --- /dev/null +++ b/src/components/Avatar/__tests__/Avatar.perf-test.tsx @@ -0,0 +1,22 @@ +import { measureRenders } from 'reassure'; +import { Avatar } from '../Avatar'; +import { IconUser } from '@tabler/icons-react-native'; + +test('Avatar label performance', async () => { + await measureRenders(); +}); + +test('Avatar icon performance', async () => { + await measureRenders(); +}); + +test('Avatar image performance', async () => { + await measureRenders( + + ); +}); From 3b9c676fb07114e2b0ab36782a8ce0796e5b0010 Mon Sep 17 00:00:00 2001 From: Sokolovskii Ivan Date: Fri, 28 Nov 2025 23:11:52 +0300 Subject: [PATCH 04/42] =?UTF-8?q?feat(reassure):=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D1=8B=20=D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20Badge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Avatar/__tests__/Avatar.perf-test.tsx | 31 ++++++++++++------- .../Badge/__tests__/Badge.perf-test.tsx | 29 +++++++++++++++++ 2 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 src/components/Badge/__tests__/Badge.perf-test.tsx diff --git a/src/components/Avatar/__tests__/Avatar.perf-test.tsx b/src/components/Avatar/__tests__/Avatar.perf-test.tsx index 27e360d..ed984b8 100644 --- a/src/components/Avatar/__tests__/Avatar.perf-test.tsx +++ b/src/components/Avatar/__tests__/Avatar.perf-test.tsx @@ -1,22 +1,29 @@ -import { measureRenders } from 'reassure'; -import { Avatar } from '../Avatar'; -import { IconUser } from '@tabler/icons-react-native'; +import { IconUser } from '@tabler/icons-react-native' +import { measureRenders } from 'reassure' + +import { Avatar } from '../Avatar' test('Avatar label performance', async () => { - await measureRenders(); -}); + await measureRenders( + + A + + ) +}) test('Avatar icon performance', async () => { - await measureRenders(); -}); + await measureRenders( + + ) +}) test('Avatar image performance', async () => { await measureRenders( - ); -}); + ) +}) diff --git a/src/components/Badge/__tests__/Badge.perf-test.tsx b/src/components/Badge/__tests__/Badge.perf-test.tsx new file mode 100644 index 0000000..6cc2b29 --- /dev/null +++ b/src/components/Badge/__tests__/Badge.perf-test.tsx @@ -0,0 +1,29 @@ +import { measureRenders } from 'reassure' + +import { Badge, type BadgeSeverity } from '../Badge' + +const severities: BadgeSeverity[] = [ + 'basic', + 'info', + 'success', + 'warning', + 'danger', +] + +describe('Badge performance', () => { + describe('dot', () => { + for (const severity of severities) { + test(`severity: ${severity}`, async () => { + await measureRenders() + }) + } + }) + + describe('text', () => { + for (const severity of severities) { + test(`severity: ${severity}`, async () => { + await measureRenders(12) + }) + } + }) +}) From b9d4c3c3d4632f36c322513c95f036979e442170 Mon Sep 17 00:00:00 2001 From: Sokolovskii Ivan Date: Fri, 28 Nov 2025 23:21:20 +0300 Subject: [PATCH 05/42] =?UTF-8?q?feat(reassure):=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D1=83=D0=B5?= =?UTF-8?q?=D0=BC=D0=B0=D1=8F=20=D1=83=D1=82=D0=B8=D0=BB=D0=B8=D1=82=D0=B0?= =?UTF-8?q?=D1=80=D0=BD=D0=B0=D1=8F=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=80?= =?UTF-8?q?=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__tests__/Accordion.perf-test.tsx | 6 ++--- .../Avatar/__tests__/Avatar.perf-test.tsx | 8 +++---- .../Badge/__tests__/Badge.perf-test.tsx | 7 +++--- src/utils/__tests__/perf-test-utils.tsx | 22 +++++++++++++++++++ 4 files changed, 32 insertions(+), 11 deletions(-) create mode 100644 src/utils/__tests__/perf-test-utils.tsx diff --git a/src/components/Accordion/__tests__/Accordion.perf-test.tsx b/src/components/Accordion/__tests__/Accordion.perf-test.tsx index 240c484..1cb7953 100644 --- a/src/components/Accordion/__tests__/Accordion.perf-test.tsx +++ b/src/components/Accordion/__tests__/Accordion.perf-test.tsx @@ -1,7 +1,7 @@ import { fireEvent, screen } from '@testing-library/react-native' import { View } from 'react-native' -import { measureRenders } from 'reassure' +import { measureComponentPerformance } from '../../../utils/__tests__/perf-test-utils' import { Accordion, AccordionTestIds } from '../Accordion' test('Accordion toggle performance', async () => { @@ -17,10 +17,10 @@ test('Accordion toggle performance', async () => { fireEvent.press(screen.getByText('Accordion')) } - await measureRenders( + await measureComponentPerformance( , - { warmupRuns: 5, runs: 10, writeFile: true, removeOutliers: true, scenario } + { scenario } ) }) diff --git a/src/components/Avatar/__tests__/Avatar.perf-test.tsx b/src/components/Avatar/__tests__/Avatar.perf-test.tsx index ed984b8..6f0d917 100644 --- a/src/components/Avatar/__tests__/Avatar.perf-test.tsx +++ b/src/components/Avatar/__tests__/Avatar.perf-test.tsx @@ -1,10 +1,10 @@ import { IconUser } from '@tabler/icons-react-native' -import { measureRenders } from 'reassure' +import { measureComponentPerformance } from '../../../utils/__tests__/perf-test-utils' import { Avatar } from '../Avatar' test('Avatar label performance', async () => { - await measureRenders( + await measureComponentPerformance( A @@ -12,13 +12,13 @@ test('Avatar label performance', async () => { }) test('Avatar icon performance', async () => { - await measureRenders( + await measureComponentPerformance( ) }) test('Avatar image performance', async () => { - await measureRenders( + await measureComponentPerformance( { describe('dot', () => { for (const severity of severities) { test(`severity: ${severity}`, async () => { - await measureRenders() + await measureComponentPerformance() }) } }) @@ -22,7 +21,7 @@ describe('Badge performance', () => { describe('text', () => { for (const severity of severities) { test(`severity: ${severity}`, async () => { - await measureRenders(12) + await measureComponentPerformance(12) }) } }) diff --git a/src/utils/__tests__/perf-test-utils.tsx b/src/utils/__tests__/perf-test-utils.tsx new file mode 100644 index 0000000..53275fe --- /dev/null +++ b/src/utils/__tests__/perf-test-utils.tsx @@ -0,0 +1,22 @@ +import type { ReactElement, FunctionComponent, ReactNode } from 'react' +import { measureRenders, type MeasureRendersOptions } from 'reassure' + +import { ThemeContextProvider } from '../../theme' + +const Wrapper: FunctionComponent<{ readonly children: ReactNode }> = ({ + children, +}) => {children} + +export const measureComponentPerformance = ( + ui: ReactElement, + options?: Omit +) => { + return measureRenders(ui, { + warmupRuns: 3, + runs: 10, + writeFile: true, + removeOutliers: true, + ...options, + wrapper: Wrapper, + }) +} From b4390840f608a64cf3a786f8ba63997a2446373c Mon Sep 17 00:00:00 2001 From: Sokolovskii Ivan Date: Fri, 28 Nov 2025 23:22:44 +0300 Subject: [PATCH 06/42] =?UTF-8?q?feat(reassure):=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D1=8B=20=D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D0=B0=20?= =?UTF-8?q?Button?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Button/__tests__/Button.perf-test.tsx | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/components/Button/__tests__/Button.perf-test.tsx diff --git a/src/components/Button/__tests__/Button.perf-test.tsx b/src/components/Button/__tests__/Button.perf-test.tsx new file mode 100644 index 0000000..93996fd --- /dev/null +++ b/src/components/Button/__tests__/Button.perf-test.tsx @@ -0,0 +1,34 @@ +import { IconArrowDownRight } from '@tabler/icons-react-native' + +import { measureComponentPerformance } from '../../../utils/__tests__/perf-test-utils' +import { Button } from '../Button' + +describe('Button performance', () => { + test('primary button', async () => { + await measureComponentPerformance( +