@@ -29,12 +29,6 @@ struct CellInteractionResolverReadOnlyTests {
2929 #expect( resolver. resolve ( context) == . viewInline( value: " hello " ) )
3030 }
3131
32- @Test ( " read-only single-line text returns viewInline " )
33- func readOnlySingleLineReturnsViewInline( ) {
34- let context = ContextFactory . make ( value: " A " , isTableEditable: false )
35- #expect( resolver. resolve ( context) == . viewInline( value: " A " ) )
36- }
37-
3832 @Test ( " read-only nil value returns viewInline with NULL placeholder " )
3933 func readOnlyNilValueReturnsViewInlineWithNull( ) {
4034 let context = ContextFactory . make ( value: nil , isTableEditable: false )
@@ -47,55 +41,32 @@ struct CellInteractionResolverReadOnlyTests {
4741 #expect( resolver. resolve ( context) == . viewInline( value: " line1 \n line2 " ) )
4842 }
4943
50- @Test ( " read-only JSON column returns viewJson " )
51- func readOnlyJsonColumnReturnsViewJson( ) {
52- let context = ContextFactory . make ( value: #"{"k":1}"# , columnType: . json( rawType: " JSON " ) , isTableEditable: false )
53- #expect( resolver. resolve ( context) == . viewJson)
54- }
55-
5644 @Test ( " read-only BLOB column returns viewBlob " )
5745 func readOnlyBlobColumnReturnsViewBlob( ) {
5846 let context = ContextFactory . make ( value: nil , columnType: . blob( rawType: " BLOB " ) , isTableEditable: false )
5947 #expect( resolver. resolve ( context) == . viewBlob)
6048 }
6149
62- @Test ( " immutable column on editable table follows read-only path for plain text " )
50+ @Test ( " read-only JSON column shows its value inline; the chevron opens the JSON viewer " )
51+ func readOnlyJsonColumnShowsInline( ) {
52+ let context = ContextFactory . make ( value: #"{"k":1}"# , columnType: . json( rawType: " JSON " ) , isTableEditable: false )
53+ #expect( resolver. resolve ( context) == . viewInline( value: #"{"k":1}"# ) )
54+ }
55+
56+ @Test ( " immutable column on editable table follows the read-only inline path " )
6357 func immutableColumnFollowsReadOnlyPath( ) {
6458 let context = ContextFactory . make ( value: " id-123 " , isTableEditable: true , isImmutableColumn: true )
6559 #expect( resolver. resolve ( context) == . viewInline( value: " id-123 " ) )
6660 }
6761
68- @Test ( " immutable JSON column on editable table still returns viewJson " )
69- func immutableJsonColumnReturnsViewJson( ) {
70- let context = ContextFactory . make ( value: " {} " , columnType: . json( rawType: " JSON " ) , isTableEditable: true , isImmutableColumn: true )
71- #expect( resolver. resolve ( context) == . viewJson)
72- }
73-
74- @Test ( " read-only JSON-looking plain text without columnType returns viewJson via detector " )
75- func readOnlyJsonLikeTextWithoutTypeReturnsViewJson( ) {
62+ @Test ( " JSON-looking text is not content-routed; it shows inline " )
63+ func jsonLikeTextShowsInline( ) {
7664 let context = ContextFactory . make ( value: #"{"k":1}"# , columnType: nil , isTableEditable: false )
77- #expect( resolver. resolve ( context) == . viewJson)
78- }
79-
80- @Test ( " read-only PHP-shaped plain text returns viewPhpSerialized " )
81- func readOnlyPhpLikeTextReturnsViewPhpSerialized( ) {
82- let context = ContextFactory . make ( value: " a:0:{} " , columnType: . text( rawType: " TEXT " ) , isTableEditable: false )
83- #expect( resolver. resolve ( context) == . viewPhpSerialized)
84- }
85-
86- @Test ( " read-only override .raw beats content sniffing " )
87- func readOnlyOverrideRawWins( ) {
88- let context = ContextFactory . make (
89- value: #"{"k":1}"# ,
90- columnType: . text( rawType: " TEXT " ) ,
91- isTableEditable: false ,
92- displayFormatOverride: . raw
93- )
9465 #expect( resolver. resolve ( context) == . viewInline( value: #"{"k":1}"# ) )
9566 }
9667
97- @Test ( " read-only override .json forces viewJson on non- JSON text " )
98- func readOnlyOverrideJsonForces ( ) {
68+ @Test ( " read-only override .json shows the JSON viewer " )
69+ func readOnlyOverrideJsonShowsViewer ( ) {
9970 let context = ContextFactory . make (
10071 value: " plain " ,
10172 columnType: . text( rawType: " TEXT " ) ,
@@ -105,8 +76,8 @@ struct CellInteractionResolverReadOnlyTests {
10576 #expect( resolver. resolve ( context) == . viewJson)
10677 }
10778
108- @Test ( " read-only override .phpSerialized forces viewPhpSerialized " )
109- func readOnlyOverridePhpSerializedForces ( ) {
79+ @Test ( " read-only override .phpSerialized shows the PHP viewer " )
80+ func readOnlyOverridePhpShowsViewer ( ) {
11081 let context = ContextFactory . make (
11182 value: " plain " ,
11283 columnType: . text( rawType: " TEXT " ) ,
@@ -115,17 +86,6 @@ struct CellInteractionResolverReadOnlyTests {
11586 )
11687 #expect( resolver. resolve ( context) == . viewPhpSerialized)
11788 }
118-
119- @Test ( " read-only override .raw on declared JSON column returns viewInline (override beats type) " )
120- func readOnlyOverrideRawBypassesJsonColumn( ) {
121- let context = ContextFactory . make (
122- value: #"{"k":1}"# ,
123- columnType: . json( rawType: " JSON " ) ,
124- isTableEditable: false ,
125- displayFormatOverride: . raw
126- )
127- #expect( resolver. resolve ( context) == . viewInline( value: #"{"k":1}"# ) )
128- }
12989}
13090
13191@Suite ( " CellInteractionResolver - editable path " )
@@ -144,90 +104,61 @@ struct CellInteractionResolverEditableTests {
144104 #expect( resolver. resolve ( context) == . editOverlay( value: " line1 \n line2 " ) )
145105 }
146106
147- @Test ( " editable plain text that looks like JSON returns editJson " )
148- func editableJsonLikeTextReturnsEditJson ( ) {
149- let context = ContextFactory . make ( value: #"{"k":1}"# , isTableEditable: true )
150- #expect( resolver. resolve ( context) == . editJson )
107+ @Test ( " editable JSON column edits inline; the chevron opens the JSON editor " )
108+ func editableJsonColumnEditsInline ( ) {
109+ let context = ContextFactory . make ( value: #"{"k":1}"# , columnType : . json ( rawType : " JSON " ) , isTableEditable: true )
110+ #expect( resolver. resolve ( context) == . editInline ( value : #"{"k":1}"# ) )
151111 }
152112
153- @Test ( " editable PHP-shaped text returns viewPhpSerialized (read-only) " )
154- func editablePhpLikeTextReturnsView( ) {
155- let context = ContextFactory . make ( value: " a:0:{} " , isTableEditable: true )
156- #expect( resolver. resolve ( context) == . viewPhpSerialized)
113+ @Test ( " editable multiline JSON column opens the inline overlay editor " )
114+ func editableMultilineJsonColumnEditsOverlay( ) {
115+ let value = " { \n \" k \" : 1 \n } "
116+ let context = ContextFactory . make ( value: value, columnType: . json( rawType: " JSON " ) , isTableEditable: true )
117+ #expect( resolver. resolve ( context) == . editOverlay( value: value) )
157118 }
158119
159- @Test ( " editable override .phpSerialized forces viewPhpSerialized " )
160- func editableOverridePhpForces( ) {
161- let context = ContextFactory . make (
162- value: " plain " ,
163- isTableEditable: true ,
164- displayFormatOverride: . phpSerialized
165- )
166- #expect( resolver. resolve ( context) == . viewPhpSerialized)
120+ @Test ( " editable BLOB column returns editBlob " )
121+ func editableBlobColumnReturnsEditBlob( ) {
122+ let context = ContextFactory . make ( value: " x " , columnType: . blob( rawType: " BLOB " ) , isTableEditable: true )
123+ #expect( resolver. resolve ( context) == . editBlob)
167124 }
168125
169- @Test ( " editable override .json forces editJson " )
170- func editableOverrideJsonForces( ) {
171- let context = ContextFactory . make (
172- value: " plain " ,
173- isTableEditable: true ,
174- displayFormatOverride: . json
175- )
176- #expect( resolver. resolve ( context) == . editJson)
126+ @Test ( " JSON-looking text is not content-routed; it edits inline " )
127+ func jsonLikeTextEditsInline( ) {
128+ let context = ContextFactory . make ( value: #"{"k":1}"# , isTableEditable: true )
129+ #expect( resolver. resolve ( context) == . editInline( value: #"{"k":1}"# ) )
177130 }
178131
179- @Test ( " editable override .raw bypasses JSON content detection " )
180- func editableOverrideRawSkipsJson( ) {
181- let context = ContextFactory . make (
182- value: #"{"k":1}"# ,
183- columnType: . text( rawType: " TEXT " ) ,
184- isTableEditable: true ,
185- displayFormatOverride: . raw
186- )
187- #expect( resolver. resolve ( context) == . editInline( value: #"{"k":1}"# ) )
132+ @Test ( " editable override .json opens the JSON editor " )
133+ func editableOverrideJsonOpensEditor( ) {
134+ let context = ContextFactory . make ( value: " plain " , isTableEditable: true , displayFormatOverride: . json)
135+ #expect( resolver. resolve ( context) == . editJson)
188136 }
189137
190- @Test ( " editable override .raw bypasses PHP content detection " )
191- func editableOverrideRawSkipsPhp( ) {
192- let context = ContextFactory . make (
193- value: " a:0:{} " ,
194- columnType: . text( rawType: " TEXT " ) ,
195- isTableEditable: true ,
196- displayFormatOverride: . raw
197- )
198- #expect( resolver. resolve ( context) == . editInline( value: " a:0:{} " ) )
138+ @Test ( " editable override .phpSerialized shows the PHP viewer " )
139+ func editableOverridePhpShowsViewer( ) {
140+ let context = ContextFactory . make ( value: " plain " , isTableEditable: true , displayFormatOverride: . phpSerialized)
141+ #expect( resolver. resolve ( context) == . viewPhpSerialized)
199142 }
200143
201- @Test ( " editable override .raw on multiline value returns editOverlay " )
202- func editableOverrideRawMultilineReturnsOverlay ( ) {
144+ @Test ( " editable override .uuid still edits inline " )
145+ func editableOverrideUuidEditsInline ( ) {
203146 let context = ContextFactory . make (
204- value: " line1 \n line2 " ,
147+ value: " 0x00 " ,
205148 columnType: . text( rawType: " TEXT " ) ,
206149 isTableEditable: true ,
207- displayFormatOverride: . raw
150+ displayFormatOverride: . uuid
208151 )
209- #expect( resolver. resolve ( context) == . editOverlay( value: " line1 \n line2 " ) )
210- }
211-
212- @Test ( " editable JSON column returns editJson " )
213- func editableJsonColumnReturnsEditJson( ) {
214- let context = ContextFactory . make ( value: " {} " , columnType: . json( rawType: " JSON " ) , isTableEditable: true )
215- #expect( resolver. resolve ( context) == . editJson)
216- }
217-
218- @Test ( " editable BLOB column returns editBlob " )
219- func editableBlobColumnReturnsEditBlob( ) {
220- let context = ContextFactory . make ( value: nil , columnType: . blob( rawType: " BLOB " ) , isTableEditable: true )
221- #expect( resolver. resolve ( context) == . editBlob)
152+ #expect( resolver. resolve ( context) == . editInline( value: " 0x00 " ) )
222153 }
223154
224- @Test ( " editable foreign key column returns editInline (FK popover is not opened by double-click) " )
155+ @Test ( " editable foreign key column returns editInline " )
225156 func editableForeignKeyReturnsEditInline( ) {
226157 let context = ContextFactory . make ( value: " 1 " , columnType: . integer( rawType: " INT " ) , isTableEditable: true )
227158 #expect( resolver. resolve ( context) == . editInline( value: " 1 " ) )
228159 }
229160
230- @Test ( " editable boolean column returns editInline, not a picker (pickers are chevron-only) " )
161+ @Test ( " editable boolean column returns editInline, not a picker " )
231162 func editableBooleanColumnReturnsEditInline( ) {
232163 let context = ContextFactory . make ( value: " true " , columnType: . boolean( rawType: " BOOL " ) , isTableEditable: true )
233164 #expect( resolver. resolve ( context) == . editInline( value: " true " ) )
0 commit comments