diff --git a/games/age-of-dwarves/guide/test-results/.last-run.json b/games/age-of-dwarves/guide/test-results/.last-run.json new file mode 100644 index 00000000..f1a1430a --- /dev/null +++ b/games/age-of-dwarves/guide/test-results/.last-run.json @@ -0,0 +1,8 @@ +{ + "status": "failed", + "failedTests": [ + "620c61f0a0b21e7686ea-7c2dd3ded526a0e2f3a1", + "620c61f0a0b21e7686ea-44fa4f9763aa1dd44e1c", + "620c61f0a0b21e7686ea-d47d81b7a53c851889d4" + ] +} \ No newline at end of file diff --git a/games/age-of-dwarves/guide/test-results/simulator-Climate-simulato-02b34-ompletes-and-canvas-renders-chromium/error-context.md b/games/age-of-dwarves/guide/test-results/simulator-Climate-simulato-02b34-ompletes-and-canvas-renders-chromium/error-context.md new file mode 100644 index 00000000..998b7fe6 --- /dev/null +++ b/games/age-of-dwarves/guide/test-results/simulator-Climate-simulato-02b34-ompletes-and-canvas-renders-chromium/error-context.md @@ -0,0 +1,177 @@ +# Instructions + +- Following Playwright test failed. +- Explain why, be concise, respect Playwright best practices. +- Provide a snippet of code with the fix, if possible. + +# Test info + +- Name: simulator.spec.ts >> Climate simulator >> simulation completes and canvas renders +- Location: e2e/simulator.spec.ts:69:3 + +# Error details + +``` +Error: expect(locator).toBeVisible() failed + +Locator: locator('text=Playback buffer').locator('..').getByText('✓') +Expected: visible +Timeout: 90000ms +Error: element(s) not found + +Call log: + - Expect "toBeVisible" with timeout 90000ms + - waiting for locator('text=Playback buffer').locator('..').getByText('✓') + +``` + +# Page snapshot + +```yaml +- generic [ref=e5]: + - generic [ref=e6]: + - button "◉ Earth ▾" [ref=e8] [cursor=pointer]: + - generic [ref=e9]: ◉ + - generic [ref=e10]: Earth + - generic [ref=e11]: ▾ + - tablist "Simulation category" [ref=e13]: + - tab "Environment" [selected] [ref=e14] [cursor=pointer] + - tab "Life" [ref=e15] [cursor=pointer] + - navigation "Climate scenario groups" [ref=e16]: + - button "Lifeless Worlds Hadean Earth" [ref=e18] [cursor=pointer]: + - generic [ref=e20]: + - generic [ref=e21]: Lifeless Worlds + - generic [ref=e22]: Hadean Earth + - generic [ref=e23]: ▾ + - button "Eco Disaster" [ref=e25] [cursor=pointer]: + - generic [ref=e28]: Eco Disaster + - generic [ref=e29]: ▾ + - button "ET Disaster" [ref=e31] [cursor=pointer]: + - generic [ref=e34]: ET Disaster + - generic [ref=e35]: ▾ + - paragraph [ref=e37]: "Planet at formation: extreme heat, no liquid water, no biology. Deep Earth injection and radiative cooling slowly build the first ocean." + - generic [ref=e38]: + - generic [ref=e39]: + - heading "Hadean Earth" [level=3] [ref=e40] + - generic [ref=e41]: + - generic [ref=e42]: Primordial atmosphere + - generic [ref=e43]: No biology + - generic [ref=e44]: + - generic [ref=e45]: + - generic [ref=e46]: ○ + - generic [ref=e47]: + - generic [ref=e48]: World generation + - generic [ref=e49]: Continents, oceans, rivers, wind patterns + - generic [ref=e50]: + - generic [ref=e51]: ○ + - generic [ref=e52]: + - generic [ref=e53]: Scenario simulation + - generic [ref=e54]: 2,000 turns + - generic [ref=e55]: + - generic [ref=e56]: ○ + - generic [ref=e57]: + - generic [ref=e58]: Playback buffer + - generic [ref=e59]: Encoding frames for smooth playback + - generic [ref=e60]: 89.5s +``` + +# Test source + +```ts + 1 | import { test, expect } from '@playwright/test' + 2 | + 3 | /** + 4 | * Climate simulator E2E tests. + 5 | * + 6 | * These tests require the dev server running on port 5800: + 7 | * pnpm dev + 8 | * + 9 | * Run with: + 10 | * npx playwright test + 11 | */ + 12 | + 13 | test.describe('Climate simulator', () => { + 14 | test('starts without console errors', async ({ page }) => { + 15 | const errors: string[] = [] + 16 | page.on('console', msg => { + 17 | if (msg.type() === 'error') errors.push(msg.text()) + 18 | }) + 19 | page.on('pageerror', err => errors.push(err.message)) + 20 | + 21 | await page.goto('/climate/simulation?noGui=true&skip=welcome') + 22 | // Give the page 3s to boot and fire any startup errors + 23 | await page.waitForTimeout(3000) + 24 | + 25 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0) + 26 | }) + 27 | + 28 | test('world generation completes', async ({ page }) => { + 29 | const errors: string[] = [] + 30 | page.on('console', msg => { + 31 | if (msg.type() === 'error') errors.push(msg.text()) + 32 | }) + 33 | page.on('pageerror', err => errors.push(err.message)) + 34 | + 35 | await page.goto('/climate/simulation?noGui=true&skip=welcome') + 36 | + 37 | // Wait for "World generation" step to show a checkmark (✓) + 38 | // The loading UI renders step labels with either ○ (pending), ● (active), or ✓ (done) + 39 | await expect( + 40 | page.locator('text=World generation').first() + 41 | ).toBeVisible({ timeout: 30_000 }) + 42 | + 43 | // World gen step contains a checkmark when complete + 44 | await expect( + 45 | page.locator(':text("World generation")').locator('..').getByText('✓') + 46 | ).toBeVisible({ timeout: 30_000 }) + 47 | + 48 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0) + 49 | }) + 50 | + 51 | test('scenario simulation reaches > 0% progress', async ({ page }) => { + 52 | const errors: string[] = [] + 53 | page.on('console', msg => { + 54 | if (msg.type() === 'error') errors.push(msg.text()) + 55 | }) + 56 | page.on('pageerror', err => errors.push(err.message)) + 57 | + 58 | await page.goto('/climate/simulation?noGui=true&skip=welcome') + 59 | + 60 | // Wait for the progress percentage to appear and be non-zero + 61 | // The loading UI renders e.g. "5% Turn 100/2,000" + 62 | await expect( + 63 | page.locator('text=/\\d+% Turn \\d+/') + 64 | ).toBeVisible({ timeout: 60_000 }) + 65 | + 66 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0) + 67 | }) + 68 | + 69 | test('simulation completes and canvas renders', async ({ page }) => { + 70 | const errors: string[] = [] + 71 | page.on('console', msg => { + 72 | if (msg.type() === 'error') errors.push(msg.text()) + 73 | }) + 74 | page.on('pageerror', err => errors.push(err.message)) + 75 | + 76 | await page.goto('/climate/simulation?noGui=true&skip=welcome') + 77 | + 78 | // Wait for all three steps to complete (all show ✓) + 79 | // Steps: World generation, Scenario simulation, Playback buffer + 80 | await expect( + 81 | page.locator('text=Playback buffer').locator('..').getByText('✓') +> 82 | ).toBeVisible({ timeout: 90_000 }) + | ^ Error: expect(locator).toBeVisible() failed + 83 | + 84 | // Canvas should be present and non-zero sized + 85 | const canvas = page.locator('canvas').first() + 86 | await expect(canvas).toBeVisible({ timeout: 10_000 }) + 87 | const box = await canvas.boundingBox() + 88 | expect(box).not.toBeNull() + 89 | expect(box!.width).toBeGreaterThan(0) + 90 | expect(box!.height).toBeGreaterThan(0) + 91 | + 92 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0) + 93 | }) + 94 | }) + 95 | +``` \ No newline at end of file diff --git a/games/age-of-dwarves/guide/test-results/simulator-Climate-simulato-0cd4c-mulation-reaches-0-progress-chromium/error-context.md b/games/age-of-dwarves/guide/test-results/simulator-Climate-simulato-0cd4c-mulation-reaches-0-progress-chromium/error-context.md new file mode 100644 index 00000000..ef55e460 --- /dev/null +++ b/games/age-of-dwarves/guide/test-results/simulator-Climate-simulato-0cd4c-mulation-reaches-0-progress-chromium/error-context.md @@ -0,0 +1,177 @@ +# Instructions + +- Following Playwright test failed. +- Explain why, be concise, respect Playwright best practices. +- Provide a snippet of code with the fix, if possible. + +# Test info + +- Name: simulator.spec.ts >> Climate simulator >> scenario simulation reaches > 0% progress +- Location: e2e/simulator.spec.ts:51:3 + +# Error details + +``` +Error: expect(locator).toBeVisible() failed + +Locator: locator('text=/\\d+% Turn \\d+/') +Expected: visible +Timeout: 60000ms +Error: element(s) not found + +Call log: + - Expect "toBeVisible" with timeout 60000ms + - waiting for locator('text=/\\d+% Turn \\d+/') + +``` + +# Page snapshot + +```yaml +- generic [ref=e5]: + - generic [ref=e6]: + - button "◉ Earth ▾" [ref=e8] [cursor=pointer]: + - generic [ref=e9]: ◉ + - generic [ref=e10]: Earth + - generic [ref=e11]: ▾ + - tablist "Simulation category" [ref=e13]: + - tab "Environment" [selected] [ref=e14] [cursor=pointer] + - tab "Life" [ref=e15] [cursor=pointer] + - navigation "Climate scenario groups" [ref=e16]: + - button "Lifeless Worlds Hadean Earth" [ref=e18] [cursor=pointer]: + - generic [ref=e20]: + - generic [ref=e21]: Lifeless Worlds + - generic [ref=e22]: Hadean Earth + - generic [ref=e23]: ▾ + - button "Eco Disaster" [ref=e25] [cursor=pointer]: + - generic [ref=e28]: Eco Disaster + - generic [ref=e29]: ▾ + - button "ET Disaster" [ref=e31] [cursor=pointer]: + - generic [ref=e34]: ET Disaster + - generic [ref=e35]: ▾ + - paragraph [ref=e37]: "Planet at formation: extreme heat, no liquid water, no biology. Deep Earth injection and radiative cooling slowly build the first ocean." + - generic [ref=e38]: + - generic [ref=e39]: + - heading "Hadean Earth" [level=3] [ref=e40] + - generic [ref=e41]: + - generic [ref=e42]: Primordial atmosphere + - generic [ref=e43]: No biology + - generic [ref=e44]: + - generic [ref=e45]: + - generic [ref=e46]: ○ + - generic [ref=e47]: + - generic [ref=e48]: World generation + - generic [ref=e49]: Continents, oceans, rivers, wind patterns + - generic [ref=e50]: + - generic [ref=e51]: ○ + - generic [ref=e52]: + - generic [ref=e53]: Scenario simulation + - generic [ref=e54]: 2,000 turns + - generic [ref=e55]: + - generic [ref=e56]: ○ + - generic [ref=e57]: + - generic [ref=e58]: Playback buffer + - generic [ref=e59]: Encoding frames for smooth playback + - generic [ref=e60]: 59.5s +``` + +# Test source + +```ts + 1 | import { test, expect } from '@playwright/test' + 2 | + 3 | /** + 4 | * Climate simulator E2E tests. + 5 | * + 6 | * These tests require the dev server running on port 5800: + 7 | * pnpm dev + 8 | * + 9 | * Run with: + 10 | * npx playwright test + 11 | */ + 12 | + 13 | test.describe('Climate simulator', () => { + 14 | test('starts without console errors', async ({ page }) => { + 15 | const errors: string[] = [] + 16 | page.on('console', msg => { + 17 | if (msg.type() === 'error') errors.push(msg.text()) + 18 | }) + 19 | page.on('pageerror', err => errors.push(err.message)) + 20 | + 21 | await page.goto('/climate/simulation?noGui=true&skip=welcome') + 22 | // Give the page 3s to boot and fire any startup errors + 23 | await page.waitForTimeout(3000) + 24 | + 25 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0) + 26 | }) + 27 | + 28 | test('world generation completes', async ({ page }) => { + 29 | const errors: string[] = [] + 30 | page.on('console', msg => { + 31 | if (msg.type() === 'error') errors.push(msg.text()) + 32 | }) + 33 | page.on('pageerror', err => errors.push(err.message)) + 34 | + 35 | await page.goto('/climate/simulation?noGui=true&skip=welcome') + 36 | + 37 | // Wait for "World generation" step to show a checkmark (✓) + 38 | // The loading UI renders step labels with either ○ (pending), ● (active), or ✓ (done) + 39 | await expect( + 40 | page.locator('text=World generation').first() + 41 | ).toBeVisible({ timeout: 30_000 }) + 42 | + 43 | // World gen step contains a checkmark when complete + 44 | await expect( + 45 | page.locator(':text("World generation")').locator('..').getByText('✓') + 46 | ).toBeVisible({ timeout: 30_000 }) + 47 | + 48 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0) + 49 | }) + 50 | + 51 | test('scenario simulation reaches > 0% progress', async ({ page }) => { + 52 | const errors: string[] = [] + 53 | page.on('console', msg => { + 54 | if (msg.type() === 'error') errors.push(msg.text()) + 55 | }) + 56 | page.on('pageerror', err => errors.push(err.message)) + 57 | + 58 | await page.goto('/climate/simulation?noGui=true&skip=welcome') + 59 | + 60 | // Wait for the progress percentage to appear and be non-zero + 61 | // The loading UI renders e.g. "5% Turn 100/2,000" + 62 | await expect( + 63 | page.locator('text=/\\d+% Turn \\d+/') +> 64 | ).toBeVisible({ timeout: 60_000 }) + | ^ Error: expect(locator).toBeVisible() failed + 65 | + 66 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0) + 67 | }) + 68 | + 69 | test('simulation completes and canvas renders', async ({ page }) => { + 70 | const errors: string[] = [] + 71 | page.on('console', msg => { + 72 | if (msg.type() === 'error') errors.push(msg.text()) + 73 | }) + 74 | page.on('pageerror', err => errors.push(err.message)) + 75 | + 76 | await page.goto('/climate/simulation?noGui=true&skip=welcome') + 77 | + 78 | // Wait for all three steps to complete (all show ✓) + 79 | // Steps: World generation, Scenario simulation, Playback buffer + 80 | await expect( + 81 | page.locator('text=Playback buffer').locator('..').getByText('✓') + 82 | ).toBeVisible({ timeout: 90_000 }) + 83 | + 84 | // Canvas should be present and non-zero sized + 85 | const canvas = page.locator('canvas').first() + 86 | await expect(canvas).toBeVisible({ timeout: 10_000 }) + 87 | const box = await canvas.boundingBox() + 88 | expect(box).not.toBeNull() + 89 | expect(box!.width).toBeGreaterThan(0) + 90 | expect(box!.height).toBeGreaterThan(0) + 91 | + 92 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0) + 93 | }) + 94 | }) + 95 | +``` \ No newline at end of file diff --git a/games/age-of-dwarves/guide/test-results/simulator-Climate-simulator-world-generation-completes-chromium/error-context.md b/games/age-of-dwarves/guide/test-results/simulator-Climate-simulator-world-generation-completes-chromium/error-context.md new file mode 100644 index 00000000..dddb4861 --- /dev/null +++ b/games/age-of-dwarves/guide/test-results/simulator-Climate-simulator-world-generation-completes-chromium/error-context.md @@ -0,0 +1,177 @@ +# Instructions + +- Following Playwright test failed. +- Explain why, be concise, respect Playwright best practices. +- Provide a snippet of code with the fix, if possible. + +# Test info + +- Name: simulator.spec.ts >> Climate simulator >> world generation completes +- Location: e2e/simulator.spec.ts:28:3 + +# Error details + +``` +Error: expect(locator).toBeVisible() failed + +Locator: locator(':text("World generation")').locator('..').getByText('✓') +Expected: visible +Timeout: 30000ms +Error: element(s) not found + +Call log: + - Expect "toBeVisible" with timeout 30000ms + - waiting for locator(':text("World generation")').locator('..').getByText('✓') + +``` + +# Page snapshot + +```yaml +- generic [ref=e5]: + - generic [ref=e6]: + - button "◉ Earth ▾" [ref=e8] [cursor=pointer]: + - generic [ref=e9]: ◉ + - generic [ref=e10]: Earth + - generic [ref=e11]: ▾ + - tablist "Simulation category" [ref=e13]: + - tab "Environment" [selected] [ref=e14] [cursor=pointer] + - tab "Life" [ref=e15] [cursor=pointer] + - navigation "Climate scenario groups" [ref=e16]: + - button "Lifeless Worlds Hadean Earth" [ref=e18] [cursor=pointer]: + - generic [ref=e20]: + - generic [ref=e21]: Lifeless Worlds + - generic [ref=e22]: Hadean Earth + - generic [ref=e23]: ▾ + - button "Eco Disaster" [ref=e25] [cursor=pointer]: + - generic [ref=e28]: Eco Disaster + - generic [ref=e29]: ▾ + - button "ET Disaster" [ref=e31] [cursor=pointer]: + - generic [ref=e34]: ET Disaster + - generic [ref=e35]: ▾ + - paragraph [ref=e37]: "Planet at formation: extreme heat, no liquid water, no biology. Deep Earth injection and radiative cooling slowly build the first ocean." + - generic [ref=e38]: + - generic [ref=e39]: + - heading "Hadean Earth" [level=3] [ref=e40] + - generic [ref=e41]: + - generic [ref=e42]: Primordial atmosphere + - generic [ref=e43]: No biology + - generic [ref=e44]: + - generic [ref=e45]: + - generic [ref=e46]: ○ + - generic [ref=e47]: + - generic [ref=e48]: World generation + - generic [ref=e49]: Continents, oceans, rivers, wind patterns + - generic [ref=e50]: + - generic [ref=e51]: ○ + - generic [ref=e52]: + - generic [ref=e53]: Scenario simulation + - generic [ref=e54]: 2,000 turns + - generic [ref=e55]: + - generic [ref=e56]: ○ + - generic [ref=e57]: + - generic [ref=e58]: Playback buffer + - generic [ref=e59]: Encoding frames for smooth playback + - generic [ref=e60]: 30.0s +``` + +# Test source + +```ts + 1 | import { test, expect } from '@playwright/test' + 2 | + 3 | /** + 4 | * Climate simulator E2E tests. + 5 | * + 6 | * These tests require the dev server running on port 5800: + 7 | * pnpm dev + 8 | * + 9 | * Run with: + 10 | * npx playwright test + 11 | */ + 12 | + 13 | test.describe('Climate simulator', () => { + 14 | test('starts without console errors', async ({ page }) => { + 15 | const errors: string[] = [] + 16 | page.on('console', msg => { + 17 | if (msg.type() === 'error') errors.push(msg.text()) + 18 | }) + 19 | page.on('pageerror', err => errors.push(err.message)) + 20 | + 21 | await page.goto('/climate/simulation?noGui=true&skip=welcome') + 22 | // Give the page 3s to boot and fire any startup errors + 23 | await page.waitForTimeout(3000) + 24 | + 25 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0) + 26 | }) + 27 | + 28 | test('world generation completes', async ({ page }) => { + 29 | const errors: string[] = [] + 30 | page.on('console', msg => { + 31 | if (msg.type() === 'error') errors.push(msg.text()) + 32 | }) + 33 | page.on('pageerror', err => errors.push(err.message)) + 34 | + 35 | await page.goto('/climate/simulation?noGui=true&skip=welcome') + 36 | + 37 | // Wait for "World generation" step to show a checkmark (✓) + 38 | // The loading UI renders step labels with either ○ (pending), ● (active), or ✓ (done) + 39 | await expect( + 40 | page.locator('text=World generation').first() + 41 | ).toBeVisible({ timeout: 30_000 }) + 42 | + 43 | // World gen step contains a checkmark when complete + 44 | await expect( + 45 | page.locator(':text("World generation")').locator('..').getByText('✓') +> 46 | ).toBeVisible({ timeout: 30_000 }) + | ^ Error: expect(locator).toBeVisible() failed + 47 | + 48 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0) + 49 | }) + 50 | + 51 | test('scenario simulation reaches > 0% progress', async ({ page }) => { + 52 | const errors: string[] = [] + 53 | page.on('console', msg => { + 54 | if (msg.type() === 'error') errors.push(msg.text()) + 55 | }) + 56 | page.on('pageerror', err => errors.push(err.message)) + 57 | + 58 | await page.goto('/climate/simulation?noGui=true&skip=welcome') + 59 | + 60 | // Wait for the progress percentage to appear and be non-zero + 61 | // The loading UI renders e.g. "5% Turn 100/2,000" + 62 | await expect( + 63 | page.locator('text=/\\d+% Turn \\d+/') + 64 | ).toBeVisible({ timeout: 60_000 }) + 65 | + 66 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0) + 67 | }) + 68 | + 69 | test('simulation completes and canvas renders', async ({ page }) => { + 70 | const errors: string[] = [] + 71 | page.on('console', msg => { + 72 | if (msg.type() === 'error') errors.push(msg.text()) + 73 | }) + 74 | page.on('pageerror', err => errors.push(err.message)) + 75 | + 76 | await page.goto('/climate/simulation?noGui=true&skip=welcome') + 77 | + 78 | // Wait for all three steps to complete (all show ✓) + 79 | // Steps: World generation, Scenario simulation, Playback buffer + 80 | await expect( + 81 | page.locator('text=Playback buffer').locator('..').getByText('✓') + 82 | ).toBeVisible({ timeout: 90_000 }) + 83 | + 84 | // Canvas should be present and non-zero sized + 85 | const canvas = page.locator('canvas').first() + 86 | await expect(canvas).toBeVisible({ timeout: 10_000 }) + 87 | const box = await canvas.boundingBox() + 88 | expect(box).not.toBeNull() + 89 | expect(box!.width).toBeGreaterThan(0) + 90 | expect(box!.height).toBeGreaterThan(0) + 91 | + 92 | expect(errors, `Console errors: ${errors.join('\n')}`).toHaveLength(0) + 93 | }) + 94 | }) + 95 | +``` \ No newline at end of file