294 lines
8.8 KiB
TypeScript
294 lines
8.8 KiB
TypeScript
|
|
import { test, expect } from './mind-elixir-test'
|
||
|
|
|
||
|
|
const complexData = {
|
||
|
|
nodeData: {
|
||
|
|
topic: 'Main Topic',
|
||
|
|
id: 'main',
|
||
|
|
children: [
|
||
|
|
{
|
||
|
|
id: 'branch-a',
|
||
|
|
topic: 'Branch A',
|
||
|
|
children: [
|
||
|
|
{
|
||
|
|
id: 'leaf-a1',
|
||
|
|
topic: 'Leaf A1',
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: 'leaf-a2',
|
||
|
|
topic: 'Leaf A2',
|
||
|
|
},
|
||
|
|
],
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: 'branch-b',
|
||
|
|
topic: 'Branch B',
|
||
|
|
children: [
|
||
|
|
{
|
||
|
|
id: 'leaf-b1',
|
||
|
|
topic: 'Leaf B1',
|
||
|
|
},
|
||
|
|
],
|
||
|
|
},
|
||
|
|
],
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
test.beforeEach(async ({ me }) => {
|
||
|
|
await me.init(complexData)
|
||
|
|
})
|
||
|
|
|
||
|
|
test('Operation History - Single Node Operations', async ({ page, me }) => {
|
||
|
|
// Test createNode operation
|
||
|
|
await me.click('Leaf A1')
|
||
|
|
await page.keyboard.press('Tab') // Add child
|
||
|
|
await page.keyboard.press('Enter')
|
||
|
|
await expect(me.getByText('New Node')).toBeVisible()
|
||
|
|
|
||
|
|
// Undo createNode
|
||
|
|
await page.keyboard.press('Control+z')
|
||
|
|
await expect(me.getByText('New Node')).toBeHidden()
|
||
|
|
|
||
|
|
// Redo createNode
|
||
|
|
await page.keyboard.press('Control+y')
|
||
|
|
await expect(me.getByText('New Node')).toBeVisible()
|
||
|
|
|
||
|
|
// Test removeNode operation
|
||
|
|
await page.keyboard.press('Delete')
|
||
|
|
await expect(me.getByText('New Node')).toBeHidden()
|
||
|
|
|
||
|
|
// Undo removeNode
|
||
|
|
await page.keyboard.press('Control+z')
|
||
|
|
await expect(me.getByText('New Node')).toBeVisible()
|
||
|
|
})
|
||
|
|
|
||
|
|
test('Operation History - Node Edit Operations', async ({ page, me }) => {
|
||
|
|
const originalText = 'Leaf A2'
|
||
|
|
const editedText = 'Modified Leaf A2'
|
||
|
|
|
||
|
|
// Test finishEdit operation
|
||
|
|
await me.dblclick(originalText)
|
||
|
|
await page.keyboard.press('Control+a')
|
||
|
|
await page.keyboard.insertText(editedText)
|
||
|
|
await page.keyboard.press('Enter')
|
||
|
|
await expect(me.getByText(editedText)).toBeVisible()
|
||
|
|
|
||
|
|
// Undo edit
|
||
|
|
await page.keyboard.press('Control+z')
|
||
|
|
await expect(me.getByText(originalText)).toBeVisible()
|
||
|
|
await expect(me.getByText(editedText)).toBeHidden()
|
||
|
|
|
||
|
|
// Redo edit
|
||
|
|
await page.keyboard.press('Control+y')
|
||
|
|
await expect(me.getByText(editedText)).toBeVisible()
|
||
|
|
await expect(me.getByText(originalText)).toBeHidden()
|
||
|
|
})
|
||
|
|
|
||
|
|
test('Operation History - Multiple Node Operations', async ({ page, me }) => {
|
||
|
|
// Select multiple nodes using drag selection
|
||
|
|
await me.dragSelect('Leaf A1', 'Leaf A2')
|
||
|
|
|
||
|
|
// Remove multiple nodes
|
||
|
|
await page.keyboard.press('Delete')
|
||
|
|
await expect(me.getByText('Leaf A1')).toBeHidden()
|
||
|
|
await expect(me.getByText('Leaf A2')).toBeHidden()
|
||
|
|
|
||
|
|
// Undo removeNodes operation
|
||
|
|
await page.keyboard.press('Control+z')
|
||
|
|
await expect(me.getByText('Leaf A1')).toBeVisible()
|
||
|
|
await expect(me.getByText('Leaf A2')).toBeVisible()
|
||
|
|
|
||
|
|
// Redo removeNodes operation
|
||
|
|
await page.keyboard.press('Control+y')
|
||
|
|
await expect(me.getByText('Leaf A1')).toBeHidden()
|
||
|
|
await expect(me.getByText('Leaf A2')).toBeHidden()
|
||
|
|
})
|
||
|
|
|
||
|
|
test('Operation History - Copy Multiple Nodes', async ({ page, me }) => {
|
||
|
|
// Select and copy multiple nodes
|
||
|
|
await me.dragSelect('Leaf A1', 'Leaf A2')
|
||
|
|
await page.keyboard.press('Control+c')
|
||
|
|
|
||
|
|
// Paste to another location
|
||
|
|
await me.click('Branch B')
|
||
|
|
await page.keyboard.press('Control+v')
|
||
|
|
|
||
|
|
// Should have copied nodes under Branch B
|
||
|
|
const leafA1Nodes = me.getByText('Leaf A1')
|
||
|
|
const leafA2Nodes = me.getByText('Leaf A2')
|
||
|
|
await expect(leafA1Nodes).toHaveCount(2)
|
||
|
|
await expect(leafA2Nodes).toHaveCount(2)
|
||
|
|
|
||
|
|
// Undo copyNodes operation
|
||
|
|
await page.keyboard.press('Control+z')
|
||
|
|
await expect(leafA1Nodes).toHaveCount(1)
|
||
|
|
await expect(leafA2Nodes).toHaveCount(1)
|
||
|
|
|
||
|
|
// Redo copyNodes operation
|
||
|
|
await page.keyboard.press('Control+y')
|
||
|
|
await expect(leafA1Nodes).toHaveCount(2)
|
||
|
|
await expect(leafA2Nodes).toHaveCount(2)
|
||
|
|
})
|
||
|
|
|
||
|
|
test('Operation History - Node Movement Operations', async ({ page, me }) => {
|
||
|
|
// Test moveNodeBefore operation
|
||
|
|
await me.click('Leaf A2')
|
||
|
|
await page.keyboard.press('Alt+ArrowUp') // Move up (before sibling)
|
||
|
|
|
||
|
|
// Undo move operation
|
||
|
|
await page.keyboard.press('Control+z')
|
||
|
|
|
||
|
|
// Redo move operation
|
||
|
|
await page.keyboard.press('Control+y')
|
||
|
|
|
||
|
|
// Test moveNodeAfter operation
|
||
|
|
await page.keyboard.press('Alt+ArrowDown') // Move down (after sibling)
|
||
|
|
|
||
|
|
// Undo move operation
|
||
|
|
await page.keyboard.press('Control+z')
|
||
|
|
|
||
|
|
// Redo move operation
|
||
|
|
await page.keyboard.press('Control+y')
|
||
|
|
})
|
||
|
|
|
||
|
|
test('Operation History - Complex Operation Sequence', async ({ page, me }) => {
|
||
|
|
// Perform a complex sequence of operations
|
||
|
|
|
||
|
|
// 1. Edit a node
|
||
|
|
await me.dblclick('Branch A')
|
||
|
|
await page.keyboard.press('Control+a')
|
||
|
|
await page.keyboard.insertText('Modified Branch A')
|
||
|
|
await page.keyboard.press('Enter')
|
||
|
|
|
||
|
|
// 2. Add a child to the modified node
|
||
|
|
await page.keyboard.press('Tab')
|
||
|
|
await page.keyboard.press('Enter')
|
||
|
|
|
||
|
|
// 3. Edit the new child
|
||
|
|
await me.dblclick('New Node')
|
||
|
|
await page.keyboard.press('Control+a')
|
||
|
|
await page.keyboard.insertText('New Child Node')
|
||
|
|
await page.keyboard.press('Enter')
|
||
|
|
|
||
|
|
// 4. Copy the branch
|
||
|
|
await me.click('Modified Branch A')
|
||
|
|
await page.keyboard.press('Control+c')
|
||
|
|
|
||
|
|
// 5. Paste to main topic
|
||
|
|
await me.click('Main Topic')
|
||
|
|
await page.keyboard.press('Control+v')
|
||
|
|
|
||
|
|
// Verify all operations completed
|
||
|
|
await expect(me.getByText('Modified Branch A')).toHaveCount(2)
|
||
|
|
await expect(me.getByText('New Child Node')).toHaveCount(2)
|
||
|
|
|
||
|
|
// Undo operations step by step
|
||
|
|
await page.keyboard.press('Control+z') // Undo paste
|
||
|
|
await expect(me.getByText('Modified Branch A')).toHaveCount(1)
|
||
|
|
await expect(me.getByText('New Child Node')).toHaveCount(1)
|
||
|
|
|
||
|
|
await page.keyboard.press('Control+z') // Undo edit new child
|
||
|
|
await expect(me.getByText('New Child Node')).toBeHidden()
|
||
|
|
await expect(me.getByText('New Node')).toBeVisible()
|
||
|
|
|
||
|
|
await page.keyboard.press('Control+z') // Undo add child
|
||
|
|
await expect(me.getByText('New Node')).toBeHidden()
|
||
|
|
|
||
|
|
await page.keyboard.press('Control+z') // Undo edit branch
|
||
|
|
await expect(me.getByText('Modified Branch A')).toBeHidden()
|
||
|
|
await expect(me.getByText('Branch A')).toBeVisible()
|
||
|
|
|
||
|
|
// Redo all operations
|
||
|
|
await page.keyboard.press('Control+y') // Redo edit branch
|
||
|
|
await expect(me.getByText('Modified Branch A')).toBeVisible()
|
||
|
|
|
||
|
|
await page.keyboard.press('Control+y') // Redo add child
|
||
|
|
await expect(me.getByText('New Node')).toBeVisible()
|
||
|
|
|
||
|
|
await page.keyboard.press('Control+y') // Redo edit new child
|
||
|
|
await expect(me.getByText('New Child Node')).toBeVisible()
|
||
|
|
|
||
|
|
await page.keyboard.press('Control+y') // Redo paste
|
||
|
|
await expect(me.getByText('Modified Branch A')).toHaveCount(2)
|
||
|
|
})
|
||
|
|
|
||
|
|
test('Operation History - History Branching', async ({ page, me }) => {
|
||
|
|
// Perform an operation
|
||
|
|
await me.click('Leaf B1')
|
||
|
|
await page.keyboard.press('Enter')
|
||
|
|
await page.keyboard.press('Enter')
|
||
|
|
await expect(me.getByText('New Node')).toBeVisible()
|
||
|
|
|
||
|
|
// Undo the operation
|
||
|
|
await page.keyboard.press('Control+z')
|
||
|
|
await expect(me.getByText('New Node')).toBeHidden()
|
||
|
|
|
||
|
|
// Perform a different operation (this should clear the redo history)
|
||
|
|
await page.keyboard.press('Tab') // Add child instead
|
||
|
|
await page.keyboard.press('Enter')
|
||
|
|
await expect(me.getByText('New Node')).toBeVisible()
|
||
|
|
|
||
|
|
// Try to redo the original operation (should not work)
|
||
|
|
await page.keyboard.press('Control+y')
|
||
|
|
// The new child should still be there, not the sibling
|
||
|
|
await expect(me.getByText('New Node')).toBeVisible()
|
||
|
|
|
||
|
|
// Undo the child operation
|
||
|
|
await page.keyboard.press('Control+z')
|
||
|
|
await expect(me.getByText('New Node')).toBeHidden()
|
||
|
|
})
|
||
|
|
|
||
|
|
test('Operation History - Node Selection After Undo/Redo', async ({ page, me }) => {
|
||
|
|
// Add a node and verify selection
|
||
|
|
await me.click('Branch B')
|
||
|
|
await page.keyboard.press('Tab')
|
||
|
|
await page.keyboard.press('Enter')
|
||
|
|
|
||
|
|
// The new node should be selected
|
||
|
|
const newNode = me.getByText('New Node')
|
||
|
|
await expect(newNode).toBeVisible()
|
||
|
|
|
||
|
|
// Undo - should restore selection to Branch B
|
||
|
|
await page.keyboard.press('Control+z')
|
||
|
|
await expect(newNode).toBeHidden()
|
||
|
|
|
||
|
|
// Verify Branch B is selected by performing an action
|
||
|
|
await page.keyboard.press('Enter') // Add sibling
|
||
|
|
await page.keyboard.press('Enter')
|
||
|
|
await expect(me.getByText('New Node')).toBeVisible()
|
||
|
|
|
||
|
|
// Clean up
|
||
|
|
await page.keyboard.press('Control+z')
|
||
|
|
})
|
||
|
|
|
||
|
|
test('Operation History - Stress Test Multiple Rapid Operations', async ({ page, me }) => {
|
||
|
|
// Perform many rapid operations
|
||
|
|
await me.click('Main Topic')
|
||
|
|
|
||
|
|
for (let i = 0; i < 5; i++) {
|
||
|
|
await page.keyboard.press('Tab') // Add child
|
||
|
|
await page.keyboard.press('Enter')
|
||
|
|
await page.keyboard.press('Enter') // Add sibling
|
||
|
|
await page.keyboard.press('Enter')
|
||
|
|
}
|
||
|
|
|
||
|
|
// Should have multiple new nodes
|
||
|
|
const newNodes = me.getByText('New Node')
|
||
|
|
await expect(newNodes).toHaveCount(10)
|
||
|
|
|
||
|
|
// Undo all operations
|
||
|
|
for (let i = 0; i < 10; i++) {
|
||
|
|
await page.keyboard.press('Control+z')
|
||
|
|
}
|
||
|
|
|
||
|
|
// Should be back to original state
|
||
|
|
await expect(newNodes).toHaveCount(0)
|
||
|
|
|
||
|
|
// Redo all operations
|
||
|
|
for (let i = 0; i < 10; i++) {
|
||
|
|
await page.keyboard.press('Control+y')
|
||
|
|
}
|
||
|
|
|
||
|
|
// Should have all nodes back
|
||
|
|
await expect(newNodes).toHaveCount(10)
|
||
|
|
})
|