@@ -275,6 +275,125 @@ describe('mergeMessage', () => {
275275 ) ;
276276 expect ( deprecatedOptions ) . toHaveLength ( 1 ) ;
277277 } ) ;
278+
279+ it ( 'should keep fields with tooling_skip option without deprecating' , ( ) => {
280+ const source : ProtoMessage = {
281+ name : 'TestMessage' ,
282+ fields : [ {
283+ name : 'skip_field' ,
284+ type : 'string' ,
285+ number : 1 ,
286+ annotations : [ { name : '(tooling_skip)' , value : 'true' } ]
287+ } , {
288+ name : 'normal_field' ,
289+ type : 'string' ,
290+ number : 2
291+ } ]
292+ } ;
293+ const upcoming : ProtoMessage = {
294+ name : 'TestMessage' ,
295+ fields : [ {
296+ name : 'normal_field' ,
297+ type : 'string' ,
298+ number : 2
299+ } ]
300+ } ;
301+
302+ const result = mergeMessage ( source , upcoming ) ;
303+
304+ // skip_field should remain without deprecated annotation added
305+ expect ( result . fields ) . toHaveLength ( 2 ) ;
306+ const skipField = result . fields . find ( f => f . name === 'skip_field' ) ;
307+ expect ( skipField ) . toBeDefined ( ) ;
308+ // Should only have tooling_skip, not deprecated
309+ expect ( skipField ! . annotations ) . not . toContainEqual ( { name : 'deprecated' , value : 'true' } ) ;
310+ } ) ;
311+
312+ it ( 'should not report tooling_skip fields as deprecated' , ( ) => {
313+ const source : ProtoMessage = {
314+ name : 'TestMessage' ,
315+ fields : [ {
316+ name : 'skip_field' ,
317+ type : 'string' ,
318+ number : 1 ,
319+ annotations : [ { name : '(tooling_skip)' , value : 'true' } ]
320+ } ]
321+ } ;
322+ const upcoming : ProtoMessage = {
323+ name : 'TestMessage' ,
324+ fields : [ ]
325+ } ;
326+
327+ const reporter = new CompatibilityReporter ( ) ;
328+ mergeMessage ( source , upcoming , reporter ) ;
329+
330+ const markdown = reporter . toMarkdown ( ) ;
331+ // Should not report deprecation for tooling_skip fields
332+ expect ( markdown ) . toContain ( 'No changes detected' ) ;
333+ } ) ;
334+
335+ it ( 'should keep tooling_skip field if it exists in upcoming' , ( ) => {
336+ const source : ProtoMessage = {
337+ name : 'TestMessage' ,
338+ fields : [ {
339+ name : 'field_name' ,
340+ type : 'string' ,
341+ number : 1 ,
342+ annotations : [ { name : '(tooling_skip)' , value : 'true' } ]
343+ } ]
344+ } ;
345+ const upcoming : ProtoMessage = {
346+ name : 'TestMessage' ,
347+ fields : [ {
348+ name : 'field_name' ,
349+ type : 'string' ,
350+ number : 1
351+ } ]
352+ } ;
353+
354+ const result = mergeMessage ( source , upcoming ) ;
355+
356+ expect ( result . fields ) . toHaveLength ( 1 ) ;
357+ expect ( result . fields [ 0 ] . name ) . toBe ( 'field_name' ) ;
358+ } ) ;
359+
360+ it ( 'should assign new field number after max including tooling_skip field' , ( ) => {
361+ const source : ProtoMessage = {
362+ name : 'TestMessage' ,
363+ fields : [ {
364+ name : 'existing_field' ,
365+ type : 'string' ,
366+ number : 1
367+ } , {
368+ name : 'skip_field' ,
369+ type : 'string' ,
370+ number : 5 , // This is the max field number
371+ annotations : [ { name : '(tooling_skip)' , value : 'true' } ]
372+ } ]
373+ } ;
374+ const upcoming : ProtoMessage = {
375+ name : 'TestMessage' ,
376+ fields : [ {
377+ name : 'existing_field' ,
378+ type : 'string' ,
379+ number : 1
380+ } , {
381+ name : 'new_field' ,
382+ type : 'int32' ,
383+ number : 99 // This will be reassigned
384+ } ]
385+ } ;
386+
387+ const result = mergeMessage ( source , upcoming ) ;
388+
389+ // skip_field is kept, new_field is added
390+ expect ( result . fields ) . toHaveLength ( 3 ) ;
391+ expect ( result . fields . find ( f => f . name === 'skip_field' ) ) . toBeDefined ( ) ;
392+
393+ const newField = result . fields . find ( f => f . name === 'new_field' ) ;
394+ expect ( newField ) . toBeDefined ( ) ;
395+ expect ( newField ! . number ) . toBe ( 6 ) ;
396+ } ) ;
278397 } ) ;
279398
280399 describe ( 'new fields' , ( ) => {
@@ -884,6 +1003,7 @@ describe('mergeEnum', () => {
8841003 const markdown = reporter . toMarkdown ( ) ;
8851004 expect ( markdown ) . toContain ( 'No changes detected' ) ;
8861005 } ) ;
1006+
8871007 } ) ;
8881008
8891009 describe ( 'new values' , ( ) => {
0 commit comments