MindMap/mind-elixir-core-master/tests/keyboard-undo-redo.spec.ts

236 lines
7.4 KiB
TypeScript
Raw Normal View History

import { test, expect } from './mind-elixir-test'
const data = {
nodeData: {
topic: 'Root Node',
id: 'root',
children: [
{
id: 'left-1',
topic: 'Left Branch 1',
children: [
{
id: 'left-1-1',
topic: 'Left Child 1',
},
{
id: 'left-1-2',
topic: 'Left Child 2',
},
],
},
{
id: 'right-1',
topic: 'Right Branch 1',
children: [
{
id: 'right-1-1',
topic: 'Right Child 1',
},
],
},
],
},
}
test.beforeEach(async ({ me }) => {
await me.init(data)
})
test('Keyboard Shortcuts - Ctrl+Z for Undo', async ({ page, me }) => {
// Perform an operation that can be undone
await me.click('Left Child 1')
await page.keyboard.press('Delete')
await expect(page.getByText('Left Child 1')).toBeHidden()
// Test Ctrl+Z
await page.keyboard.press('Control+z')
await expect(page.getByText('Left Child 1')).toBeVisible()
})
test('Keyboard Shortcuts - Ctrl+Y for Redo', async ({ page, me }) => {
// Perform and undo an operation
await me.click('Left Child 1')
await page.keyboard.press('Delete')
await page.keyboard.press('Control+z')
await expect(page.getByText('Left Child 1')).toBeVisible()
// Test Ctrl+Y
await page.keyboard.press('Control+y')
await expect(page.getByText('Left Child 1')).toBeHidden()
})
test('Keyboard Shortcuts - Ctrl+Shift+Z for Redo', async ({ page, me }) => {
// Perform and undo an operation
await me.click('Right Child 1')
await page.keyboard.press('Tab') // Add child
await page.keyboard.press('Enter')
await expect(page.getByText('New Node')).toBeVisible()
await page.keyboard.press('Control+z') // Undo
await expect(page.getByText('New Node')).toBeHidden()
// Test Ctrl+Shift+Z (alternative redo)
await page.keyboard.press('Control+Shift+Z')
await expect(page.getByText('New Node')).toBeVisible()
})
test('Keyboard Shortcuts - Meta+Z for Undo (Mac style)', async ({ page, me }) => {
// This test simulates Mac-style shortcuts
await me.click('Right Branch 1')
await page.keyboard.press('Enter') // Add sibling
await page.keyboard.press('Enter')
await expect(page.getByText('New Node')).toBeVisible()
// Test Meta+Z (Mac style undo)
await page.keyboard.press('Meta+z')
await expect(page.getByText('New Node')).toBeHidden()
})
test('Keyboard Shortcuts - Meta+Y for Redo (Mac style)', async ({ page, me }) => {
// Perform and undo an operation
await me.click('Left Branch 1')
await page.keyboard.press('Shift+Enter') // Add before
await page.keyboard.press('Enter')
await expect(page.getByText('New Node')).toBeVisible()
await page.keyboard.press('Meta+z') // Undo
await expect(page.getByText('New Node')).toBeHidden()
// Test Meta+Y (Mac style redo)
await page.keyboard.press('Meta+y')
await expect(page.getByText('New Node')).toBeVisible()
})
test('Keyboard Shortcuts - Meta+Shift+Z for Redo (Mac style)', async ({ page, me }) => {
// Perform and undo an operation
await me.click('Left Child 2')
await page.keyboard.press('Control+Enter') // Add parent
await page.keyboard.press('Enter')
await expect(page.getByText('New Node')).toBeVisible()
await page.keyboard.press('Meta+z') // Undo
await expect(page.getByText('New Node')).toBeHidden()
// Test Meta+Shift+Z (Mac style alternative redo)
await page.keyboard.press('Meta+Shift+Z')
await expect(page.getByText('New Node')).toBeVisible()
})
test('Keyboard Shortcuts - Rapid Undo/Redo Sequence', async ({ page, me }) => {
// Perform multiple operations
await me.click('Root Node')
// Operation 1: Add child
await page.keyboard.press('Tab')
await page.keyboard.press('Enter')
await expect(page.getByText('New Node')).toBeVisible()
// Operation 2: Edit the new node
await me.dblclick('New Node')
await page.keyboard.press('Control+a')
await page.keyboard.insertText('Edited Node')
await page.keyboard.press('Enter')
await expect(page.getByText('Edited Node')).toBeVisible()
// Operation 3: Add sibling
await page.keyboard.press('Enter')
await page.keyboard.press('Enter')
const newNodes = page.getByText('New Node')
await expect(newNodes).toHaveCount(1)
// Rapid undo sequence
await page.keyboard.press('Control+z') // Undo add sibling
await expect(newNodes).toHaveCount(0)
await page.keyboard.press('Control+z') // Undo edit
await expect(page.getByText('Edited Node')).toBeHidden()
await expect(page.getByText('New Node')).toBeVisible()
await page.keyboard.press('Control+z') // Undo add child
await expect(page.getByText('New Node')).toBeHidden()
// Rapid redo sequence
await page.keyboard.press('Control+y') // Redo add child
await expect(page.getByText('New Node')).toBeVisible()
await page.keyboard.press('Control+y') // Redo edit
await expect(page.getByText('Edited Node')).toBeVisible()
await page.keyboard.press('Control+y') // Redo add sibling
await expect(newNodes).toHaveCount(1)
})
test('Keyboard Shortcuts - Undo/Redo with Node Movement', async ({ page, me }) => {
// Move a node using keyboard shortcuts
await me.click('Left Child 1')
await page.keyboard.press('Alt+ArrowUp') // Move up
// Verify the node moved (this depends on the specific implementation)
// We'll check by trying to undo the move
await page.keyboard.press('Control+z')
// Redo the move
await page.keyboard.press('Control+y')
})
test('Keyboard Shortcuts - Undo/Redo Edge Cases', async ({ page, me }) => {
// Test undo when at the beginning of history
await page.keyboard.press('Control+z')
await page.keyboard.press('Control+z')
await page.keyboard.press('Control+z')
// Should not crash or cause issues
await expect(page.getByText('Root Node')).toBeVisible()
// Perform an operation
await me.click('Right Child 1')
await page.keyboard.press('Delete')
await expect(page.getByText('Right Child 1')).toBeHidden()
// Test redo when at the end of history
await page.keyboard.press('Control+y')
await page.keyboard.press('Control+y')
await page.keyboard.press('Control+y')
// Should not crash or cause issues
await expect(page.getByText('Right Child 1')).toBeHidden()
})
test('Keyboard Shortcuts - Undo/Redo with Complex Node Operations', async ({ page, me }) => {
// Test with copy/paste operations
await me.click('Left Branch 1')
await page.keyboard.press('Control+c') // Copy
await me.click('Right Branch 1')
await page.keyboard.press('Control+v') // Paste
// Should have two "Left Branch 1" nodes now
const leftBranchNodes = page.getByText('Left Branch 1')
await expect(leftBranchNodes).toHaveCount(2)
// Undo the paste
await page.keyboard.press('Control+z')
await expect(leftBranchNodes).toHaveCount(1)
// Redo the paste
await page.keyboard.press('Control+y')
await expect(leftBranchNodes).toHaveCount(2)
})
test('Keyboard Shortcuts - Undo/Redo Preserves Focus', async ({ page, me }) => {
// Select a node and perform an operation
await me.click('Left Child 2')
await page.keyboard.press('Enter') // Add sibling
await page.keyboard.press('Enter')
// Undo should restore focus to the original node
await page.keyboard.press('Control+z')
// Test that the original node still has focus by performing an action
await page.keyboard.press('Delete')
await expect(page.getByText('Left Child 2')).toBeHidden()
// Restore for cleanup
await page.keyboard.press('Control+z')
await expect(page.getByText('Left Child 2')).toBeVisible()
})