Skip to main content
Glama
region-capture.property.spec.ts•22 kB
/** * Property-based tests for region capture * Feature: mcp-screenshot, Property 10: Region capture dimension accuracy * Feature: mcp-screenshot, Property 11: Region boundary clipping * Validates: Requirements 3.1, 3.2 */ import * as fc from "fast-check"; import sharp from "sharp"; import { createCaptureEngine } from "./index"; import { BaseCaptureEngine } from "./base-capture-engine"; import { InvalidRegionError } from "./region-validator"; describe("Region Capture Property-Based Tests", () => { let captureEngine: BaseCaptureEngine; beforeAll(() => { captureEngine = createCaptureEngine(); }); /** * Feature: mcp-screenshot, Property 10: Region capture dimension accuracy * For any valid region coordinates and dimensions, when that region is captured, * the output image dimensions should match the requested dimensions * (or clipped dimensions if out of bounds). * Validates: Requirements 3.1 */ describe("Property 10: Region capture dimension accuracy", () => { it("should capture region with dimensions matching requested dimensions when within bounds", async () => { // Get display information to determine valid bounds const displays = await captureEngine.getDisplays(); // Skip test if no displays found if (displays.length === 0) { console.warn( "No displays found - skipping region capture dimension accuracy test" ); return; } const primaryDisplay = displays.find((d) => d.isPrimary) || displays[0]; // Generate valid region coordinates within display bounds await fc.assert( fc.asyncProperty( fc.integer({ min: 0, max: primaryDisplay.resolution.width - 100 }), fc.integer({ min: 0, max: primaryDisplay.resolution.height - 100 }), fc.integer({ min: 50, max: 200 }), fc.integer({ min: 50, max: 200 }), async (x, y, width, height) => { // Ensure region is within bounds const clippedWidth = Math.min( width, primaryDisplay.resolution.width - x ); const clippedHeight = Math.min( height, primaryDisplay.resolution.height - y ); try { // Capture the region const captureBuffer = await captureEngine.captureRegion( x, y, width, height ); // Get the actual dimensions of the captured image const metadata = await sharp(captureBuffer).metadata(); // Verify dimensions match the clipped dimensions expect(metadata.width).toBe(clippedWidth); expect(metadata.height).toBe(clippedHeight); // Verify dimensions are positive expect(metadata.width).toBeGreaterThan(0); expect(metadata.height).toBeGreaterThan(0); } catch (error) { // If capture fails due to missing system tools, skip the test const errorMessage = (error as Error).message; if ( errorMessage.includes("not found") || errorMessage.includes("ENOENT") || errorMessage.includes("command not found") || errorMessage.includes("Empty buffer") ) { console.warn( `Region capture tools not available - skipping test: ${errorMessage}` ); return; } // Re-throw other errors throw error; } } ), { numRuns: 10 } // Run 10 iterations with different random regions ); }, 60000); // 60 second timeout it("should capture region with exact dimensions when completely within bounds", async () => { // Get display information const displays = await captureEngine.getDisplays(); // Skip test if no displays found if (displays.length === 0) { console.warn( "No displays found - skipping region exact dimension test" ); return; } const primaryDisplay = displays.find((d) => d.isPrimary) || displays[0]; // Test with specific regions that are guaranteed to be within bounds const testRegions = [ { x: 0, y: 0, width: 100, height: 100 }, { x: 50, y: 50, width: 150, height: 150 }, { x: 100, y: 100, width: 200, height: 200 }, ]; for (const region of testRegions) { // Skip if region extends beyond display if ( region.x + region.width > primaryDisplay.resolution.width || region.y + region.height > primaryDisplay.resolution.height ) { continue; } try { // Capture the region const captureBuffer = await captureEngine.captureRegion( region.x, region.y, region.width, region.height ); // Get the actual dimensions const metadata = await sharp(captureBuffer).metadata(); // Verify exact dimensions match expect(metadata.width).toBe(region.width); expect(metadata.height).toBe(region.height); } catch (error) { // If capture fails due to missing system tools, skip the test const errorMessage = (error as Error).message; if ( errorMessage.includes("not found") || errorMessage.includes("ENOENT") || errorMessage.includes("command not found") || errorMessage.includes("Empty buffer") ) { console.warn( `Region capture tools not available - skipping test: ${errorMessage}` ); return; } // Re-throw other errors throw error; } } }, 60000); // 60 second timeout it("should reject regions with negative coordinates", async () => { // Test with negative coordinates await expect( captureEngine.captureRegion(-10, 0, 100, 100) ).rejects.toThrow(InvalidRegionError); await expect( captureEngine.captureRegion(0, -10, 100, 100) ).rejects.toThrow(InvalidRegionError); await expect( captureEngine.captureRegion(-10, -10, 100, 100) ).rejects.toThrow(InvalidRegionError); }); it("should reject regions with zero or negative dimensions", async () => { // Test with zero dimensions await expect(captureEngine.captureRegion(0, 0, 0, 100)).rejects.toThrow( InvalidRegionError ); await expect(captureEngine.captureRegion(0, 0, 100, 0)).rejects.toThrow( InvalidRegionError ); await expect(captureEngine.captureRegion(0, 0, 0, 0)).rejects.toThrow( InvalidRegionError ); // Test with negative dimensions await expect( captureEngine.captureRegion(0, 0, -100, 100) ).rejects.toThrow(InvalidRegionError); await expect( captureEngine.captureRegion(0, 0, 100, -100) ).rejects.toThrow(InvalidRegionError); }); it("should maintain dimension accuracy across multiple captures of the same region", async () => { // Get display information const displays = await captureEngine.getDisplays(); // Skip test if no displays found if (displays.length === 0) { console.warn( "No displays found - skipping region capture consistency test" ); return; } const primaryDisplay = displays.find((d) => d.isPrimary) || displays[0]; // Define a test region within bounds const region = { x: 50, y: 50, width: Math.min(200, primaryDisplay.resolution.width - 100), height: Math.min(200, primaryDisplay.resolution.height - 100), }; try { // Capture the same region twice const capture1 = await captureEngine.captureRegion( region.x, region.y, region.width, region.height ); const capture2 = await captureEngine.captureRegion( region.x, region.y, region.width, region.height ); // Get dimensions of both captures const metadata1 = await sharp(capture1).metadata(); const metadata2 = await sharp(capture2).metadata(); // Verify dimensions are consistent expect(metadata1.width).toBe(metadata2.width); expect(metadata1.height).toBe(metadata2.height); // Verify dimensions match requested dimensions expect(metadata1.width).toBe(region.width); expect(metadata1.height).toBe(region.height); } catch (error) { // If capture fails due to missing system tools, skip the test const errorMessage = (error as Error).message; if ( errorMessage.includes("not found") || errorMessage.includes("ENOENT") || errorMessage.includes("command not found") || errorMessage.includes("Empty buffer") ) { console.warn( `Region capture tools not available - skipping test: ${errorMessage}` ); return; } // Re-throw other errors throw error; } }, 60000); // 60 second timeout }); /** * Feature: mcp-screenshot, Property 11: Region boundary clipping * For any region that extends beyond screen boundaries, * the captured image should only include the visible portion * and report actual dimensions. * Validates: Requirements 3.2 */ describe("Property 11: Region boundary clipping", () => { it("should clip region to visible portion when extending beyond screen boundaries", async () => { // Get display information const displays = await captureEngine.getDisplays(); // Skip test if no displays found if (displays.length === 0) { console.warn( "No displays found - skipping region boundary clipping test" ); return; } const primaryDisplay = displays.find((d) => d.isPrimary) || displays[0]; // Generate regions that extend beyond screen boundaries await fc.assert( fc.asyncProperty( fc.integer({ min: primaryDisplay.resolution.width - 100, max: primaryDisplay.resolution.width + 100, }), fc.integer({ min: primaryDisplay.resolution.height - 100, max: primaryDisplay.resolution.height + 100, }), fc.integer({ min: 100, max: 300 }), fc.integer({ min: 100, max: 300 }), async (x, y, width, height) => { // Calculate expected clipped dimensions const maxX = primaryDisplay.resolution.width; const maxY = primaryDisplay.resolution.height; const clippedX = Math.max(0, Math.min(x, maxX)); const clippedY = Math.max(0, Math.min(y, maxY)); const clippedWidth = Math.max( 0, Math.min(x + width, maxX) - clippedX ); const clippedHeight = Math.max( 0, Math.min(y + height, maxY) - clippedY ); // Skip if region is completely outside bounds if (clippedWidth === 0 || clippedHeight === 0) { await expect( captureEngine.captureRegion(x, y, width, height) ).rejects.toThrow(InvalidRegionError); return; } try { // Capture the region const captureBuffer = await captureEngine.captureRegion( x, y, width, height ); // Get the actual dimensions const metadata = await sharp(captureBuffer).metadata(); // Verify dimensions match the clipped dimensions expect(metadata.width).toBe(clippedWidth); expect(metadata.height).toBe(clippedHeight); // Verify dimensions are within display bounds expect(metadata.width).toBeLessThanOrEqual( primaryDisplay.resolution.width ); expect(metadata.height).toBeLessThanOrEqual( primaryDisplay.resolution.height ); // Verify dimensions are positive expect(metadata.width).toBeGreaterThan(0); expect(metadata.height).toBeGreaterThan(0); } catch (error) { // If capture fails due to missing system tools, skip the test const errorMessage = (error as Error).message; if ( errorMessage.includes("not found") || errorMessage.includes("ENOENT") || errorMessage.includes("command not found") || errorMessage.includes("Empty buffer") ) { console.warn( `Region capture tools not available - skipping test: ${errorMessage}` ); return; } // Re-throw other errors throw error; } } ), { numRuns: 10 } // Run 10 iterations with different random regions ); }, 90000); // 90 second timeout it("should reject regions completely outside display boundaries", async () => { // Get display information const displays = await captureEngine.getDisplays(); // Skip test if no displays found if (displays.length === 0) { console.warn("No displays found - skipping region outside bounds test"); return; } const primaryDisplay = displays.find((d) => d.isPrimary) || displays[0]; // Test regions completely outside bounds const outsideRegions = [ { x: primaryDisplay.resolution.width + 100, y: 0, width: 100, height: 100, }, { x: 0, y: primaryDisplay.resolution.height + 100, width: 100, height: 100, }, { x: primaryDisplay.resolution.width + 100, y: primaryDisplay.resolution.height + 100, width: 100, height: 100, }, ]; for (const region of outsideRegions) { await expect( captureEngine.captureRegion( region.x, region.y, region.width, region.height ) ).rejects.toThrow(InvalidRegionError); } }); it("should clip region extending beyond right edge of display", async () => { // Get display information const displays = await captureEngine.getDisplays(); // Skip test if no displays found if (displays.length === 0) { console.warn("No displays found - skipping right edge clipping test"); return; } const primaryDisplay = displays.find((d) => d.isPrimary) || displays[0]; // Create a region that extends beyond the right edge const x = primaryDisplay.resolution.width - 50; const y = 50; const width = 100; // Extends 50 pixels beyond right edge const height = 100; const expectedWidth = 50; // Should be clipped to 50 pixels try { // Capture the region const captureBuffer = await captureEngine.captureRegion( x, y, width, height ); // Get the actual dimensions const metadata = await sharp(captureBuffer).metadata(); // Verify width was clipped expect(metadata.width).toBe(expectedWidth); expect(metadata.height).toBe(height); } catch (error) { // If capture fails due to missing system tools, skip the test const errorMessage = (error as Error).message; if ( errorMessage.includes("not found") || errorMessage.includes("ENOENT") || errorMessage.includes("command not found") || errorMessage.includes("Empty buffer") ) { console.warn( `Region capture tools not available - skipping test: ${errorMessage}` ); return; } // Re-throw other errors throw error; } }, 60000); // 60 second timeout it("should clip region extending beyond bottom edge of display", async () => { // Get display information const displays = await captureEngine.getDisplays(); // Skip test if no displays found if (displays.length === 0) { console.warn("No displays found - skipping bottom edge clipping test"); return; } const primaryDisplay = displays.find((d) => d.isPrimary) || displays[0]; // Create a region that extends beyond the bottom edge const x = 50; const y = primaryDisplay.resolution.height - 50; const width = 100; const height = 100; // Extends 50 pixels beyond bottom edge const expectedHeight = 50; // Should be clipped to 50 pixels try { // Capture the region const captureBuffer = await captureEngine.captureRegion( x, y, width, height ); // Get the actual dimensions const metadata = await sharp(captureBuffer).metadata(); // Verify height was clipped expect(metadata.width).toBe(width); expect(metadata.height).toBe(expectedHeight); } catch (error) { // If capture fails due to missing system tools, skip the test const errorMessage = (error as Error).message; if ( errorMessage.includes("not found") || errorMessage.includes("ENOENT") || errorMessage.includes("command not found") || errorMessage.includes("Empty buffer") ) { console.warn( `Region capture tools not available - skipping test: ${errorMessage}` ); return; } // Re-throw other errors throw error; } }, 60000); // 60 second timeout it("should clip region extending beyond both right and bottom edges", async () => { // Get display information const displays = await captureEngine.getDisplays(); // Skip test if no displays found if (displays.length === 0) { console.warn("No displays found - skipping corner clipping test"); return; } const primaryDisplay = displays.find((d) => d.isPrimary) || displays[0]; // Create a region that extends beyond both right and bottom edges const x = primaryDisplay.resolution.width - 50; const y = primaryDisplay.resolution.height - 50; const width = 100; // Extends 50 pixels beyond right edge const height = 100; // Extends 50 pixels beyond bottom edge const expectedWidth = 50; // Should be clipped to 50 pixels const expectedHeight = 50; // Should be clipped to 50 pixels try { // Capture the region const captureBuffer = await captureEngine.captureRegion( x, y, width, height ); // Get the actual dimensions const metadata = await sharp(captureBuffer).metadata(); // Verify both dimensions were clipped expect(metadata.width).toBe(expectedWidth); expect(metadata.height).toBe(expectedHeight); } catch (error) { // If capture fails due to missing system tools, skip the test const errorMessage = (error as Error).message; if ( errorMessage.includes("not found") || errorMessage.includes("ENOENT") || errorMessage.includes("command not found") || errorMessage.includes("Empty buffer") ) { console.warn( `Region capture tools not available - skipping test: ${errorMessage}` ); return; } // Re-throw other errors throw error; } }, 60000); // 60 second timeout it("should handle multi-monitor coordinate systems correctly", async () => { // Get display information const displays = await captureEngine.getDisplays(); // Skip test if less than 2 displays if (displays.length < 2) { console.warn( "Less than 2 displays found - skipping multi-monitor test" ); return; } // Find a display that's not at position (0, 0) const secondaryDisplay = displays.find( (d) => d.position.x !== 0 || d.position.y !== 0 ); if (!secondaryDisplay) { console.warn( "No secondary display with offset position - skipping multi-monitor test" ); return; } // Create a region on the secondary display const x = secondaryDisplay.position.x + 50; const y = secondaryDisplay.position.y + 50; const width = 100; const height = 100; try { // Capture the region const captureBuffer = await captureEngine.captureRegion( x, y, width, height ); // Get the actual dimensions const metadata = await sharp(captureBuffer).metadata(); // Verify dimensions match requested dimensions expect(metadata.width).toBe(width); expect(metadata.height).toBe(height); } catch (error) { // If capture fails due to missing system tools, skip the test const errorMessage = (error as Error).message; if ( errorMessage.includes("not found") || errorMessage.includes("ENOENT") || errorMessage.includes("command not found") || errorMessage.includes("Empty buffer") ) { console.warn( `Region capture tools not available - skipping test: ${errorMessage}` ); return; } // Re-throw other errors throw error; } }, 60000); // 60 second timeout }); });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Digital-Defiance/mcp-screenshot'

If you have feedback or need assistance with the MCP directory API, please join our Discord server