@joeytheman/gemini-mcp-tool 1.3.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +127 -35
- package/dist/__tests__/agyModelSteps.test.d.ts +2 -0
- package/dist/__tests__/agyModelSteps.test.d.ts.map +1 -0
- package/dist/__tests__/agyModelSteps.test.js +58 -0
- package/dist/__tests__/agyModelSteps.test.js.map +1 -0
- package/dist/__tests__/ask-gemini.test.js +99 -37
- package/dist/__tests__/ask-gemini.test.js.map +1 -1
- package/dist/__tests__/capture-script.chromium.test.d.ts +2 -0
- package/dist/__tests__/capture-script.chromium.test.d.ts.map +1 -0
- package/dist/__tests__/capture-script.chromium.test.js +235 -0
- package/dist/__tests__/capture-script.chromium.test.js.map +1 -0
- package/dist/__tests__/layout-snippet.chromium.test.d.ts +2 -0
- package/dist/__tests__/layout-snippet.chromium.test.d.ts.map +1 -0
- package/dist/__tests__/layout-snippet.chromium.test.js +333 -0
- package/dist/__tests__/layout-snippet.chromium.test.js.map +1 -0
- package/dist/__tests__/layout-snippet.test.d.ts +2 -0
- package/dist/__tests__/layout-snippet.test.d.ts.map +1 -0
- package/dist/__tests__/layout-snippet.test.js +12 -0
- package/dist/__tests__/layout-snippet.test.js.map +1 -0
- package/dist/__tests__/live-pass.test.d.ts +2 -0
- package/dist/__tests__/live-pass.test.d.ts.map +1 -0
- package/dist/__tests__/live-pass.test.js +1249 -0
- package/dist/__tests__/live-pass.test.js.map +1 -0
- package/dist/__tests__/screen-review.test.d.ts +2 -0
- package/dist/__tests__/screen-review.test.d.ts.map +1 -0
- package/dist/__tests__/screen-review.test.js +553 -0
- package/dist/__tests__/screen-review.test.js.map +1 -0
- package/dist/__tests__/server-progress.test.d.ts +2 -0
- package/dist/__tests__/server-progress.test.d.ts.map +1 -0
- package/dist/__tests__/server-progress.test.js +63 -0
- package/dist/__tests__/server-progress.test.js.map +1 -0
- package/dist/__tests__/server.test.js +17 -19
- package/dist/__tests__/server.test.js.map +1 -1
- package/dist/__tests__/simple-tools.test.d.ts +2 -0
- package/dist/__tests__/simple-tools.test.d.ts.map +1 -0
- package/dist/__tests__/simple-tools.test.js +30 -0
- package/dist/__tests__/simple-tools.test.js.map +1 -0
- package/dist/__tests__/tools.test.js +91 -0
- package/dist/__tests__/tools.test.js.map +1 -1
- package/dist/__tests__/utils/agyExecutor.test.d.ts +2 -0
- package/dist/__tests__/utils/agyExecutor.test.d.ts.map +1 -0
- package/dist/__tests__/utils/agyExecutor.test.js +731 -0
- package/dist/__tests__/utils/agyExecutor.test.js.map +1 -0
- package/dist/__tests__/utils/agyTranscriptRecovery.test.d.ts +2 -0
- package/dist/__tests__/utils/agyTranscriptRecovery.test.d.ts.map +1 -0
- package/dist/__tests__/utils/agyTranscriptRecovery.test.js +127 -0
- package/dist/__tests__/utils/agyTranscriptRecovery.test.js.map +1 -0
- package/dist/__tests__/utils/chunkCache.test.js +26 -2
- package/dist/__tests__/utils/chunkCache.test.js.map +1 -1
- package/dist/__tests__/utils/commandExecutor.test.js +185 -7
- package/dist/__tests__/utils/commandExecutor.test.js.map +1 -1
- package/dist/__tests__/utils/fileReferences.test.d.ts +2 -0
- package/dist/__tests__/utils/fileReferences.test.d.ts.map +1 -0
- package/dist/__tests__/utils/fileReferences.test.js +87 -0
- package/dist/__tests__/utils/fileReferences.test.js.map +1 -0
- package/dist/__tests__/utils/gitStatusGuard.test.d.ts +2 -0
- package/dist/__tests__/utils/gitStatusGuard.test.d.ts.map +1 -0
- package/dist/__tests__/utils/gitStatusGuard.test.js +106 -0
- package/dist/__tests__/utils/gitStatusGuard.test.js.map +1 -0
- package/dist/__tests__/utils/progressUpdates.test.d.ts +2 -0
- package/dist/__tests__/utils/progressUpdates.test.d.ts.map +1 -0
- package/dist/__tests__/utils/progressUpdates.test.js +62 -0
- package/dist/__tests__/utils/progressUpdates.test.js.map +1 -0
- package/dist/__tests__/utils/responseCache.test.js +31 -11
- package/dist/__tests__/utils/responseCache.test.js.map +1 -1
- package/dist/__tests__/utils/test-helpers.d.ts +4 -0
- package/dist/__tests__/utils/test-helpers.d.ts.map +1 -1
- package/dist/__tests__/utils/test-helpers.js +16 -0
- package/dist/__tests__/utils/test-helpers.js.map +1 -1
- package/dist/constants.d.ts +91 -26
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +101 -28
- package/dist/constants.js.map +1 -1
- package/dist/index.js +20 -95
- package/dist/index.js.map +1 -1
- package/dist/layoutCheckSnippet.generated.d.ts +2 -0
- package/dist/layoutCheckSnippet.generated.d.ts.map +1 -0
- package/dist/layoutCheckSnippet.generated.js +3 -0
- package/dist/layoutCheckSnippet.generated.js.map +1 -0
- package/dist/tools/ask-gemini.tool.d.ts +34 -0
- package/dist/tools/ask-gemini.tool.d.ts.map +1 -1
- package/dist/tools/ask-gemini.tool.js +40 -23
- package/dist/tools/ask-gemini.tool.js.map +1 -1
- package/dist/tools/brainstorm.tool.d.ts.map +1 -1
- package/dist/tools/brainstorm.tool.js +7 -5
- package/dist/tools/brainstorm.tool.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/live-pass.tool.d.ts +206 -0
- package/dist/tools/live-pass.tool.d.ts.map +1 -0
- package/dist/tools/live-pass.tool.js +670 -0
- package/dist/tools/live-pass.tool.js.map +1 -0
- package/dist/tools/registry.d.ts +6 -4
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +14 -11
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/screen-review.tool.d.ts +124 -0
- package/dist/tools/screen-review.tool.d.ts.map +1 -0
- package/dist/tools/screen-review.tool.js +449 -0
- package/dist/tools/screen-review.tool.js.map +1 -0
- package/dist/tools/simple-tools.d.ts.map +1 -1
- package/dist/tools/simple-tools.js +9 -3
- package/dist/tools/simple-tools.js.map +1 -1
- package/dist/utils/agyExecutor.d.ts +76 -0
- package/dist/utils/agyExecutor.d.ts.map +1 -0
- package/dist/utils/agyExecutor.js +449 -0
- package/dist/utils/agyExecutor.js.map +1 -0
- package/dist/utils/agyModelSteps.d.ts +5 -0
- package/dist/utils/agyModelSteps.d.ts.map +1 -0
- package/dist/utils/agyModelSteps.js +33 -0
- package/dist/utils/agyModelSteps.js.map +1 -0
- package/dist/utils/agyReport.d.ts +19 -0
- package/dist/utils/agyReport.d.ts.map +1 -0
- package/dist/utils/agyReport.js +62 -0
- package/dist/utils/agyReport.js.map +1 -0
- package/dist/utils/agyTranscriptRecovery.d.ts +16 -0
- package/dist/utils/agyTranscriptRecovery.d.ts.map +1 -0
- package/dist/utils/agyTranscriptRecovery.js +149 -0
- package/dist/utils/agyTranscriptRecovery.js.map +1 -0
- package/dist/utils/artifactFile.d.ts +6 -0
- package/dist/utils/artifactFile.d.ts.map +1 -0
- package/dist/utils/artifactFile.js +55 -0
- package/dist/utils/artifactFile.js.map +1 -0
- package/dist/utils/captureScript.d.ts +24 -0
- package/dist/utils/captureScript.d.ts.map +1 -0
- package/dist/utils/captureScript.js +83 -0
- package/dist/utils/captureScript.js.map +1 -0
- package/dist/utils/chunkCache.d.ts.map +1 -1
- package/dist/utils/chunkCache.js +19 -5
- package/dist/utils/chunkCache.js.map +1 -1
- package/dist/utils/commandExecutor.d.ts +7 -1
- package/dist/utils/commandExecutor.d.ts.map +1 -1
- package/dist/utils/commandExecutor.js +162 -22
- package/dist/utils/commandExecutor.js.map +1 -1
- package/dist/utils/fileReferences.d.ts +45 -0
- package/dist/utils/fileReferences.d.ts.map +1 -0
- package/dist/utils/fileReferences.js +169 -0
- package/dist/utils/fileReferences.js.map +1 -0
- package/dist/utils/gitCheckout.d.ts +14 -0
- package/dist/utils/gitCheckout.d.ts.map +1 -0
- package/dist/utils/gitCheckout.js +36 -0
- package/dist/utils/gitCheckout.js.map +1 -0
- package/dist/utils/gitStatusGuard.d.ts +35 -0
- package/dist/utils/gitStatusGuard.d.ts.map +1 -0
- package/dist/utils/gitStatusGuard.js +82 -0
- package/dist/utils/gitStatusGuard.js.map +1 -0
- package/dist/utils/layoutCheck.d.ts +58 -0
- package/dist/utils/layoutCheck.d.ts.map +1 -0
- package/dist/utils/layoutCheck.js +84 -0
- package/dist/utils/layoutCheck.js.map +1 -0
- package/dist/utils/logger.d.ts +0 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +0 -6
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/progressUpdates.d.ts +14 -0
- package/dist/utils/progressUpdates.d.ts.map +1 -0
- package/dist/utils/progressUpdates.js +40 -0
- package/dist/utils/progressUpdates.js.map +1 -0
- package/dist/utils/responseCache.d.ts +3 -3
- package/dist/utils/responseCache.d.ts.map +1 -1
- package/dist/utils/responseCache.js +11 -6
- package/dist/utils/responseCache.js.map +1 -1
- package/package.json +19 -16
- package/dist/__tests__/utils/geminiExecutor.test.d.ts +0 -2
- package/dist/__tests__/utils/geminiExecutor.test.d.ts.map +0 -1
- package/dist/__tests__/utils/geminiExecutor.test.js +0 -337
- package/dist/__tests__/utils/geminiExecutor.test.js.map +0 -1
- package/dist/utils/geminiExecutor.d.ts +0 -17
- package/dist/utils/geminiExecutor.d.ts.map +0 -1
- package/dist/utils/geminiExecutor.js +0 -238
- package/dist/utils/geminiExecutor.js.map +0 -1
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import { describe, it, expect, beforeAll, afterAll, afterEach } from 'vitest';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { fileURLToPath, pathToFileURL } from 'url';
|
|
5
|
+
import { chromium } from 'playwright-core';
|
|
6
|
+
import { LAYOUT_CHECK_SNIPPET, LIVE_PASS } from '../constants.js';
|
|
7
|
+
import { readLayoutCheck } from '../utils/layoutCheck.js';
|
|
8
|
+
import { makeTempDir, cleanupTempDirs } from './utils/test-helpers.js';
|
|
9
|
+
const FIXTURES = path.join(path.dirname(fileURLToPath(import.meta.url)), 'fixtures', 'layout');
|
|
10
|
+
const VIEWPORT = { width: 390, height: 844 };
|
|
11
|
+
const CHIP_RECTS = {
|
|
12
|
+
one: { x: 0, y: 0, width: 150, height: 30 },
|
|
13
|
+
two: { x: 150, y: 0, width: 150, height: 30 },
|
|
14
|
+
three: { x: 300, y: 0, width: 150, height: 30 },
|
|
15
|
+
};
|
|
16
|
+
let browser;
|
|
17
|
+
let page;
|
|
18
|
+
beforeAll(async () => {
|
|
19
|
+
browser = await chromium.launch();
|
|
20
|
+
page = await browser.newPage({ viewport: VIEWPORT });
|
|
21
|
+
});
|
|
22
|
+
afterAll(async () => {
|
|
23
|
+
await browser.close();
|
|
24
|
+
});
|
|
25
|
+
afterEach(cleanupTempDirs);
|
|
26
|
+
/**
|
|
27
|
+
* Evaluates our own snippet constant the way @playwright/mcp's browser_evaluate
|
|
28
|
+
* does (eval of the function source, then a call), writes the
|
|
29
|
+
* file it writes for a `filename` (JSON.stringify(result, null, 2)), and reads
|
|
30
|
+
* that file back through the validator the report uses.
|
|
31
|
+
*/
|
|
32
|
+
async function measure(fixture, prepare) {
|
|
33
|
+
await page.goto(pathToFileURL(path.join(FIXTURES, fixture)).href);
|
|
34
|
+
if (prepare)
|
|
35
|
+
await prepare(page);
|
|
36
|
+
const result = await page.evaluate(async (expression) => {
|
|
37
|
+
const value = eval(`(${expression})`);
|
|
38
|
+
return await (typeof value === 'function' ? value() : value);
|
|
39
|
+
}, LAYOUT_CHECK_SNIPPET);
|
|
40
|
+
const artifactDir = makeTempDir('layout-snippet');
|
|
41
|
+
const file = path.join(artifactDir, `frame${LIVE_PASS.LAYOUT_FILE_SUFFIX}`);
|
|
42
|
+
fs.writeFileSync(file, JSON.stringify(result, null, 2) ?? 'undefined', 'utf-8');
|
|
43
|
+
const check = readLayoutCheck(file, artifactDir, Date.now());
|
|
44
|
+
expect(check.status).toBe('OK');
|
|
45
|
+
return check.report;
|
|
46
|
+
}
|
|
47
|
+
describe('LAYOUT_CHECK_SNIPPET in headless Chromium', () => {
|
|
48
|
+
it('reports nothing on a clean page, including a chip past the edge of a horizontal scroller', async () => {
|
|
49
|
+
const report = await measure('clean.html');
|
|
50
|
+
expect(report).toEqual({
|
|
51
|
+
check: LIVE_PASS.LAYOUT_CHECK_ID,
|
|
52
|
+
viewport: VIEWPORT,
|
|
53
|
+
found: 0,
|
|
54
|
+
entries: [],
|
|
55
|
+
clamped: [],
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
it('reports the chip past the edge once its row stops scrolling', async () => {
|
|
59
|
+
const report = await measure('clean.html', async (page) => {
|
|
60
|
+
await page.evaluate(() => { document.querySelector('[data-testid="chips"]').style.overflowX = 'hidden'; });
|
|
61
|
+
});
|
|
62
|
+
expect(report.entries).toEqual([
|
|
63
|
+
{ kind: 'text-clipped', text: 'Chip three', testID: 'chip-three', rect: { x: 300, y: 116, width: 150, height: 30 } },
|
|
64
|
+
{ kind: 'control-offscreen', text: 'Chip three', testID: 'chip-three', rect: { x: 300, y: 116, width: 150, height: 30 } },
|
|
65
|
+
]);
|
|
66
|
+
});
|
|
67
|
+
it('skips editable text, form fields, aria-hidden and inert subtrees, and controls that let taps through', async () => {
|
|
68
|
+
const report = await measure('skipped-elements.html');
|
|
69
|
+
expect(report.entries).toEqual([]);
|
|
70
|
+
expect(report.clamped).toEqual([]);
|
|
71
|
+
});
|
|
72
|
+
it.each([
|
|
73
|
+
['contenteditable', '[data-testid="editable"]', 'contenteditable', [
|
|
74
|
+
{ kind: 'text-clipped', text: 'Editable text that runs past the box', testID: 'editable' },
|
|
75
|
+
]],
|
|
76
|
+
['aria-hidden', '[data-case="aria-hidden"]', 'aria-hidden', [
|
|
77
|
+
{ kind: 'text-clipped', text: 'Hidden text that runs past the box', testID: 'hidden-label' },
|
|
78
|
+
{ kind: 'control-covered', text: 'Hidden', testID: 'hidden-button' },
|
|
79
|
+
]],
|
|
80
|
+
['inert', '[data-case="inert"]', 'inert', [
|
|
81
|
+
{ kind: 'text-clipped', text: 'Inert text that runs past the box', testID: 'inert-label' },
|
|
82
|
+
{ kind: 'control-covered', text: 'Inert', testID: 'inert-button' },
|
|
83
|
+
]],
|
|
84
|
+
])('reports what %s was hiding once it is removed', async (_label, selector, attribute, expected) => {
|
|
85
|
+
const report = await measure('skipped-elements.html', async (page) => {
|
|
86
|
+
await page.evaluate(([sel, attr]) => document.querySelector(sel)?.removeAttribute(attr), [selector, attribute]);
|
|
87
|
+
});
|
|
88
|
+
expect(report.entries.map(({ kind, text, testID }) => ({ kind, text, testID }))).toEqual(expected);
|
|
89
|
+
});
|
|
90
|
+
it('reports the pass-through control as covered once it takes pointer events', async () => {
|
|
91
|
+
const report = await measure('skipped-elements.html', async (page) => {
|
|
92
|
+
await page.evaluate(() => { document.querySelector('[data-testid="passthrough"]').style.pointerEvents = 'auto'; });
|
|
93
|
+
});
|
|
94
|
+
expect(report.entries.map(({ kind, text, testID }) => ({ kind, text, testID }))).toEqual([
|
|
95
|
+
{ kind: 'control-covered', text: 'Passthrough', testID: 'passthrough' },
|
|
96
|
+
]);
|
|
97
|
+
});
|
|
98
|
+
it('reports a span that spills past its row', async () => {
|
|
99
|
+
const report = await measure('overflowing-span.html');
|
|
100
|
+
expect(report.entries).toEqual([
|
|
101
|
+
{ kind: 'text-spill', text: 'Uploaded to the studio wins wall', testID: 'label', rect: { x: 0, y: 0, width: 320, height: 20 } },
|
|
102
|
+
]);
|
|
103
|
+
expect(report.clamped).toEqual([]);
|
|
104
|
+
expect(report.found).toBe(1);
|
|
105
|
+
});
|
|
106
|
+
it('lists line-clamped and ellipsized text as capped on purpose, never as a defect', async () => {
|
|
107
|
+
const report = await measure('clamped-caption.html');
|
|
108
|
+
expect(report.entries).toEqual([]);
|
|
109
|
+
expect(report.found).toBe(0);
|
|
110
|
+
expect(report.clamped).toEqual([
|
|
111
|
+
{
|
|
112
|
+
kind: 'text-clamped',
|
|
113
|
+
text: 'Costume checklist: tights, shoes, hair kit, lashes, rhinestones, garment bag, an',
|
|
114
|
+
testID: 'caption',
|
|
115
|
+
rect: { x: 0, y: 0, width: 200, height: 40 },
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
kind: 'text-clamped',
|
|
119
|
+
text: 'Regional finals at the convention centre',
|
|
120
|
+
testID: 'title',
|
|
121
|
+
rect: { x: 0, y: 40, width: 150, height: 20 },
|
|
122
|
+
},
|
|
123
|
+
]);
|
|
124
|
+
});
|
|
125
|
+
it('reports text an overflow: hidden box cuts off', async () => {
|
|
126
|
+
const report = await measure('overflow-hidden-clip.html');
|
|
127
|
+
expect(report.entries).toEqual([
|
|
128
|
+
{ kind: 'text-clipped', text: 'Junior lyrical small group', testID: 'card-title', rect: { x: 0, y: 0, width: 120, height: 20 } },
|
|
129
|
+
]);
|
|
130
|
+
expect(report.clamped).toEqual([]);
|
|
131
|
+
});
|
|
132
|
+
it('reports the button another button covers, and not the one on top', async () => {
|
|
133
|
+
const report = await measure('overlapping-buttons.html');
|
|
134
|
+
expect(report.entries).toEqual([
|
|
135
|
+
{ kind: 'control-covered', text: 'Save', testID: 'save', rect: { x: 20, y: 20, width: 120, height: 40 } },
|
|
136
|
+
]);
|
|
137
|
+
});
|
|
138
|
+
it('reports a button cut off at the right edge, and its clipped label', async () => {
|
|
139
|
+
const report = await measure('button-past-edge.html');
|
|
140
|
+
expect(report.entries).toEqual([
|
|
141
|
+
{ kind: 'text-clipped', text: 'Next', testID: 'next', rect: { x: 330, y: 0, width: 100, height: 44 } },
|
|
142
|
+
{ kind: 'control-offscreen', text: 'Next', testID: 'next', rect: { x: 330, y: 0, width: 100, height: 44 } },
|
|
143
|
+
]);
|
|
144
|
+
});
|
|
145
|
+
it('reports horizontal page scroll when nothing clips the wide row, with the spilling label and cut-off button', async () => {
|
|
146
|
+
const report = await measure('button-past-edge.html', async (page) => {
|
|
147
|
+
await page.evaluate(() => {
|
|
148
|
+
const frame = document.querySelector('div');
|
|
149
|
+
frame.style.overflow = 'visible';
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
expect(report.entries).toEqual([
|
|
153
|
+
{ kind: 'page-scroll-x', text: 'scrollWidth 500 > innerWidth 390', testID: null, rect: { x: 0, y: 0, width: 500, height: 844 } },
|
|
154
|
+
{ kind: 'text-spill', text: 'Next', testID: 'next', rect: { x: 330, y: 0, width: 100, height: 44 } },
|
|
155
|
+
{ kind: 'control-offscreen', text: 'Next', testID: 'next', rect: { x: 330, y: 0, width: 100, height: 44 } },
|
|
156
|
+
]);
|
|
157
|
+
});
|
|
158
|
+
it('ignores controls under an open aria-modal sheet', async () => {
|
|
159
|
+
const report = await measure('sheet-over-content.html');
|
|
160
|
+
expect(report.entries).toEqual([]);
|
|
161
|
+
});
|
|
162
|
+
it('reports the same covered control once the sheet is not marked aria-modal', async () => {
|
|
163
|
+
const report = await measure('sheet-over-content.html', async (page) => {
|
|
164
|
+
await page.evaluate(() => document.querySelector('[aria-modal]')?.removeAttribute('aria-modal'));
|
|
165
|
+
});
|
|
166
|
+
expect(report.entries).toEqual([
|
|
167
|
+
{ kind: 'control-covered', text: 'Edit', testID: 'edit', rect: { x: 0, y: 0, width: 120, height: 44 } },
|
|
168
|
+
]);
|
|
169
|
+
});
|
|
170
|
+
it('ignores rows scrolled partly or fully out of their scroller, hit-testing only the visible part', async () => {
|
|
171
|
+
const report = await measure('scrolled-rows.html');
|
|
172
|
+
expect(report.entries).toEqual([]);
|
|
173
|
+
});
|
|
174
|
+
it('reports the same rows as covered once their container stops clipping them under the bottom bar', async () => {
|
|
175
|
+
const report = await measure('scrolled-rows.html', async (page) => {
|
|
176
|
+
await page.evaluate(() => { document.querySelector('[data-testid="list"]').style.overflowY = 'visible'; });
|
|
177
|
+
});
|
|
178
|
+
expect(report.entries).toEqual([
|
|
179
|
+
{ kind: 'control-covered', text: 'Second result', testID: 'row-2', rect: { x: 0, y: 370, width: 390, height: 60 } },
|
|
180
|
+
{ kind: 'control-covered', text: 'Third result', testID: 'row-3', rect: { x: 0, y: 430, width: 390, height: 60 } },
|
|
181
|
+
]);
|
|
182
|
+
});
|
|
183
|
+
it('ignores a tab in a horizontal scroller that sits under the row\'s own edge control', async () => {
|
|
184
|
+
const report = await measure('tab-row-more.html');
|
|
185
|
+
expect(report.entries).toEqual([]);
|
|
186
|
+
});
|
|
187
|
+
it('reports that tab as cut off and covered once its row stops scrolling', async () => {
|
|
188
|
+
const report = await measure('tab-row-more.html', async (page) => {
|
|
189
|
+
await page.evaluate(() => { document.querySelector('[data-testid="sections"]').style.overflowX = 'hidden'; });
|
|
190
|
+
});
|
|
191
|
+
expect(report.entries).toEqual([
|
|
192
|
+
{ kind: 'control-offscreen', text: 'Photos', testID: 'tab-photos', rect: { x: 300, y: 0, width: 100, height: 44 } },
|
|
193
|
+
{ kind: 'control-covered', text: 'Photos', testID: 'tab-photos', rect: { x: 300, y: 0, width: 100, height: 44 } },
|
|
194
|
+
]);
|
|
195
|
+
});
|
|
196
|
+
it('reports chips in a horizontal scroller that a fixed toast covers', async () => {
|
|
197
|
+
const report = await measure('toast-over-chips.html');
|
|
198
|
+
expect(report.entries).toEqual([
|
|
199
|
+
{ kind: 'control-covered', text: 'Chip one', testID: 'chip-one', rect: CHIP_RECTS.one },
|
|
200
|
+
{ kind: 'control-covered', text: 'Chip two', testID: 'chip-two', rect: CHIP_RECTS.two },
|
|
201
|
+
{ kind: 'control-covered', text: 'Chip three', testID: 'chip-three', rect: CHIP_RECTS.three },
|
|
202
|
+
]);
|
|
203
|
+
});
|
|
204
|
+
it('still reports the chips when the toast sits beside the scroller in its row but overhangs the row', async () => {
|
|
205
|
+
const report = await measure('toast-over-chips.html', async (page) => {
|
|
206
|
+
await page.evaluate(() => { document.querySelector('main')?.append(document.querySelector('[data-testid="toast"]')); });
|
|
207
|
+
});
|
|
208
|
+
expect(report.entries.map((entry) => [entry.kind, entry.testID])).toEqual([
|
|
209
|
+
['control-covered', 'chip-one'],
|
|
210
|
+
['control-covered', 'chip-two'],
|
|
211
|
+
['control-covered', 'chip-three'],
|
|
212
|
+
]);
|
|
213
|
+
});
|
|
214
|
+
it('reports nothing on the same chip row once the toast is gone', async () => {
|
|
215
|
+
const report = await measure('toast-over-chips.html', async (page) => {
|
|
216
|
+
await page.evaluate(() => document.querySelector('[data-testid="toast"]')?.remove());
|
|
217
|
+
});
|
|
218
|
+
expect(report.entries).toEqual([]);
|
|
219
|
+
});
|
|
220
|
+
it('ignores whitespace hanging past a pre-wrap heading where it wraps', async () => {
|
|
221
|
+
const report = await measure('prewrap-heading.html');
|
|
222
|
+
expect(report.entries).toEqual([]);
|
|
223
|
+
});
|
|
224
|
+
it('reports the heading as spilling once its words stop wrapping', async () => {
|
|
225
|
+
const report = await measure('prewrap-heading.html', async (page) => {
|
|
226
|
+
await page.evaluate(() => { document.querySelector('[data-testid="heading"]').style.whiteSpace = 'pre'; });
|
|
227
|
+
});
|
|
228
|
+
expect(report.entries).toEqual([
|
|
229
|
+
{ kind: 'text-spill', text: 'Regionals results', testID: 'heading', rect: { x: 0, y: 0, width: 120, height: 20 } },
|
|
230
|
+
]);
|
|
231
|
+
});
|
|
232
|
+
it('reports an Expo dev overlay drawn in the shadow root of a zero-size host once, with its full-screen box and text, and keeps it out of every other check', async () => {
|
|
233
|
+
const report = await measure('dev-overlay.html');
|
|
234
|
+
expect(report.entries).toEqual([
|
|
235
|
+
{ kind: 'dev-overlay', text: 'Uncaught Error: something broke in a component Dismiss', testID: null, rect: { x: 0, y: 0, width: 390, height: 844 } },
|
|
236
|
+
]);
|
|
237
|
+
});
|
|
238
|
+
it('reports what the shadow-root overlay covers when its host is not a known dev overlay', async () => {
|
|
239
|
+
const report = await measure('dev-overlay.html', async (page) => {
|
|
240
|
+
await page.evaluate(() => document.getElementById('error-overlay')?.removeAttribute('id'));
|
|
241
|
+
});
|
|
242
|
+
expect(report.entries).toEqual([
|
|
243
|
+
{ kind: 'control-covered', text: 'Sign in', testID: 'sign-in', rect: { x: 0, y: 0, width: 200, height: 44 } },
|
|
244
|
+
]);
|
|
245
|
+
});
|
|
246
|
+
it('reports the full-screen overlay rather than the error toast when both show', async () => {
|
|
247
|
+
const report = await measure('dev-overlay.html', async (page) => {
|
|
248
|
+
await page.evaluate(() => {
|
|
249
|
+
const host = document.createElement('div');
|
|
250
|
+
host.id = 'error-toast';
|
|
251
|
+
host.style.cssText = 'position:fixed;left:0;bottom:0;width:0;height:0';
|
|
252
|
+
document.body.prepend(host);
|
|
253
|
+
host.attachShadow({ mode: 'open' }).innerHTML = '<div style="position:fixed;left:8px;right:8px;bottom:8px;height:48px">1 error</div>';
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
expect(report.entries).toEqual([
|
|
257
|
+
{ kind: 'dev-overlay', text: 'Uncaught Error: something broke in a component Dismiss', testID: null, rect: { x: 0, y: 0, width: 390, height: 844 } },
|
|
258
|
+
]);
|
|
259
|
+
});
|
|
260
|
+
it('reports an Expo error toast drawn in the shadow root of a zero-size host, with the toast\'s box and text, and keeps it out of the covered check', async () => {
|
|
261
|
+
const report = await measure('dev-overlay-zero-root.html');
|
|
262
|
+
expect(report.entries).toEqual([
|
|
263
|
+
{ kind: 'dev-overlay', text: '1 error', testID: null, rect: { x: 8, y: 788, width: 374, height: 48 } },
|
|
264
|
+
]);
|
|
265
|
+
});
|
|
266
|
+
it('reports no dev overlay when the shadow-root toast shows nothing', async () => {
|
|
267
|
+
const report = await measure('dev-overlay-zero-root.html', async (page) => {
|
|
268
|
+
await page.evaluate(() => { (document.getElementById('error-toast')?.shadowRoot?.firstElementChild).style.display = 'none'; });
|
|
269
|
+
});
|
|
270
|
+
expect(report.entries).toEqual([]);
|
|
271
|
+
});
|
|
272
|
+
it('reports what the shadow-root toast covers when its host is not a known dev overlay', async () => {
|
|
273
|
+
const report = await measure('dev-overlay-zero-root.html', async (page) => {
|
|
274
|
+
await page.evaluate(() => document.getElementById('error-toast')?.removeAttribute('id'));
|
|
275
|
+
});
|
|
276
|
+
expect(report.entries).toEqual([
|
|
277
|
+
{ kind: 'control-covered', text: 'Save', testID: 'save', rect: { x: 0, y: 780, width: 200, height: 44 } },
|
|
278
|
+
]);
|
|
279
|
+
});
|
|
280
|
+
it('reports a plain-DOM dev overlay once and keeps it out of every other check', async () => {
|
|
281
|
+
const report = await measure('dev-overlay-plain.html');
|
|
282
|
+
expect(report.entries).toEqual([
|
|
283
|
+
{ kind: 'dev-overlay', text: 'Uncaught Error: something broke in a component Dismiss', testID: null, rect: { x: 0, y: 0, width: 390, height: 844 } },
|
|
284
|
+
]);
|
|
285
|
+
});
|
|
286
|
+
it('reports what the plain-DOM overlay covers and clips when it is not a known dev overlay', async () => {
|
|
287
|
+
const report = await measure('dev-overlay-plain.html', async (page) => {
|
|
288
|
+
await page.evaluate(() => document.getElementById('error-overlay')?.removeAttribute('id'));
|
|
289
|
+
});
|
|
290
|
+
expect(report.entries).toEqual([
|
|
291
|
+
{ kind: 'text-clipped', text: 'Uncaught Error: something broke in a component', testID: null, rect: { x: 0, y: 0, width: 100, height: 20 } },
|
|
292
|
+
{ kind: 'control-covered', text: 'Sign in', testID: 'sign-in', rect: { x: 0, y: 0, width: 200, height: 44 } },
|
|
293
|
+
]);
|
|
294
|
+
});
|
|
295
|
+
it('reports a plain-DOM dev overlay whose root has no size but whose fixed child shows, and keeps it out of the covered check', async () => {
|
|
296
|
+
const report = await measure('dev-overlay-zero-root-plain.html');
|
|
297
|
+
expect(report.entries).toEqual([
|
|
298
|
+
{ kind: 'dev-overlay', text: '1 error', testID: null, rect: { x: 8, y: 788, width: 374, height: 48 } },
|
|
299
|
+
]);
|
|
300
|
+
});
|
|
301
|
+
it('reports no dev overlay when the plain-DOM zero-size root shows nothing', async () => {
|
|
302
|
+
const report = await measure('dev-overlay-zero-root-plain.html', async (page) => {
|
|
303
|
+
await page.evaluate(() => { document.querySelector('[data-testid="toast-body"]').style.display = 'none'; });
|
|
304
|
+
});
|
|
305
|
+
expect(report.entries).toEqual([]);
|
|
306
|
+
});
|
|
307
|
+
it('reports what the plain-DOM zero-size root\'s child covers when it is not a known dev overlay', async () => {
|
|
308
|
+
const report = await measure('dev-overlay-zero-root-plain.html', async (page) => {
|
|
309
|
+
await page.evaluate(() => document.getElementById('error-toast')?.removeAttribute('id'));
|
|
310
|
+
});
|
|
311
|
+
expect(report.entries).toEqual([
|
|
312
|
+
{ kind: 'control-covered', text: 'Save', testID: 'save', rect: { x: 0, y: 780, width: 200, height: 44 } },
|
|
313
|
+
]);
|
|
314
|
+
});
|
|
315
|
+
it('reports a header button overhanging the viewport by 4px as page scroll and a cut-off control', async () => {
|
|
316
|
+
const report = await measure('overhang-header.html');
|
|
317
|
+
expect(report.entries).toEqual([
|
|
318
|
+
{ kind: 'page-scroll-x', text: 'scrollWidth 394 > innerWidth 390', testID: null, rect: { x: 0, y: 0, width: 394, height: 844 } },
|
|
319
|
+
{ kind: 'control-offscreen', text: 'Close', testID: 'header-close', rect: { x: 350, y: 0, width: 44, height: 44 } },
|
|
320
|
+
]);
|
|
321
|
+
});
|
|
322
|
+
it('caps the entries at 50 and counts every one it found', async () => {
|
|
323
|
+
const report = await measure('clean.html', async (page) => {
|
|
324
|
+
await page.evaluate(() => {
|
|
325
|
+
document.body.innerHTML = Array.from({ length: 60 }, (_, index) => `<div style="width:40px;height:12px;overflow:hidden;white-space:nowrap">Clipped label ${index}</div>`).join('');
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
expect(report.found).toBe(60);
|
|
329
|
+
expect(report.entries).toHaveLength(LIVE_PASS.LAYOUT_MAX_ENTRIES);
|
|
330
|
+
expect(report.entries[49].text).toBe('Clipped label 49');
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
//# sourceMappingURL=layout-snippet.chromium.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-snippet.chromium.test.js","sourceRoot":"","sources":["../../src/__tests__/layout-snippet.chromium.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-snippet.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/layout-snippet.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { execFileSync } from 'child_process';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
6
|
+
describe('LAYOUT_CHECK_SNIPPET', () => {
|
|
7
|
+
it('is the current minified build of src/layout-check.snippet.js', () => {
|
|
8
|
+
const run = () => execFileSync('node', ['scripts/minify-layout-snippet.mjs', '--check'], { cwd: ROOT, stdio: 'pipe' });
|
|
9
|
+
expect(run).not.toThrow();
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=layout-snippet.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-snippet.test.js","sourceRoot":"","sources":["../../src/__tests__/layout-snippet.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEpF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,mCAAmC,EAAE,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAEvH,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-pass.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/live-pass.test.ts"],"names":[],"mappings":""}
|