|
1 | 1 | // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. |
2 | 2 | // SPDX-License-Identifier: Apache-2.0 |
| 3 | +import { Rect } from '../../../lib/components/popover/interfaces'; |
3 | 4 | import { |
4 | 5 | calculatePosition, |
| 6 | + clampRect, |
5 | 7 | intersectRectangles, |
6 | 8 | isCenterOutside, |
7 | 9 | PRIORITY_MAPPING, |
@@ -280,3 +282,56 @@ describe('isCenterOutside', () => { |
280 | 282 | ).toBe(false); |
281 | 283 | }); |
282 | 284 | }); |
| 285 | + |
| 286 | +describe('clampRect', () => { |
| 287 | + const parent = { insetInlineStart: 100, insetBlockStart: 100, inlineSize: 400, blockSize: 300 }; |
| 288 | + function rect(insetInlineStart: number, insetBlockStart: number, inlineSize: number, blockSize: number): Rect { |
| 289 | + return { |
| 290 | + insetInlineStart, |
| 291 | + insetBlockStart, |
| 292 | + inlineSize, |
| 293 | + blockSize, |
| 294 | + insetInlineEnd: insetInlineStart + inlineSize, |
| 295 | + insetBlockEnd: insetBlockStart + blockSize, |
| 296 | + }; |
| 297 | + } |
| 298 | + |
| 299 | + test('returns rect unchanged when bounds is not provided', () => { |
| 300 | + const testRect = rect(150, 200, 100, 80); |
| 301 | + expect(clampRect(testRect)).toEqual(testRect); |
| 302 | + }); |
| 303 | + |
| 304 | + test('returns rect unchanged when fully inside parent', () => { |
| 305 | + expect(clampRect(rect(200, 200, 50, 50), parent)).toEqual(rect(200, 200, 50, 50)); |
| 306 | + }); |
| 307 | + |
| 308 | + test('clamps start to parent start when rect is before parent', () => { |
| 309 | + const result = clampRect(rect(50, 30, 20, 20), parent); |
| 310 | + expect(result.insetInlineStart).toBe(100); |
| 311 | + expect(result.insetBlockStart).toBe(100); |
| 312 | + }); |
| 313 | + |
| 314 | + test('clamps start to parent end when rect is past parent', () => { |
| 315 | + const result = clampRect(rect(600, 500, 20, 20), parent); |
| 316 | + expect(result.insetInlineStart).toBe(500); |
| 317 | + expect(result.insetBlockStart).toBe(400); |
| 318 | + }); |
| 319 | + |
| 320 | + test('clamps size when rect would overflow parent end', () => { |
| 321 | + const result = clampRect(rect(400, 350, 200, 100), parent); |
| 322 | + expect(result.inlineSize).toBe(100); |
| 323 | + expect(result.blockSize).toBe(50); |
| 324 | + }); |
| 325 | + |
| 326 | + test('reduces size to zero when start is clamped to parent end', () => { |
| 327 | + const result = clampRect(rect(600, 500, 50, 50), parent); |
| 328 | + expect(result.inlineSize).toBe(0); |
| 329 | + expect(result.blockSize).toBe(0); |
| 330 | + }); |
| 331 | + |
| 332 | + test('computes insetInlineEnd and insetBlockEnd correctly', () => { |
| 333 | + const result = clampRect(rect(150, 200, 100, 80), parent); |
| 334 | + expect(result.insetInlineEnd).toBe(250); |
| 335 | + expect(result.insetBlockEnd).toBe(280); |
| 336 | + }); |
| 337 | +}); |
0 commit comments