@@ -106,4 +106,80 @@ describe('cardCellEditGuard', () => {
106106 null ,
107107 ) ;
108108 } ) ;
109+
110+ it ( 'multi-key type stays in same field (A then Ap append)' , ( ) => {
111+ let line = buildLine ( '1' , '12345' , '67890' ) ;
112+ let document = fakeDoc ( [ '*NODE' , line ] ) ;
113+ const guard = createCardCellEditGuard ( {
114+ getCardFieldsForLine : ( ) => CARD3 ,
115+ isLsdynaDocument : ( ) => true ,
116+ isKeywordLineText : ( t ) => / ^ \s * \* / . test ( t ) ,
117+ isProtectEnabled : ( ) => true ,
118+ } ) ;
119+ guard . markA ( document , 1 , 1 , true ) ;
120+
121+ // First key: full-cell write
122+ let plan = guard . planType (
123+ document ,
124+ { start : { line : 1 , character : 11 } , end : { line : 1 , character : 20 } , isEmpty : false } ,
125+ '1' ,
126+ ) ;
127+ assert . ok ( plan ) ;
128+ assert . strictEqual ( readCellValue ( plan . newText , CARD3 , 1 ) , '1' ) ;
129+ assert . strictEqual ( plan . fieldIndex , 1 ) ;
130+ line = plan . newText ;
131+ document = fakeDoc ( [ '*NODE' , line ] ) ;
132+ document . version = 2 ;
133+ guard . markAp ( document , 1 , plan . fieldIndex ) ;
134+
135+ // Caret after value must remain owned by field 1
136+ let caret = plan . caret ;
137+ assert . ok ( caret >= 10 && caret < 20 , `caret ${ caret } ` ) ;
138+
139+ // Simulate selection change after edit (Ap must not clear on right-edge caret)
140+ guard . onSelectionChange ( {
141+ document,
142+ selection : {
143+ start : { line : 1 , character : caret } ,
144+ end : { line : 1 , character : caret } ,
145+ isEmpty : true ,
146+ } ,
147+ selections : [ { start : { line : 1 , character : caret } , end : { line : 1 , character : caret } , isEmpty : true } ] ,
148+ } ) ;
149+ assert . ok ( guard . getNav ( ) , 'Ap nav must survive selection change at value end' ) ;
150+ assert . strictEqual ( guard . getNav ( ) . mode , 'Ap' ) ;
151+ assert . strictEqual ( guard . getNav ( ) . fieldIndex , 1 ) ;
152+
153+ // Second / third keys: append in same field
154+ for ( const ch of [ '2' , '3' ] ) {
155+ plan = guard . planType (
156+ document ,
157+ {
158+ start : { line : 1 , character : caret } ,
159+ end : { line : 1 , character : caret } ,
160+ isEmpty : true ,
161+ } ,
162+ ch ,
163+ ) ;
164+ assert . ok ( plan , `planType for '${ ch } '` ) ;
165+ assert . strictEqual ( plan . fieldIndex , 1 ) ;
166+ line = plan . newText ;
167+ caret = plan . caret ;
168+ document = fakeDoc ( [ '*NODE' , line ] ) ;
169+ document . version = ( document . version || 2 ) + 1 ;
170+ guard . markAp ( document , 1 , plan . fieldIndex ) ;
171+ guard . onSelectionChange ( {
172+ document,
173+ selection : {
174+ start : { line : 1 , character : caret } ,
175+ end : { line : 1 , character : caret } ,
176+ isEmpty : true ,
177+ } ,
178+ selections : [ { start : { line : 1 , character : caret } , end : { line : 1 , character : caret } , isEmpty : true } ] ,
179+ } ) ;
180+ }
181+ assert . strictEqual ( readCellValue ( line , CARD3 , 1 ) , '123' ) ;
182+ assert . strictEqual ( readCellValue ( line , CARD3 , 2 ) , '67890' ) ;
183+ assert . strictEqual ( guard . getNav ( ) . fieldIndex , 1 ) ;
184+ } ) ;
109185} ) ;
0 commit comments