import { closeElectronApp, expect, getStableWindow, test } from './fixtures/electron'; test.describe('Makelore module navigation without setup flow', () => { test('keeps the four module entries in a proportional vertical stack while resizing the window', async ({ launchElectronApp }) => { const app = await launchElectronApp({ skipSetup: true }); try { const page = await getStableWindow(app); await expect(page.getByTestId('ai-module-selection-page')).toBeVisible(); const moduleCards = page.locator('[data-testid^="ai-module-option-"]'); const readCardMetrics = async () => await moduleCards.evaluateAll((elements) => elements.map((element) => { const bounds = element.getBoundingClientRect(); const image = element.querySelector('.module-option-card-image')?.getBoundingClientRect(); return { left: bounds.left, top: bounds.top, width: bounds.width, height: bounds.height, imageWidth: image?.width ?? 0, imageHeight: image?.height ?? 0, }; })); const initialMetrics = await readCardMetrics(); expect(initialMetrics).toHaveLength(4); expect(Math.max(...initialMetrics.map((card) => card.left)) - Math.min(...initialMetrics.map((card) => card.left))).toBeLessThan(1); expect(initialMetrics.map((card) => card.top)).toEqual( [...initialMetrics].sort((top, bottom) => top.top - bottom.top).map((card) => card.top), ); const initialWidth = initialMetrics[0]?.width ?? 0; expect(initialMetrics[0]?.imageWidth ?? 0).toBeLessThan(initialWidth / 2); expect(initialMetrics[0]?.imageHeight ?? 0).toBeGreaterThan((initialMetrics[0]?.height ?? 0) * 0.9); await app.evaluate(({ BrowserWindow }) => { BrowserWindow.getAllWindows()[0]?.setSize(1100, 700); }); await expect.poll(async () => (await readCardMetrics())[0]?.width ?? 0).toBeLessThan(initialWidth - 1); const resizedMetrics = await readCardMetrics(); expect(resizedMetrics).toHaveLength(4); expect(Math.max(...resizedMetrics.map((card) => card.left)) - Math.min(...resizedMetrics.map((card) => card.left))).toBeLessThan(1); expect(resizedMetrics.map((card) => card.top)).toEqual( [...resizedMetrics].sort((top, bottom) => top.top - bottom.top).map((card) => card.top), ); expect(resizedMetrics[0]!.imageWidth).toBeLessThan(resizedMetrics[0]!.width / 2); expect(resizedMetrics[0]!.imageHeight).toBeGreaterThan(resizedMetrics[0]!.height * 0.9); } finally { await closeElectronApp(app); } }); test('opens the module chooser and switches between enabled modules', async ({ launchElectronApp }) => { const app = await launchElectronApp({ skipSetup: true }); try { const page = await getStableWindow(app); const minimumSize = await app.evaluate(({ BrowserWindow }) => BrowserWindow.getAllWindows()[0]?.getMinimumSize()); expect(minimumSize).toEqual([1024, 700]); await expect(page.getByTestId('ai-module-selection-page')).toBeVisible(); await page.getByTestId('ai-module-option-programming').click(); await expect(page.getByTestId('main-layout')).toBeVisible(); await expect(page.getByText('请先新建项目')).toHaveCount(0); await expect(page.getByText('一念成光,万物可创。')).toBeVisible(); await expect(page.getByRole('img', { name: 'Makelore logo' })).toBeVisible(); await expect(page.getByTestId('sidebar-module-switcher-trigger')).toContainText('编程 Code'); await expect(page.getByTestId('sidebar-create-project')).toBeVisible(); await expect(page.getByTestId('sidebar-nav-publish')).toHaveCount(0); await expect(page.getByTestId('sidebar-nav-project-config')).toHaveCount(0); await expect(page.getByTestId('sidebar-nav-agent-chat')).toHaveCount(0); await expect(page.getByRole('button', { name: '添加已有项目' })).toHaveCount(0); await expect(page.getByText('成长成就在这里')).toHaveCount(0); await expect(page.getByText('已创建 Phaser 2D 小游戏起步工程')).toHaveCount(0); await expect(page.getByTestId('game-asset-browser')).toHaveCount(0); await expect(page.getByTestId('game-asset-review-summary')).toHaveCount(0); await expect(page.getByTestId('sidebar-module-switcher')).toBeVisible(); await expect(page.getByTestId('sidebar-module-switcher-trigger')).toHaveAttribute('aria-expanded', 'false'); await page.getByTestId('sidebar-module-switcher-trigger').click(); await expect(page.getByTestId('sidebar-module-programming')).toHaveAttribute('aria-current', 'page'); await expect(page.getByTestId('sidebar-module-learning')).toBeDisabled(); await expect(page.getByTestId('sidebar-module-robot')).toBeDisabled(); await expect(page.getByTestId('sidebar-module-robot')).toContainText('Robot 机器'); await page.getByTestId('sidebar-module-painting').click(); await expect(page.getByTestId('image-canvas-page')).toBeVisible(); await expect(page.getByTestId('image-workspace-unavailable')).toBeVisible(); await expect(page.getByText('AI 设计暂不可用').first()).toBeVisible(); await expect(page.getByTestId('sidebar-image-workspace')).toBeVisible(); await expect(page.getByTestId('sidebar-create-image-project')).toBeVisible(); await expect(page.getByTestId('sidebar-image-projects')).toBeVisible(); await expect(page.getByText('本地开发')).toHaveCount(0); await expect(page.getByTestId('sidebar-reset-local-image-workspace')).toHaveCount(0); await expect(page.getByTestId('sidebar-create-project')).toHaveCount(0); await expect(page.getByTestId('sidebar-module-painting')).toHaveAttribute('aria-current', 'page'); await page.getByTestId('sidebar-module-switcher-trigger').click(); await page.getByTestId('sidebar-module-programming').click(); await expect(page.getByText('请先新建项目')).toHaveCount(0); await expect(page.getByText('一念成光,万物可创。')).toBeVisible(); await expect(page.getByTestId('chat-operation-page')).toHaveCount(0); } finally { await closeElectronApp(app); } }); });