Skip to content

Commit 4fe567d

Browse files
committed
test: add NSView focus tests and fix pre-existing test compilation errors
1 parent b04d757 commit 4fe567d

7 files changed

Lines changed: 102 additions & 10 deletions

TableProTests/Core/ChangeTracking/DataChangeManagerExtendedTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ struct DataChangeManagerExtendedTests {
240240
let state = manager.saveState()
241241
manager.clearChanges()
242242
#expect(!manager.hasChanges)
243-
manager.restoreState(from: state, tableName: "test_table")
243+
manager.restoreState(from: state, tableName: "test_table", databaseType: .mysql)
244244
#expect(manager.hasChanges)
245245
}
246246

@@ -250,7 +250,7 @@ struct DataChangeManagerExtendedTests {
250250
manager.recordRowDeletion(rowIndex: 2, originalRow: ["3", "Charlie", "c@test.com"])
251251
let state = manager.saveState()
252252
manager.clearChanges()
253-
manager.restoreState(from: state, tableName: "test_table")
253+
manager.restoreState(from: state, tableName: "test_table", databaseType: .mysql)
254254
#expect(manager.isRowDeleted(2))
255255
}
256256

@@ -263,7 +263,7 @@ struct DataChangeManagerExtendedTests {
263263
)
264264
let state = manager.saveState()
265265
manager.clearChanges()
266-
manager.restoreState(from: state, tableName: "test_table")
266+
manager.restoreState(from: state, tableName: "test_table", databaseType: .mysql)
267267
#expect(manager.isCellModified(rowIndex: 0, columnIndex: 1))
268268
}
269269

@@ -276,7 +276,7 @@ struct DataChangeManagerExtendedTests {
276276
)
277277
let state = manager.saveState()
278278
manager.clearChanges()
279-
manager.restoreState(from: state, tableName: "test_table")
279+
manager.restoreState(from: state, tableName: "test_table", databaseType: .mysql)
280280
manager.recordCellChange(
281281
rowIndex: 0, columnIndex: 2, columnName: "email",
282282
oldValue: "a@test.com", newValue: "b@test.com"
@@ -289,7 +289,7 @@ struct DataChangeManagerExtendedTests {
289289
func emptyStateRoundTrip() {
290290
let manager = makeManager()
291291
let state = manager.saveState()
292-
manager.restoreState(from: state, tableName: "test_table")
292+
manager.restoreState(from: state, tableName: "test_table", databaseType: .mysql)
293293
#expect(!manager.hasChanges)
294294
#expect(manager.changes.isEmpty)
295295
}

TableProTests/Core/ChangeTracking/SQLStatementGeneratorMSSQLTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ struct SQLStatementGeneratorMSSQLTests {
2323
columns: columns,
2424
primaryKeyColumn: primaryKeyColumn,
2525
databaseType: .mssql,
26-
dialect: PluginManager.shared.sqlDialect(for: .mssql)
26+
dialect: nil
2727
)
2828
}
2929

TableProTests/Core/ChangeTracking/SQLStatementGeneratorNoPKTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ struct SQLStatementGeneratorNoPKTests {
2424
columns: columns,
2525
primaryKeyColumn: primaryKeyColumn,
2626
databaseType: databaseType,
27-
dialect: PluginManager.shared.sqlDialect(for: databaseType)
27+
dialect: nil
2828
)
2929
}
3030

TableProTests/Core/ChangeTracking/SQLStatementGeneratorPKRegressionTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ struct SQLStatementGeneratorPKRegressionTests {
2222
columns: columns,
2323
primaryKeyColumn: primaryKeyColumn,
2424
databaseType: databaseType,
25-
dialect: PluginManager.shared.sqlDialect(for: databaseType)
25+
dialect: nil
2626
)
2727
}
2828

TableProTests/Core/ChangeTracking/SQLStatementGeneratorParameterStyleTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ struct SQLStatementGeneratorParameterStyleTests {
2828
primaryKeyColumn: primaryKeyColumn,
2929
databaseType: databaseType,
3030
parameterStyle: parameterStyle,
31-
dialect: PluginManager.shared.sqlDialect(for: databaseType)
31+
dialect: nil
3232
)
3333
}
3434

TableProTests/Core/ChangeTracking/SQLStatementGeneratorTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ struct SQLStatementGeneratorTests {
2525
columns: columns,
2626
primaryKeyColumn: primaryKeyColumn,
2727
databaseType: databaseType,
28-
dialect: PluginManager.shared.sqlDialect(for: databaseType)
28+
dialect: nil
2929
)
3030
}
3131

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
//
2+
// NSViewFocusTests.swift
3+
// TableProTests
4+
//
5+
6+
import AppKit
7+
import Testing
8+
@testable import TablePro
9+
10+
@Suite("NSView+Focus")
11+
struct NSViewFocusTests {
12+
@Test("Returns nil for empty container view")
13+
func emptyView() {
14+
let container = NSView(frame: .zero)
15+
#expect(container.firstEditableTextField() == nil)
16+
}
17+
18+
@Test("Finds direct editable text field")
19+
func directTextField() {
20+
let textField = NSTextField(frame: .zero)
21+
#expect(textField.firstEditableTextField() === textField)
22+
}
23+
24+
@Test("Finds editable text field in subviews")
25+
func nestedTextField() {
26+
let container = NSView(frame: .zero)
27+
let child = NSView(frame: .zero)
28+
let textField = NSTextField(frame: .zero)
29+
child.addSubview(textField)
30+
container.addSubview(child)
31+
#expect(container.firstEditableTextField() === textField)
32+
}
33+
34+
@Test("Skips non-editable text field")
35+
func skipsNonEditable() {
36+
let container = NSView(frame: .zero)
37+
let label = NSTextField(labelWithString: "Label")
38+
container.addSubview(label)
39+
#expect(container.firstEditableTextField() == nil)
40+
}
41+
42+
@Test("Returns first editable text field in depth-first order")
43+
func depthFirstOrder() {
44+
let container = NSView(frame: .zero)
45+
let first = NSTextField(frame: .zero)
46+
let second = NSTextField(frame: .zero)
47+
container.addSubview(first)
48+
container.addSubview(second)
49+
50+
let found = container.firstEditableTextField()
51+
#expect(found === first)
52+
}
53+
54+
@Test("Finds editable text field among mixed subviews")
55+
func mixedSubviews() {
56+
let container = NSView(frame: .zero)
57+
let button = NSButton(frame: .zero)
58+
let label = NSTextField(labelWithString: "Label")
59+
let editable = NSTextField(frame: .zero)
60+
61+
container.addSubview(button)
62+
container.addSubview(label)
63+
container.addSubview(editable)
64+
65+
#expect(container.firstEditableTextField() === editable)
66+
}
67+
68+
@Test("Returns nil when only non-editable text fields exist")
69+
func onlyLabels() {
70+
let container = NSView(frame: .zero)
71+
let label1 = NSTextField(labelWithString: "A")
72+
let label2 = NSTextField(labelWithString: "B")
73+
container.addSubview(label1)
74+
container.addSubview(label2)
75+
#expect(container.firstEditableTextField() == nil)
76+
}
77+
78+
@Test("Finds deeply nested text field")
79+
func deeplyNested() {
80+
let root = NSView(frame: .zero)
81+
var current = root
82+
for _ in 0 ..< 5 {
83+
let child = NSView(frame: .zero)
84+
current.addSubview(child)
85+
current = child
86+
}
87+
let textField = NSTextField(frame: .zero)
88+
current.addSubview(textField)
89+
90+
#expect(root.firstEditableTextField() === textField)
91+
}
92+
}

0 commit comments

Comments
 (0)