@@ -47,14 +47,123 @@ test('perf prints compact platform-independent frame health summary by default',
4747 assert . doesNotMatch ( result . stdout , / a n d r o i d | P i x e l | m e m o r y | c p u | g f x i n f o / i) ;
4848} ) ;
4949
50+ test ( 'perf metrics forwards explicit metrics area to daemon' , async ( ) => {
51+ const result = await runCliCapture ( [ 'perf' , 'metrics' , '--json' ] , async ( ) => ( {
52+ ok : true ,
53+ data : {
54+ metrics : {
55+ fps : {
56+ available : false ,
57+ reason : 'No frame data.' ,
58+ } ,
59+ } ,
60+ } ,
61+ } ) ) ;
62+
63+ assert . equal ( result . code , null ) ;
64+ assert . equal ( result . calls [ 0 ] ?. command , 'perf' ) ;
65+ assert . deepEqual ( result . calls [ 0 ] ?. positionals , [ 'metrics' ] ) ;
66+ } ) ;
67+
68+ test ( 'perf frames forwards frames area and prints focused frame summary' , async ( ) => {
69+ const result = await runCliCapture ( [ 'perf' , 'frames' ] , async ( ) => ( {
70+ ok : true ,
71+ data : {
72+ metrics : {
73+ fps : {
74+ available : true ,
75+ droppedFramePercent : 3.1 ,
76+ droppedFrameCount : 12 ,
77+ totalFrameCount : 390 ,
78+ sampleWindowMs : 12_000 ,
79+ worstWindows : [ ] ,
80+ } ,
81+ } ,
82+ } ,
83+ } ) ) ;
84+
85+ assert . equal ( result . code , null ) ;
86+ assert . equal ( result . calls [ 0 ] ?. command , 'perf' ) ;
87+ assert . deepEqual ( result . calls [ 0 ] ?. positionals , [ 'frames' ] ) ;
88+ assert . equal ( result . stdout , 'Frame health: dropped 3.1% (12/390 frames) window 12s\n' ) ;
89+ } ) ;
90+
91+ test ( 'perf frames sample forwards explicit sample action to daemon' , async ( ) => {
92+ const result = await runCliCapture ( [ 'perf' , 'frames' , 'sample' , '--json' ] , async ( ) => ( {
93+ ok : true ,
94+ data : {
95+ metrics : {
96+ fps : {
97+ available : false ,
98+ reason : 'No frame data.' ,
99+ } ,
100+ } ,
101+ } ,
102+ } ) ) ;
103+
104+ assert . equal ( result . code , null ) ;
105+ assert . equal ( result . calls [ 0 ] ?. command , 'perf' ) ;
106+ assert . deepEqual ( result . calls [ 0 ] ?. positionals , [ 'frames' , 'sample' ] ) ;
107+ } ) ;
108+
109+ test ( 'perf sample defaults to metrics sample' , async ( ) => {
110+ const result = await runCliCapture ( [ 'perf' , 'sample' , '--json' ] , async ( ) => ( {
111+ ok : true ,
112+ data : {
113+ metrics : {
114+ fps : {
115+ available : false ,
116+ reason : 'No frame data.' ,
117+ } ,
118+ } ,
119+ } ,
120+ } ) ) ;
121+
122+ assert . equal ( result . code , null ) ;
123+ assert . equal ( result . calls [ 0 ] ?. command , 'perf' ) ;
124+ assert . deepEqual ( result . calls [ 0 ] ?. positionals , [ 'metrics' , 'sample' ] ) ;
125+ } ) ;
126+
127+ test ( 'perf area and action positionals are case-insensitive' , async ( ) => {
128+ const result = await runCliCapture ( [ 'perf' , 'FRAMES' , 'SAMPLE' , '--json' ] , async ( ) => ( {
129+ ok : true ,
130+ data : {
131+ metrics : {
132+ fps : {
133+ available : false ,
134+ reason : 'No frame data.' ,
135+ } ,
136+ } ,
137+ } ,
138+ } ) ) ;
139+
140+ assert . equal ( result . code , null ) ;
141+ assert . equal ( result . calls [ 0 ] ?. command , 'perf' ) ;
142+ assert . deepEqual ( result . calls [ 0 ] ?. positionals , [ 'frames' , 'sample' ] ) ;
143+ } ) ;
144+
145+ test ( 'perf rejects unknown CLI area before daemon dispatch' , async ( ) => {
146+ const result = await runCliCapture ( [ 'perf' , 'cpu' , '--json' ] , async ( ) => ( {
147+ ok : true ,
148+ data : { } ,
149+ } ) ) ;
150+
151+ assert . equal ( result . code , 1 ) ;
152+ assert . equal ( result . calls . length , 0 ) ;
153+ const payload = JSON . parse ( result . stdout ) ;
154+ assert . equal ( payload . error . code , 'INVALID_ARGS' ) ;
155+ assert . match ( payload . error . message , / p e r f a r e a m u s t b e m e t r i c s o r f r a m e s / i) ;
156+ } ) ;
157+
50158test ( 'perf prints unavailable frame health reason by default' , async ( ) => {
51159 const result = await runCliCapture ( [ 'perf' ] , async ( ) => ( {
52160 ok : true ,
53161 data : {
54162 metrics : {
55163 fps : {
56164 available : false ,
57- reason : 'Dropped-frame sampling is currently available only on Android.' ,
165+ reason :
166+ 'Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions.' ,
58167 } ,
59168 } ,
60169 } ,
@@ -63,7 +172,7 @@ test('perf prints unavailable frame health reason by default', async () => {
63172 assert . equal ( result . code , null ) ;
64173 assert . equal (
65174 result . stdout ,
66- 'Frame health: unavailable - Dropped-frame sampling is currently available only on Android.\n' ,
175+ 'Frame health: unavailable - Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions .\n' ,
67176 ) ;
68177} ) ;
69178
@@ -74,7 +183,8 @@ test('perf prints compact CPU and memory summary when frame health is unavailabl
74183 metrics : {
75184 fps : {
76185 available : false ,
77- reason : 'Dropped-frame sampling is currently available only on Android.' ,
186+ reason :
187+ 'Dropped-frame sampling is currently available only on Android app sessions and connected iOS device app sessions.' ,
78188 } ,
79189 memory : {
80190 available : true ,
0 commit comments