1+ // @vitest -environment node
2+ /**
3+ * 窗口信号层测试(注入式:native 数据由调用方传入,本模块不依赖 electron)
4+ * @ai -context: 覆盖 HWND 解析、native 索引构建、几何信号计算、信号缺失降级。
5+ */
6+ import { describe , it , expect } from 'vitest' ;
7+ import { parseHwndFromSourceId , buildNativeIndex , resolveGeometrySignals } from './windowSignals.js' ;
8+
9+ describe ( 'parseHwndFromSourceId' , ( ) => {
10+ it ( '解析标准 desktopCapturer id' , ( ) => {
11+ expect ( parseHwndFromSourceId ( 'window:123456:0' ) ) . toBe ( '123456' ) ;
12+ } ) ;
13+ it ( '非 window 前缀返回 null' , ( ) => {
14+ expect ( parseHwndFromSourceId ( 'screen:0:0' ) ) . toBeNull ( ) ;
15+ expect ( parseHwndFromSourceId ( '' ) ) . toBeNull ( ) ;
16+ expect ( parseHwndFromSourceId ( null as unknown as string ) ) . toBeNull ( ) ;
17+ } ) ;
18+ it ( '畸形 id 返回 null' , ( ) => {
19+ expect ( parseHwndFromSourceId ( 'window:' ) ) . toBeNull ( ) ;
20+ expect ( parseHwndFromSourceId ( 'window:abc:0' ) ) . toBe ( 'abc' ) ;
21+ } ) ;
22+ } ) ;
23+
24+ describe ( 'buildNativeIndex' , ( ) => {
25+ it ( '按 hwnd 字符串建索引' , ( ) => {
26+ const idx = buildNativeIndex ( [
27+ { hwnd : '111' , processName : 'chrome.exe' , width : 1280 , height : 720 , alwaysOnTop : false } ,
28+ ] ) ;
29+ expect ( idx . get ( '111' ) ?. processName ) . toBe ( 'chrome.exe' ) ;
30+ expect ( idx . size ) . toBe ( 1 ) ;
31+ } ) ;
32+ it ( '空输入返回空 Map' , ( ) => {
33+ expect ( buildNativeIndex ( [ ] ) . size ) . toBe ( 0 ) ;
34+ } ) ;
35+ } ) ;
36+
37+ describe ( 'resolveGeometrySignals' , ( ) => {
38+ it ( '计算宽高比与面积占比' , ( ) => {
39+ const s = resolveGeometrySignals (
40+ { hwnd : '1' , processName : 'chrome.exe' , width : 1280 , height : 720 , alwaysOnTop : true } ,
41+ 1920 * 1080 ,
42+ ) ;
43+ expect ( s . aspectRatio ) . toBeCloseTo ( 16 / 9 , 5 ) ;
44+ expect ( s . areaRatio ) . toBeCloseTo ( 1280 * 720 / ( 1920 * 1080 ) , 5 ) ;
45+ expect ( s . alwaysOnTop ) . toBe ( true ) ;
46+ } ) ;
47+ it ( 'native 缺失(undefined)时返回空信号(降级)' , ( ) => {
48+ expect ( resolveGeometrySignals ( undefined , 1920 * 1080 ) ) . toEqual ( { } ) ;
49+ } ) ;
50+ it ( '显示器面积为 0 时避免除零' , ( ) => {
51+ const s = resolveGeometrySignals (
52+ { hwnd : '1' , processName : 'x.exe' , width : 100 , height : 100 , alwaysOnTop : false } ,
53+ 0 ,
54+ ) ;
55+ expect ( s . areaRatio ) . toBeUndefined ( ) ;
56+ } ) ;
57+ } ) ;
0 commit comments