Formatting was broken in split mode and also in monolith mode cursor position restoring didn't match vim actual behaviour. refactored it to work in same way as commenting works
Wait for "Action id copied" confirmation notification after clicking
"Copy Action Id". This ensures the clipboard was actually updated before
proceeding to paste, fixing the race condition where the test would
paste stale clipboard data.
The old wait for "Stop Tracking" was unreliable because that button
exists in both the old and new notifications during the transition.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
UI tests were being skipped due to Gradle build cache restoring
previous results. This defeats the purpose of stability testing.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace Thread.sleep() with proper waitFor() conditions and explicitly
dismiss notifications to prevent test timeouts.
The testTrackActionId test was failing because the IdeaVim notification
balloon remained visible after clicking "Stop Tracking", causing a 5-second
timeout when waiting for "Copy Action Id" text to disappear.
Changes:
- Replace Thread.sleep(1000) after clicking "Copy Action Id" with waitFor
condition that checks for "Stop Tracking" button to appear
- Remove Thread.sleep(1000) after clicking "Stop Tracking"
- Add explicit notification dismissal using Escape key
- Increase timeout for final waitFor to 3 seconds to allow dismissal
This follows the cause-effect principle for UI tests by waiting for
specific UI conditions rather than arbitrary timeouts.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
PyCharm now opens with a project directly instead of showing the Welcome Frame. Removed the project creation logic and unused imports.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
The RiderUiTest was failing because it didn't handle the .NET SDK
installation dialog that appears when creating a new Rider project
in a fresh environment.
Root cause:
- When the "New Solution" dialog opens, Rider detects that no .NET SDK
is installed and shows an "Install" button
- The "Create" button remains disabled until the SDK is installed
- The test was trying to click the disabled "Create" button, which
failed silently, leaving the dialog open
- The test then timed out waiting for the main IDE frame to appear
Changes:
1. Added SDK installation handling in startNewProject():
- Detects and clicks the "Install" button if present
- Waits 10 seconds for SDK installation to complete
- Waits additional 2 seconds before clicking Create
2. Made license frame handling optional:
- Wrapped manageLicensesFrame in try-catch
- Prevents failure if license is already activated
3. Increased timeouts for project creation:
- Extended IDE frame lookup timeout from 10s to 60s
- Added 5-second wait after clicking Create button
- These changes accommodate the time needed for project creation
Test results:
- Test now passes successfully (100% pass rate)
- Duration: ~1 minute (previously timed out at ~20 seconds)
- All test assertions pass
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
The test was failing because both the "Activation code" radio button
and the text input field share the same accessiblename attribute.
The XPath selector "//div[@accessiblename='Activation code']" was
matching both elements, causing the test to fail when trying to set
text on the first match (the radio button, which is not a JTextComponent).
Solution: Add a classhierarchy filter to the XPath to ensure we only
match the text input field component (JTextComponent), not the radio button.
This fix makes the selector more specific and prevents the ambiguity
that was causing the test failure.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
The UI test was failing because it relied on an obfuscated class name 'W'
to locate the activation code text field. The class name changed to 'Y' in
a recent version of JetBrains Rider, causing the test to fail with
NoSuchElementException.
This change uses the stable 'accessiblename' attribute instead, which:
- Is more stable across UI updates
- Is semantically meaningful and self-documenting
- Follows accessibility best practices
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
IntelliJ Platform now appends file type suffixes to accessible names
for improved accessibility (e.g., "MyTest.java, Java file" instead of
just "MyTest.java"). This caused UI tests to fail when trying to find
and click on Java file tabs.
Updated the XPath selector in Editor.kt to use a flexible matcher that
handles both:
- Exact match for older IntelliJ versions or files without suffixes
- Prefix match with comma for files with type suffixes
The comma in 'starts-with(@accessiblename,'$title,')' ensures we don't
accidentally match unintended tabs that happen to start with the same
characters.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This test is currently failing and needs investigation.
See AI analysis in CI for details.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Extended macOS CI screen recording to all UI test workflows:
- Added FFmpeg screen recording to PyCharm, Rider, and Octopus tests
- Removed Linux UI tests workflow (runUiTestsLinux.yml)
Removed video-recorder-junit5 library from codebase:
- Removed dependency from all UI test modules
- Removed video recorder system properties from Gradle configs
- Removed @Video annotations and imports from all test files
- Removed "Move video" steps from all workflows
Updated Claude AI analysis prompts:
- Changed from dual video sources to single CI recording
- Added helpful ffmpeg commands for video analysis:
* Extract frames at specific times
* Create thumbnail grids
* Get video duration
* Extract last N seconds
This simplifies the video recording setup by relying solely on
CI-level screen capture, which provides complete coverage of the
entire test run.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
The Monte recorder uses tscc (Camtasia) codec by default, which has
significant decoding limitations. When attempting to use Claude Code
and ffmpeg to analyze test failure videos, ffmpeg was unable to
properly extract frames beyond the first 7 seconds, even though the
full 27-second video was recorded.
The FFmpeg recorder produces standard video formats that can be fully
decoded and analyzed, enabling proper AI-assisted test failure analysis.
Configuration added to all UI test projects:
- tests/ui-ij-tests
- tests/ui-py-tests
- tests/ui-rd-tests
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
After upgrading to Gradle 9.2.1, custom Test tasks no longer
automatically inherit test source set configuration. This caused
UI test tasks to show NO-SOURCE and not execute any tests.
The fix explicitly configures testClassesDirs and classpath for
all three UI test modules:
- tests/ui-ij-tests
- tests/ui-py-tests
- tests/ui-rd-tests
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Replace unsafe non-null assertions (!!) with explicit null checks that provide
meaningful error messages when fold regions are not found. This makes test
failures easier to debug by clearly indicating what was expected.
Changes:
- ChangeActionJavaTest: Fixed 4 instances in testInsertAfterToggleFold and testInsertBeforeFold
- VisualInsertActionJavaTest: Fixed 1 instance in test block insert after folds
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Adds a test to verify that when using 'idearefactormode=visual' with
inclusive selection (default), the caret is correctly positioned at the
inclusive end of the selection (on the last character) rather than the
exclusive end (after the last character).
This test covers the caret adjustment logic in IdeaSpecifics.kt that
moves the caret from IntelliJ's exclusive end position to Vim's
inclusive end position for Visual mode when 'selection' doesn't contain
"exclusive".
The 'idearefactormode' default of Select would leave an inline rename in Insert mode, and hitting Escape to return to Normal frequently cancelled the rename.
Also fixes various edge cases when moving between template variables. Often, this works due to a change in selection, but if there's an empty template variable and no current selection, there's no change in selection, and the mode isn't updated.