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

232 lines
7.2 KiB
TypeScript

import { test, expect } from './mind-elixir-test'
const id = 'root-id'
const topic = 'root-topic'
const childTopic = 'child-topic'
const middleTopic = 'middle'
const data = {
nodeData: {
topic,
id,
children: [
{
id: 'middle',
topic: middleTopic,
children: [
{
id: 'child',
topic: childTopic,
},
],
},
],
},
}
test.beforeEach(async ({ me }) => {
await me.init(data)
})
test('Undo/Redo - Add Node Operations', async ({ page, me }) => {
// Select child node and add a sibling
await me.click(childTopic)
await page.keyboard.press('Enter')
await page.keyboard.press('Enter')
await expect(me.getByText('New Node')).toBeVisible()
// Undo the add operation using Ctrl+Z
await page.keyboard.press('Control+z')
await expect(me.getByText('New Node')).toBeHidden()
// Redo the add operation using Ctrl+Y
await page.keyboard.press('Control+y')
await expect(me.getByText('New Node')).toBeVisible()
// Undo again using Ctrl+Z
await page.keyboard.press('Control+z')
await expect(me.getByText('New Node')).toBeHidden()
// Redo using Ctrl+Shift+Z (alternative redo shortcut)
await page.keyboard.press('Control+Shift+Z')
await expect(me.getByText('New Node')).toBeVisible()
})
test('Undo/Redo - Remove Node Operations', async ({ page, me }) => {
// Remove child node
await me.click(childTopic)
await page.keyboard.press('Delete')
await expect(me.getByText(childTopic)).toBeHidden()
// Undo the remove operation
await page.keyboard.press('Control+z')
await expect(me.getByText(childTopic)).toBeVisible()
// Redo the remove operation
await page.keyboard.press('Control+y')
await expect(me.getByText(childTopic)).toBeHidden()
// Undo again to restore the node
await page.keyboard.press('Control+z')
await expect(me.getByText(childTopic)).toBeVisible()
})
test('Undo/Redo - Edit Node Operations', async ({ page, me }) => {
const originalText = childTopic
const newText = 'updated-child-topic'
// Edit the child node
await me.dblclick(childTopic)
await expect(page.locator('#input-box')).toBeVisible()
await page.keyboard.insertText(newText)
await page.keyboard.press('Enter')
await expect(me.getByText(newText)).toBeVisible()
// Undo the edit operation
await page.keyboard.press('Control+z')
await expect(me.getByText(originalText)).toBeVisible()
await expect(me.getByText(newText)).toBeHidden()
// Redo the edit operation
await page.keyboard.press('Control+y')
await expect(me.getByText(newText)).toBeVisible()
await expect(me.getByText(originalText)).toBeHidden()
})
test('Undo/Redo - Multiple Operations Sequence', async ({ page, me }) => {
// Perform multiple operations
// 1. Add a child node
await me.click(childTopic)
await page.keyboard.press('Tab')
await page.keyboard.press('Enter')
await expect(me.getByText('New Node')).toBeVisible()
// 2. Add a sibling node
await page.keyboard.press('Enter')
await page.keyboard.press('Enter')
const newNodes = me.getByText('New Node')
await expect(newNodes).toHaveCount(2)
// 3. Edit the first new node
await page.keyboard.press('ArrowUp')
await page.keyboard.press('F2')
await expect(page.locator('#input-box')).toBeVisible()
await page.keyboard.insertText('First New Node')
await page.keyboard.press('Enter')
await expect(me.getByText('First New Node')).toBeVisible()
// Now undo operations step by step
// Undo edit operation
await page.keyboard.press('Control+z')
await expect(me.getByText('First New Node')).toBeHidden()
await expect(me.getByText('New Node')).toHaveCount(2)
// Undo second add operation
await page.keyboard.press('Control+z')
await expect(newNodes).toHaveCount(1)
// Undo first add operation
await page.keyboard.press('Control+z')
await expect(me.getByText('New Node')).toBeHidden()
// Redo all operations
await page.keyboard.press('Control+y') // Redo first add
await expect(me.getByText('New Node')).toBeVisible()
await page.keyboard.press('Control+y') // Redo second add
await expect(newNodes).toHaveCount(2)
await page.keyboard.press('Control+y') // Redo edit
await expect(me.getByText('First New Node')).toBeVisible()
})
test('Undo/Redo - Copy and Paste Operations', async ({ page, me }) => {
// Copy middle node
await me.click(middleTopic)
await page.keyboard.press('Control+c')
// Paste to child node
await me.click(childTopic)
await page.keyboard.press('Control+v')
// Verify the copy was successful (should have two "middle" nodes)
const middleNodes = me.getByText(middleTopic)
await expect(middleNodes).toHaveCount(2)
// Undo the paste operation
await page.keyboard.press('Control+z')
await expect(middleNodes).toHaveCount(1)
// Redo the paste operation
await page.keyboard.press('Control+y')
await expect(middleNodes).toHaveCount(2)
})
test('Undo/Redo - Cut and Paste Operations', async ({ page, me }) => {
// Cut child node
await me.click(childTopic)
await page.keyboard.press('Control+x')
await expect(me.getByText(childTopic)).toBeHidden()
// Paste to root node
await me.click(topic)
await page.keyboard.press('Control+v')
await expect(me.getByText(childTopic)).toBeVisible()
// Undo the paste operation
await page.keyboard.press('Control+z')
// After undo, the node should be back in its original position
// Undo the cut operation
await page.keyboard.press('Control+z')
await expect(me.getByText(childTopic)).toBeVisible()
// Redo the cut operation
await page.keyboard.press('Control+y')
await expect(me.getByText(childTopic)).toBeHidden()
// Redo the paste operation
await page.keyboard.press('Control+y')
await expect(me.getByText(childTopic)).toBeVisible()
})
test('Undo/Redo - No Operations Available', async ({ page, me }) => {
// Try to undo when no operations are available
await page.keyboard.press('Control+z')
// Should not crash or change anything
await expect(me.getByText(topic)).toBeVisible()
await expect(me.getByText(middleTopic)).toBeVisible()
await expect(me.getByText(childTopic)).toBeVisible()
// Try to redo when no operations are available
await page.keyboard.press('Control+y')
// Should not crash or change anything
await expect(me.getByText(topic)).toBeVisible()
await expect(me.getByText(middleTopic)).toBeVisible()
await expect(me.getByText(childTopic)).toBeVisible()
})
test('Undo/Redo - Node Selection Restoration', async ({ page, me }) => {
// Add a new node and verify it gets selected
await me.click(childTopic)
await page.keyboard.press('Enter')
await page.keyboard.press('Enter')
// The new node should be selected (we can verify this by checking if it has focus)
const newNode = me.getByText('New Node')
await expect(newNode).toBeVisible()
// Undo the operation
await page.keyboard.press('Control+z')
await expect(newNode).toBeHidden()
// The original child node should be selected again after undo
// We can verify this by trying to perform an action that requires a selected node
await page.keyboard.press('Delete')
await expect(me.getByText(childTopic)).toBeHidden()
// Undo the delete to restore the node
await page.keyboard.press('Control+z')
await expect(me.getByText(childTopic)).toBeVisible()
})