Skip to content

Commit 4454134

Browse files
committed
test: add tests for column visibility feature
1 parent a820e33 commit 4454134

3 files changed

Lines changed: 255 additions & 0 deletions

File tree

TableProTests/Models/ColumnLayoutStateTests.swift

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,43 @@ struct ColumnLayoutStateTests {
6363
let b = ColumnLayoutState(columnOrder: [])
6464
#expect(a != b)
6565
}
66+
67+
// MARK: - hiddenColumns
68+
69+
@Test("Default hiddenColumns is empty")
70+
func defaultHiddenColumnsEmpty() {
71+
let state = ColumnLayoutState()
72+
#expect(state.hiddenColumns.isEmpty)
73+
}
74+
75+
@Test("Same hiddenColumns produces equal states")
76+
func sameHiddenColumnsEqual() {
77+
let a = ColumnLayoutState(hiddenColumns: ["name", "email"])
78+
let b = ColumnLayoutState(hiddenColumns: ["name", "email"])
79+
#expect(a == b)
80+
}
81+
82+
@Test("Different hiddenColumns produces unequal states")
83+
func differentHiddenColumnsNotEqual() {
84+
let a = ColumnLayoutState(hiddenColumns: ["name"])
85+
let b = ColumnLayoutState(hiddenColumns: ["email"])
86+
#expect(a != b)
87+
}
88+
89+
@Test("Same widths with different hiddenColumns are not equal")
90+
func sameWidthsDifferentHiddenColumnsNotEqual() {
91+
let a = ColumnLayoutState(columnWidths: ["id": 50.0], hiddenColumns: ["name"])
92+
let b = ColumnLayoutState(columnWidths: ["id": 50.0], hiddenColumns: ["email"])
93+
#expect(a != b)
94+
}
95+
96+
@Test("Setting hiddenColumns stores and retrieves values")
97+
func setAndReadHiddenColumns() {
98+
var state = ColumnLayoutState()
99+
state.hiddenColumns = ["id", "created_at"]
100+
#expect(state.hiddenColumns == ["id", "created_at"])
101+
#expect(state.hiddenColumns.contains("id"))
102+
#expect(state.hiddenColumns.contains("created_at"))
103+
#expect(!state.hiddenColumns.contains("name"))
104+
}
66105
}
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
//
2+
// ColumnVisibilityManagerTests.swift
3+
// TableProTests
4+
//
5+
6+
import Foundation
7+
import Testing
8+
9+
@testable import TablePro
10+
11+
@Suite("ColumnVisibilityManager")
12+
@MainActor
13+
struct ColumnVisibilityManagerTests {
14+
@Test("Initial state has no hidden columns")
15+
func initialState() {
16+
let manager = ColumnVisibilityManager()
17+
#expect(manager.hiddenColumns.isEmpty)
18+
#expect(!manager.hasHiddenColumns)
19+
#expect(manager.hiddenCount == 0)
20+
}
21+
22+
@Test("hideColumn adds column to hidden set")
23+
func hideColumn() {
24+
let manager = ColumnVisibilityManager()
25+
manager.hideColumn("name")
26+
#expect(manager.hiddenColumns.contains("name"))
27+
#expect(manager.hiddenCount == 1)
28+
}
29+
30+
@Test("showColumn removes column from hidden set")
31+
func showColumn() {
32+
let manager = ColumnVisibilityManager()
33+
manager.hideColumn("name")
34+
manager.showColumn("name")
35+
#expect(!manager.hiddenColumns.contains("name"))
36+
#expect(manager.hiddenCount == 0)
37+
}
38+
39+
@Test("toggleColumn hides visible column and shows hidden column")
40+
func toggleColumn() {
41+
let manager = ColumnVisibilityManager()
42+
43+
manager.toggleColumn("name")
44+
#expect(manager.hiddenColumns.contains("name"))
45+
46+
manager.toggleColumn("name")
47+
#expect(!manager.hiddenColumns.contains("name"))
48+
}
49+
50+
@Test("showAll clears all hidden columns")
51+
func showAll() {
52+
let manager = ColumnVisibilityManager()
53+
manager.hideColumn("a")
54+
manager.hideColumn("b")
55+
manager.hideColumn("c")
56+
57+
manager.showAll()
58+
#expect(manager.hiddenColumns.isEmpty)
59+
#expect(manager.hiddenCount == 0)
60+
}
61+
62+
@Test("hideAll hides all given columns")
63+
func hideAll() {
64+
let manager = ColumnVisibilityManager()
65+
manager.hideAll(["a", "b", "c"])
66+
#expect(manager.hiddenColumns == Set(["a", "b", "c"]))
67+
#expect(manager.hiddenCount == 3)
68+
}
69+
70+
@Test("hideAll then showAll round-trip")
71+
func hideAllThenShowAll() {
72+
let manager = ColumnVisibilityManager()
73+
manager.hideAll(["x", "y", "z"])
74+
#expect(manager.hasHiddenColumns)
75+
76+
manager.showAll()
77+
#expect(!manager.hasHiddenColumns)
78+
#expect(manager.hiddenColumns.isEmpty)
79+
}
80+
81+
@Test("hasHiddenColumns reflects state correctly")
82+
func hasHiddenColumns() {
83+
let manager = ColumnVisibilityManager()
84+
#expect(!manager.hasHiddenColumns)
85+
86+
manager.hideColumn("id")
87+
#expect(manager.hasHiddenColumns)
88+
89+
manager.showColumn("id")
90+
#expect(!manager.hasHiddenColumns)
91+
}
92+
93+
@Test("hiddenCount returns correct count")
94+
func hiddenCount() {
95+
let manager = ColumnVisibilityManager()
96+
#expect(manager.hiddenCount == 0)
97+
98+
manager.hideColumn("a")
99+
#expect(manager.hiddenCount == 1)
100+
101+
manager.hideColumn("b")
102+
#expect(manager.hiddenCount == 2)
103+
104+
manager.showColumn("a")
105+
#expect(manager.hiddenCount == 1)
106+
}
107+
108+
@Test("saveToColumnLayout and restoreFromColumnLayout round-trip")
109+
func columnLayoutRoundTrip() {
110+
let manager = ColumnVisibilityManager()
111+
manager.hideColumn("col1")
112+
manager.hideColumn("col2")
113+
114+
let saved = manager.saveToColumnLayout()
115+
116+
let other = ColumnVisibilityManager()
117+
other.restoreFromColumnLayout(saved)
118+
#expect(other.hiddenColumns == Set(["col1", "col2"]))
119+
}
120+
121+
@Test("restoreFromColumnLayout replaces state instead of merging")
122+
func restoreReplacesState() {
123+
let manager = ColumnVisibilityManager()
124+
manager.hideColumn("existing")
125+
126+
manager.restoreFromColumnLayout(Set(["new1", "new2"]))
127+
#expect(manager.hiddenColumns == Set(["new1", "new2"]))
128+
#expect(!manager.hiddenColumns.contains("existing"))
129+
}
130+
131+
@Test("pruneStaleColumns removes columns not in current set")
132+
func pruneStaleColumns() {
133+
let manager = ColumnVisibilityManager()
134+
manager.hideAll(["a", "b", "c", "d"])
135+
136+
manager.pruneStaleColumns(["b", "d", "e"])
137+
#expect(manager.hiddenColumns == Set(["b", "d"]))
138+
}
139+
140+
@Test("pruneStaleColumns with empty current columns clears all hidden")
141+
func pruneStaleColumnsEmptyCurrent() {
142+
let manager = ColumnVisibilityManager()
143+
manager.hideAll(["a", "b", "c"])
144+
145+
manager.pruneStaleColumns([])
146+
#expect(manager.hiddenColumns.isEmpty)
147+
}
148+
149+
@Test("pruneStaleColumns with no stale columns keeps all hidden")
150+
func pruneStaleColumnsNoStale() {
151+
let manager = ColumnVisibilityManager()
152+
manager.hideAll(["a", "b"])
153+
154+
manager.pruneStaleColumns(["a", "b", "c"])
155+
#expect(manager.hiddenColumns == Set(["a", "b"]))
156+
}
157+
158+
@Test("UserDefaults round-trip for saveLastHiddenColumns and restoreLastHiddenColumns")
159+
func userDefaultsRoundTrip() {
160+
let tableName = "test_table_\(UUID().uuidString)"
161+
let key = "com.TablePro.columns.hiddenColumns.\(tableName)"
162+
defer { UserDefaults.standard.removeObject(forKey: key) }
163+
164+
let manager = ColumnVisibilityManager()
165+
manager.hideAll(["col1", "col2", "col3"])
166+
manager.saveLastHiddenColumns(for: tableName)
167+
168+
let other = ColumnVisibilityManager()
169+
other.restoreLastHiddenColumns(for: tableName)
170+
#expect(other.hiddenColumns == Set(["col1", "col2", "col3"]))
171+
}
172+
173+
@Test("restoreLastHiddenColumns with no saved data resets to empty")
174+
func restoreWithNoSavedData() {
175+
let tableName = "nonexistent_table_\(UUID().uuidString)"
176+
let key = "com.TablePro.columns.hiddenColumns.\(tableName)"
177+
defer { UserDefaults.standard.removeObject(forKey: key) }
178+
179+
let manager = ColumnVisibilityManager()
180+
manager.hideColumn("leftover")
181+
182+
manager.restoreLastHiddenColumns(for: tableName)
183+
#expect(manager.hiddenColumns.isEmpty)
184+
}
185+
186+
@Test("hideColumn is idempotent when hiding same column twice")
187+
func hideColumnIdempotent() {
188+
let manager = ColumnVisibilityManager()
189+
manager.hideColumn("name")
190+
manager.hideColumn("name")
191+
#expect(manager.hiddenCount == 1)
192+
#expect(manager.hiddenColumns.contains("name"))
193+
}
194+
195+
@Test("showColumn on non-hidden column is a no-op")
196+
func showColumnNonHidden() {
197+
let manager = ColumnVisibilityManager()
198+
manager.showColumn("nonexistent")
199+
#expect(manager.hiddenColumns.isEmpty)
200+
#expect(manager.hiddenCount == 0)
201+
}
202+
}

TableProTests/Views/Results/DataGridIdentityTests.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,18 @@ struct DataGridIdentityTests {
5959
let b = DataGridIdentity(reloadVersion: 1, resultVersion: 2, metadataVersion: 3, rowCount: 100, columnCount: 5, isEditable: false, hiddenColumns: [])
6060
#expect(a != b)
6161
}
62+
63+
@Test("Different hiddenColumns produces unequal identities")
64+
func differentHiddenColumns() {
65+
let a = DataGridIdentity(reloadVersion: 1, resultVersion: 2, metadataVersion: 3, rowCount: 100, columnCount: 5, isEditable: true, hiddenColumns: [])
66+
let b = DataGridIdentity(reloadVersion: 1, resultVersion: 2, metadataVersion: 3, rowCount: 100, columnCount: 5, isEditable: true, hiddenColumns: ["name"])
67+
#expect(a != b)
68+
}
69+
70+
@Test("Same hiddenColumns produces equal identities")
71+
func sameHiddenColumns() {
72+
let a = DataGridIdentity(reloadVersion: 1, resultVersion: 2, metadataVersion: 3, rowCount: 100, columnCount: 5, isEditable: true, hiddenColumns: ["name", "email"])
73+
let b = DataGridIdentity(reloadVersion: 1, resultVersion: 2, metadataVersion: 3, rowCount: 100, columnCount: 5, isEditable: true, hiddenColumns: ["name", "email"])
74+
#expect(a == b)
75+
}
6276
}

0 commit comments

Comments
 (0)