Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test(): Add cursor animation testing and migrate some easy one to jest #9829

Merged
merged 22 commits into from
Apr 30, 2024

Conversation

asturur
Copy link
Member

@asturur asturur commented Apr 27, 2024

Description

Adding cursor animation testing with jest fake timers.
This PR migrates some qunit test to jest since it was easier to do so than just move the timing part to jest.

The tests are the same as before with the exception of 'assertCursorAnimation' that has been replaced with a check of the call of 'initDelayedCursor' method of IText.

This because in the PR #9823 a lot of test fail by changing how the animation fire.
The current tests assert if an animation state is on or off, but they do not actually assert who did that and if the animation was a previous running one.
With the check on the initDelayedCursor method we have a more reliable way to know if the last action started an animation without having to depend on timings

We also can snapshot the animation itself as an array of values to see how the animation changes

Copy link

codesandbox bot commented Apr 27, 2024

Review or Edit in CodeSandbox

Open the branch in Web EditorVS CodeInsiders

Open Preview

Copy link
Contributor

github-actions bot commented Apr 27, 2024

Build Stats

file / KB (diff) bundled minified
fabric 916.250 (+0.420) 305.646 (-0.028)

@asturur asturur marked this pull request as ready for review April 27, 2024 21:37
@asturur asturur changed the title test() add cursor animation testing test(): Add cursor animation testing Apr 27, 2024
@asturur asturur changed the title test(): Add cursor animation testing test(): Add cursor animation testing and migrate some easy one to jest Apr 28, 2024
this.abortCursorAnimation();
this._currentCursorOpacity = 1;
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is done by abortCursorAnimation

@asturur asturur requested a review from ShaMan123 April 28, 2024 16:57
Copy link
Contributor

@ShaMan123 ShaMan123 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Most if not all the comments are code styling differences. So disregard them if they don't suit you.
However, I do think a test should mock stuff using jest API instead of assignment so the test is clear, easy to track and strict in terms of side effects and cleanup.

src/shapes/IText/ITextBehavior.test.ts Outdated Show resolved Hide resolved
src/shapes/IText/ITextBehavior.test.ts Outdated Show resolved Hide resolved
const iText = new IText('hello\nhello');
iText._tick = _tickMock;
iText.enterEditing();
expect(iText._tick).toHaveBeenCalledWith();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be
expect(tickMock)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the opposite, i did wrong at doing expect(_initDelayedMock) in the other test.

src/shapes/IText/ITextBehavior.test.ts Outdated Show resolved Hide resolved
iText.enterEditing();
expect(iText._tick).toHaveBeenCalledWith();
_tickMock.mockClear();
iText.__lastSelected = true;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think setting internal state makes a robust test

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it is how it was before, otherwise i have to go with a full canvas where i click and select, i just moved the old tests as much as possible

src/shapes/IText/ITextKeyBehavior.test.ts Outdated Show resolved Hide resolved
iText.enterEditing();
// enter editing will set the cursor and set selection to 1
expect(selection).toBe(1);
expect(iText._tick).toBeCalledWith();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would declare the mock as a const and expect that to be called

@@ -0,0 +1,348 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion */
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Many tests here are the same apart from params and can become
test.each

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no i really like the tests one after the other is on level of nesting less, they are never exactly the same.
You end up having parameters like selectionStart, selectionEnd, direction, expected value and you end up writing the test in the parameters instead of the test function.

@asturur asturur requested a review from ShaMan123 April 29, 2024 07:23
Copy link
Contributor

Coverage after merging cursor-animation-testing into master will be

80.55%

Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
index.node.ts14.29%100%0%25%23, 26, 29, 41, 44, 47
src
   ClassRegistry.ts100%100%100%100%
   Collection.ts94.85%94.83%87.10%97.14%109, 112, 215–216, 241–242
   CommonMethods.ts96.55%87.50%100%100%9
   Intersection.ts100%100%100%100%
   Observable.ts87.76%85.29%87.50%89.58%134–135, 160–161, 32–33, 41, 50, 78, 89
   Point.ts100%100%100%100%
   Shadow.ts98.55%95.65%100%100%213
   cache.ts97.06%90%100%100%57
   config.ts74.14%65%66.67%82.76%131, 139, 139, 139, 139, 139–141, 152–154, 30
   constants.ts100%100%100%100%
src/LayoutManager
   ActiveSelectionLayoutManager.ts96.15%100%85.71%100%
   LayoutManager.ts89.03%92.86%76.92%90.41%169–170, 172, 174, 174, 174, 269, 331–332, 343, 51
   constants.ts100%100%100%100%
src/LayoutManager/LayoutStrategies
   ClipPathLayout.ts82.05%72.22%100%88.89%30–31, 42, 54, 57–58, 65
   FitContentLayout.ts100%100%100%100%
   FixedLayout.ts20%0%0%40%20–21, 23, 23, 23, 23, 23
   LayoutStrategy.ts85.11%64.71%100%95.65%37, 44, 44, 44, 52, 72–73
   utils.ts91.67%85.71%100%100%28, 34
src/Pattern
   Pattern.ts90.54%93.94%80%90.32%119, 130, 139, 32, 36
src/brushes
   BaseBrush.ts100%100%100%100%
   CircleBrush.ts0%0%0%0%108, 108, 108, 110, 112, 114–116, 118–121, 128–129, 13, 136, 138, 23–24, 32–36, 40–44, 51–54, 62–66, 68, 76, 76, 76, 76, 76–77, 79, 79, 79–82, 84, 92–93, 95, 97–99
   PatternBrush.ts97.06%87.50%100%100%21
   PencilBrush.ts91.06%82.35%100%93.81%122–123, 152, 152–154, 176, 176, 276, 280, 285–286, 68–69, 84–85
   SprayBrush.ts0%0%0%0%107, 107, 107, 107, 107–108, 110–111, 118–119, 121, 123–127, 136, 140–141, 141, 148, 148, 148–151, 153–156, 160–161, 163, 165–168, 17, 171, 178–179, 18, 181, 183–184, 186, 193–194, 196–197, 20, 200, 200, 207, 207, 21, 211, 22, 22, 22–24, 28, 32, 39, 46, 53, 60, 67, 84–86, 94–96, 98–99
src/canvas
   Canvas.ts78.81%77.33%82.14%79.42%1001–1003, 1006–1007, 1011–1012, 1123–1125, 1128–1129, 1202, 1314, 1435, 158, 183, 289, 289–294, 299, 322–323, 328–333, 353, 353, 353–354, 354, 354–355, 363, 368–369, 369, 369–370, 372, 381, 387–388, 388, 388, 42, 431, 439, 443, 443, 443–444, 446, 46, 528–529, 529, 529–530, 536, 536, 536–538, 558, 560, 560, 560–561, 561, 561, 564, 564, 564–565, 568, 577–578, 580–581, 583, 583–584, 586–587, 599–600, 600, 600–601, 603–608, 614, 621, 658, 658, 658, 660, 662–667, 673, 679, 679, 679–680, 682, 685, 690, 703, 731, 783–784, 784, 784, 784, 784, 784, 787–788, 791, 791–793, 796–797, 879, 886, 886, 886, 899, 928–929, 929, 929–931, 934–935, 935, 935, 937, 945, 945, 945–947, 947, 947, 954–955, 963–964, 964, 964–965, 971, 973
   CanvasOptions.ts100%100%100%100%
   SelectableCanvas.ts89.30%85.94%94.55%91.02%1020, 1028, 1139, 1141, 1143–1144, 1215, 1236–1237, 1255–1256, 460–461, 463–464, 464, 464, 513–514, 591, 596, 666, 671–672, 699–700, 724, 727–730, 730, 730–731, 731, 731, 737–738, 740, 760–761, 766–770, 772, 807–808, 811, 811, 811–812, 877–878, 878, 878, 878, 878, 881, 947, 947–948, 951, 971, 971
   StaticCanvas.ts96.44%92.72%98.91%98.27%1045, 1055, 1106–1108, 1111, 1146–1147, 1223, 1232, 1232, 1236, 1236, 1283–1284, 188–189, 205, 585, 597–598, 928–929, 929, 929–930
   StaticCanvasOptions.ts100%100%100%100%
   TextEditingManager.ts86%71.43%91.67%91.67%17, 17, 17–18, 18, 18
src/canvas/DOMManagers
   CanvasDOMManager.ts95.52%70%100%100%21–22, 29
   StaticCanvasDOMManager.ts97.50%88.89%100%100%33
   util.ts86.67%80.56%83.33%93.94%14, 26, 63–64, 67, 67, 74, 93–94
src/color
   Color.ts94.96%91.67%96.30%96.05%233, 258–259, 267–268, 48
   color_map.ts100%100%100%100%
   constants.ts100%100%100%100%
   util.ts85.71%76.92%100%89.74%55–56, 56, 58, 58, 58–59, 61–62, 89
src/controls
   Control.ts94.44%93.10%91.67%96.77%183, 249, 354
   changeWidth.ts100%100%100%100%
   commonControls.ts100%100%100%100%
   controlRendering.ts81.63%78%100%84.78%106, 111, 121, 121, 45, 50, 61, 61, 65–72, 81–82
   drag.ts100%100%100%100%
   fireEvent.ts88.89%75%100%100%13
   polyControl.ts10.87%0%0%16.13%114, 114, 114, 114, 114, 116–119, 119, 122, 129, 24–26, 50–52, 58–59, 61, 71, 77–79, 79, 81, 84, 86, 90–92, 94, 99
   rotate.ts19.57%12.50%50%21.43%

@asturur asturur merged commit 2c0ae33 into master Apr 30, 2024
22 checks passed
@asturur asturur deleted the cursor-animation-testing branch April 30, 2024 06:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants