Skip to content

Commit adada36

Browse files
ensure that all-unset alignments and no alignments compare equal
1 parent 1e0319d commit adada36

File tree

2 files changed

+99
-1
lines changed

2 files changed

+99
-1
lines changed

Sources/SwiftDocC/Model/Rendering/Content/RenderBlockContent.swift

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ public enum RenderBlockContent: Equatable {
233233
}
234234

235235
/// A table that contains a list of row data.
236-
public struct Table: Equatable {
236+
public struct Table {
237237
/// The style of header in this table.
238238
public var header: HeaderType
239239
/// The text alignment of each column in this table.
@@ -525,6 +525,30 @@ public enum RenderBlockContent: Equatable {
525525
}
526526
}
527527

528+
extension RenderBlockContent.Table: Equatable {
529+
public static func == (lhs: RenderBlockContent.Table, rhs: RenderBlockContent.Table) -> Bool {
530+
guard lhs.header == rhs.header
531+
&& lhs.extendedData == rhs.extendedData
532+
&& lhs.metadata == rhs.metadata
533+
&& lhs.rows == rhs.rows
534+
else {
535+
return false
536+
}
537+
538+
var lhsAlignments = lhs.alignments
539+
if let align = lhsAlignments, align.allSatisfy({ $0 == .unset }) {
540+
lhsAlignments = nil
541+
}
542+
543+
var rhsAlignments = rhs.alignments
544+
if let align = rhsAlignments, align.allSatisfy({ $0 == .unset }) {
545+
rhsAlignments = nil
546+
}
547+
548+
return lhsAlignments == rhsAlignments
549+
}
550+
}
551+
528552
// Writing a manual Codable implementation for tables because the encoding of `extendedData` does
529553
// not follow from the struct layout.
530554
extension RenderBlockContent.Table: Codable {

Tests/SwiftDocCTests/Model/RenderContentMetadataTests.swift

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,80 @@ class RenderContentMetadataTests: XCTestCase {
200200

201201
try assertRoundTripCoding(renderedTable)
202202
}
203+
204+
/// Verifies that a table with `nil` alignments and a table with all-unset alignments still compare as equal.
205+
func testRenderedTableEquality() throws {
206+
let (bundle, context) = try testBundleAndContext(named: "TestBundle")
207+
var renderContentCompiler = RenderContentCompiler(context: context, bundle: bundle, identifier: ResolvedTopicReference(bundleIdentifier: bundle.identifier, path: "/path", fragment: nil, sourceLanguage: .swift))
208+
209+
let source = """
210+
| Column 1 | Column 2 |
211+
| ------------- | ------------- |
212+
| Cell 1 | Cell 2 |
213+
| Cell 3 | Cell 4 |
214+
"""
215+
let document = Document(parsing: source)
216+
217+
let result = try XCTUnwrap(renderContentCompiler.visit(document.child(at: 0)!))
218+
let renderedTable = try XCTUnwrap(result.first as? RenderBlockContent)
219+
guard case let .table(decodedTable) = renderedTable else {
220+
XCTFail("Unexpected RenderBlockContent element")
221+
return
222+
}
223+
XCTAssertNil(decodedTable.alignments)
224+
var modifiedTable = decodedTable
225+
modifiedTable.alignments = [.unset, .unset]
226+
227+
XCTAssertEqual(decodedTable, modifiedTable)
228+
}
229+
230+
/// Verifies that two tables with otherwise-identical contents but different column alignments compare as unequal.
231+
func testRenderedTableInequality() throws {
232+
let (bundle, context) = try testBundleAndContext(named: "TestBundle")
233+
var renderContentCompiler = RenderContentCompiler(context: context, bundle: bundle, identifier: ResolvedTopicReference(bundleIdentifier: bundle.identifier, path: "/path", fragment: nil, sourceLanguage: .swift))
234+
235+
let decodedTableWithUnsetColumns: RenderBlockContent.Table
236+
do {
237+
let source = """
238+
| Column 1 | Column 2 |
239+
| ------------- | ------------- |
240+
| Cell 1 | Cell 2 |
241+
| Cell 3 | Cell 4 |
242+
"""
243+
let document = Document(parsing: source)
244+
245+
let result = try XCTUnwrap(renderContentCompiler.visit(document.child(at: 0)!))
246+
let renderedTable = try XCTUnwrap(result.first as? RenderBlockContent)
247+
guard case let .table(decodedTable) = renderedTable else {
248+
XCTFail("Unexpected RenderBlockContent element")
249+
return
250+
}
251+
decodedTableWithUnsetColumns = decodedTable
252+
}
253+
254+
let decodedTableWithLeftColumns: RenderBlockContent.Table
255+
do {
256+
let source = """
257+
| Column 1 | Column 2 |
258+
| :------------ | :------------ |
259+
| Cell 1 | Cell 2 |
260+
| Cell 3 | Cell 4 |
261+
"""
262+
let document = Document(parsing: source)
263+
264+
// Verifies that a markdown table renders correctly.
265+
266+
let result = try XCTUnwrap(renderContentCompiler.visit(document.child(at: 0)!))
267+
let renderedTable = try XCTUnwrap(result.first as? RenderBlockContent)
268+
guard case let .table(decodedTable) = renderedTable else {
269+
XCTFail("Unexpected RenderBlockContent element")
270+
return
271+
}
272+
decodedTableWithLeftColumns = decodedTable
273+
}
274+
275+
XCTAssertNotEqual(decodedTableWithUnsetColumns, decodedTableWithLeftColumns)
276+
}
203277

204278
func testStrikethrough() throws {
205279
let (bundle, context) = try testBundleAndContext(named: "TestBundle")

0 commit comments

Comments
 (0)