From 3593bb261b56cbc8e903c9cbc7cedb1d01febb50 Mon Sep 17 00:00:00 2001 From: John Flanagan Date: Wed, 16 Aug 2023 11:28:37 -0500 Subject: [PATCH 1/3] Add optional name parameter to assertion functions --- .../PreviewSnapshots+assertSnapshots.swift | 34 ++++++++++++++---- .../PreviewSnapshotsTests.swift | 26 ++++++++++++++ ...Assertion.Named-Assertion-Long-Message.png | Bin 0 -> 41286 bytes ...ssertion.Named-Assertion-Short-Message.png | Bin 0 -> 6441 bytes 4 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 Tests/PreviewSnapshotsTests/__Snapshots__/PreviewSnapshotsTests/test_namedAssertion.Named-Assertion-Long-Message.png create mode 100644 Tests/PreviewSnapshotsTests/__Snapshots__/PreviewSnapshotsTests/test_namedAssertion.Named-Assertion-Short-Message.png diff --git a/Sources/PreviewSnapshotsTesting/PreviewSnapshots+assertSnapshots.swift b/Sources/PreviewSnapshotsTesting/PreviewSnapshots+assertSnapshots.swift index 67b5dfa..ee57952 100644 --- a/Sources/PreviewSnapshotsTesting/PreviewSnapshots+assertSnapshots.swift +++ b/Sources/PreviewSnapshotsTesting/PreviewSnapshots+assertSnapshots.swift @@ -21,6 +21,7 @@ extension PreviewSnapshots { /// /// - Parameters: /// - snapshotting: Snapshotting instance for `AnyView` into a `UIImage`. + /// - name: An optional description of the snapshot to include with the configuration name. /// - recording: Whether or not to record a new reference. /// - file: The file in which failure occurred. Defaults to the file name of the test case in /// which this function was called. @@ -30,6 +31,7 @@ extension PreviewSnapshots { /// this function was called. public func assertSnapshots( as snapshotting: Snapshotting = .image, + named name: String? = nil, record recording: Bool = false, file: StaticString = #file, testName: String = #function, @@ -39,7 +41,7 @@ extension PreviewSnapshots { assertSnapshot( matching: configure(configuration.state), as: snapshotting, - named: configuration.name, + named: configuration.snapshotName(prefix: name), record: recording, file: file, testName: testName, line: line ) @@ -52,6 +54,7 @@ extension PreviewSnapshots { /// - Parameters: /// - strategies: A dictionary of names and strategies for serializing, deserializing, and /// comparing values. + /// - name: An optional description of the snapshot to include with the configuration name. /// - recording: Whether or not to record a new reference. /// - file: The file in which failure occurred. Defaults to the file name of the test case in /// which this function was called. @@ -61,6 +64,7 @@ extension PreviewSnapshots { /// this function was called. public func assertSnapshots( as strategies: [String: Snapshotting], + named name: String? = nil, record recording: Bool = false, file: StaticString = #file, testName: String = #function, @@ -71,7 +75,7 @@ extension PreviewSnapshots { assertSnapshot( matching: configure(configuration.state), as: strategy, - named: configuration.name + "-\(key)", + named: configuration.snapshotName(prefix: name) + "-\(key)", record: recording, file: file, testName: testName, line: line ) @@ -84,6 +88,7 @@ extension PreviewSnapshots { /// /// - Parameters: /// - strategies: An array of strategies for serializing, deserializing, and comparing values. + /// - name: An optional description of the snapshot to include with the configuration name. /// - recording: Whether or not to record a new reference. /// - file: The file in which failure occurred. Defaults to the file name of the test case in /// which this function was called. @@ -93,6 +98,7 @@ extension PreviewSnapshots { /// this function was called. public func assertSnapshots( as strategies: [Snapshotting], + named name: String? = nil, record recording: Bool = false, file: StaticString = #file, testName: String = #function, @@ -103,7 +109,7 @@ extension PreviewSnapshots { assertSnapshot( matching: configure(configuration.state), as: strategy, - named: configuration.name + "-\(position + 1)", + named: configuration.snapshotName(prefix: name) + "-\(position + 1)", record: recording, file: file, testName: testName, line: line ) @@ -133,6 +139,7 @@ extension PreviewSnapshots { /// /// - Parameters: /// - snapshotting: Snapshotting instance that converts an `AnyView` into a `UIImage`. + /// - name: An optional description of the snapshot to include with the configuration name. /// - recording: Whether or not to record a new reference. /// - file: The file in which failure occurred. Defaults to the file name of the test case in /// which this function was called. @@ -143,6 +150,7 @@ extension PreviewSnapshots { /// - modify: A closure to update the preview content before snapshotting. public func assertSnapshots( as snapshotting: Snapshotting = .image, + named name: String? = nil, record recording: Bool = false, file: StaticString = #file, testName: String = #function, @@ -153,7 +161,7 @@ extension PreviewSnapshots { assertSnapshot( matching: modify(configure(configuration.state)), as: snapshotting, - named: configuration.name, + named: configuration.snapshotName(prefix: name), record: recording, file: file, testName: testName, line: line ) @@ -179,6 +187,7 @@ extension PreviewSnapshots { /// - Parameters: /// - strategies: A dictionary of names and strategies for serializing, deserializing, and /// comparing values. + /// - name: An optional description of the snapshot to include with the configuration name. /// - recording: Whether or not to record a new reference. /// - file: The file in which failure occurred. Defaults to the file name of the test case in /// which this function was called. @@ -189,6 +198,7 @@ extension PreviewSnapshots { /// - modify: A closure to update the preview content before snapshotting. public func assertSnapshots( as strategies: [String: Snapshotting], + named name: String? = nil, record recording: Bool = false, file: StaticString = #file, testName: String = #function, @@ -200,7 +210,7 @@ extension PreviewSnapshots { assertSnapshot( matching: configure(configuration.state), as: strategy, - named: configuration.name + "-\(key)", + named: configuration.snapshotName(prefix: name) + "-\(key)", record: recording, file: file, testName: testName, line: line ) @@ -226,6 +236,7 @@ extension PreviewSnapshots { /// /// - Parameters: /// - snapshotting: Snapshotting instance that converts an `AnyView` into a `UIImage`. + /// - name: An optional description of the snapshot to include with the configuration name. /// - recording: Whether or not to record a new reference. /// - file: The file in which failure occurred. Defaults to the file name of the test case in /// which this function was called. @@ -236,6 +247,7 @@ extension PreviewSnapshots { /// - modify: A closure to update the preview content before snapshotting. public func assertSnapshots( as strategies: [Snapshotting], + named name: String? = nil, record recording: Bool = false, file: StaticString = #file, testName: String = #function, @@ -247,7 +259,7 @@ extension PreviewSnapshots { assertSnapshot( matching: modify(configure(configuration.state)), as: strategy, - named: configuration.name + "-\(position)", + named: configuration.snapshotName(prefix: name) + "-\(position)", record: recording, file: file, testName: testName, line: line ) @@ -255,3 +267,13 @@ extension PreviewSnapshots { } } } + +// MARK: Configuration name helper + +extension PreviewSnapshots.Configuration { + /// Construct a snapshot name based on the configuration name and an optional suffix. + func snapshotName(prefix: String?) -> String { + guard let prefix else { return name } + return "\(prefix)-\(name)" + } +} diff --git a/Tests/PreviewSnapshotsTests/PreviewSnapshotsTests.swift b/Tests/PreviewSnapshotsTests/PreviewSnapshotsTests.swift index 647b97d..2029082 100644 --- a/Tests/PreviewSnapshotsTests/PreviewSnapshotsTests.swift +++ b/Tests/PreviewSnapshotsTests/PreviewSnapshotsTests.swift @@ -43,6 +43,32 @@ final class PreviewSnapshotsTests: XCTestCase { snapshots.assertSnapshots(as: .testStrategy) } + /// PreviewSnapshots assertion using `named` parameter + func test_namedAssertion() { + struct ContentView: View { + let message: String + + var body: some View { + Text(message) + .font(.largeTitle) + .foregroundColor(.blue) + .padding(8) + } + } + + let snapshots = PreviewSnapshots( + configurations: [ + .init(name: "Short Message", state: "Hello!"), + .init(name: "Long Message", state: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.") + ], + configure: { message in + ContentView(message: message) + } + ) + + snapshots.assertSnapshots(as: .testStrategy, named: "Named Assertion") + } + /// PreviewSnapshots with a tuple as the state func test_tupleState() { struct ContentView: View { diff --git a/Tests/PreviewSnapshotsTests/__Snapshots__/PreviewSnapshotsTests/test_namedAssertion.Named-Assertion-Long-Message.png b/Tests/PreviewSnapshotsTests/__Snapshots__/PreviewSnapshotsTests/test_namedAssertion.Named-Assertion-Long-Message.png new file mode 100644 index 0000000000000000000000000000000000000000..1d60740130d2f49d21e5a74d12db5ef4a5618f9d GIT binary patch literal 41286 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 literal 0 HcmV?d00001 diff --git a/Tests/PreviewSnapshotsTests/__Snapshots__/PreviewSnapshotsTests/test_namedAssertion.Named-Assertion-Short-Message.png b/Tests/PreviewSnapshotsTests/__Snapshots__/PreviewSnapshotsTests/test_namedAssertion.Named-Assertion-Short-Message.png new file mode 100644 index 0000000000000000000000000000000000000000..69c8e4f0b8c7d6912bde69938c8a3559f8fc3587 GIT binary patch literal 6441 zcmeGf`&W|L7SIy&mR2{lG@-{#)0mION>dRsQyWuznTD@2lSvXZ6*UrYdN|!obal%d z9kI+zNhwWGQPD}!d@_{BatBrPSWW^9kIO;FqkMfqKLRuq z1WvyK(qB;lU>g7+kX|7eqz7Q|3a=3IA1OGiQ18F=ilW7S{L0~$S3LaB0vNKw1HN_u ze)u;AXrn`2B6BK$A;&$AoJ|JL2!b>66Sua>j(MQG?M}dV$U3m@HBG27_v7CC%(#z# z+35~izk8D{{8NYCzUuq^Eny(Ywtrsp10UvQnLrBzHa-c`KW+T*5!$0CUH`-@@mt+U zQdH;Fyb&?pIKCP4z&D97o~sm>_>T)la&v!x=|fH6D7eXEXjBG3P(W#$Ond+YhGbJH z9#`+INKvR6V66}JfIv3A-nw%|3VyA(veCp4>fI9c+lo}bWy8vT)NVL@W8Mxx+r-4g zW%Z!dJ6esS)f8DRBdZnif7wNvg4S5^(em5javE|Zd8}kEHc$8Y0x8rUN!z8x2}Uo4 zs9Pplu+o6krRQ3ek%Z1~z$~a*>)$MWEjvRV3Qkovx7K5n$Kabyvbwtab{Y=9Dvgdv z)TQ+NVL&QzB+S!QOYt|CmMmqN9Hv@#k(_alfD zD~BPBbD$YVQ7G;c$>Uy#qwex-q0{-q(UD$ZfzphXFh8P~oQFg{rt#89nyYMGr|MG3 zT+>8LPg2>r1Tc1x7Aya-Hd3S@WDoPacyGUhh)hhf;$FCnzoAf0oatI>g@wIz z{>3DVv93Ko4EJgQ0;yc!X4>DQP`Z9~5S6tBqugW~?Vc=#@Q~ESt%kcDb$kT}<4+6-e=jF{6L%b(!MJa)ObS+PrpQ0XSB^g0{ zY~XMon;9);OHc*n>h;p-ulL1U&OFdCDBs({mWK+K!`_Eol$W#1!bnNFk~(v6%BSu! z{OEfacJbEotmOvWDJR*t0407%CrcNm)@io89fY6`tHfB>b&pUIPyJVg){h;)fdp3WipU2L9)U{qiX5t%+VR~kBL+k(f6z)L+12Dmtk za+9E0*P&GYG-_i5rJe7^^&WfL`q@HUdsEV#?!s3)GMV9fVv?UvJyURWpHlPZ?v*K# z<_PL-{m8c90Gj6A*rM3djqKZRlSkLe(Buu&hQHbh)q5k&tMUr05Zc)fRl0KLmulh( zX3jpL!*T`EFvB149!A>kd%+nlZq|IXF0;kq`=&=WSt=|L#m;OMCGzu1{;;tF6N7RQ_Va zImx2fm3jqflPI;zU6L(Z-=zI+%lJ9MWnLTd{i~B;@c9>oOKS{I7(64AkKSwVn}>+O z*G9<%_C7uv}+K`{cDPOOiq@ z4L?)O89aq7;}6*K6te1IwJ52%c1o6tAJQC1Y-t+*Q>|jLGc+-I zzGHq*Nab7|i`FowmRp6!`eI#DBd>RN`k_Oy_2Xs1-{;(x%oj+@16!qrt^|k?b);hE zZd1`3roJ~4#F1qTR0#U`2U$3wGZUdI(NF|8G3B6?UdIxlwD0ZYg0PyfvB zs(Ab&H(@qx!axQKX_yOh+y9qOHX(>=>R>}*(H`6p5aOFonyRqu)pg=R0Ayn#3IfE;2c<%4P5hPDubq1-K z*m5fDpo(B*;BPR|8?|B4Vtv*iPyYjzAt3k|yY}(tGbh#3i>ki2&#Ur=0yUG&Vu!4w z!9)%yw^)|!2Z2QT%@SM;yVkb5FjdfKVg@&j)BqZi-t*zfFC@=JVEre_wYrkTPA?4Y z7x5S2%bC<7@Lb24=l14L65g%1mJbjQxM}&{;(Li!up&*Z0e5CD#|14=Pmms6JBv*Z zby8=v>5uP%qsB!zh7aT&D5XEJL~l`~0xvJq(d;_%0VZPlp$7eSrp*hmoppmQCBJ59 zx-c{3;7)`tT6~z6J33!Lix!Ww133};UC)WZ?5_m_T&5{x-qZv>U(lpm(mnvs4HWAw z`XNxZjU>@uz(K~E*u5y#P|JQZJW)pt5e3!3b<3B6*@50yExJwPx0t}=zp~~dDfx@^ zNybu~Y3%G80durZSIN;T8Wq$`2|4z%`u^JX+CV=HO!Paq)Bk)aYqZFYS1*iHMC^D~ zWCYFHp6cEz4F3t`X+AS*=S0Qs<~c>IyCZj!rW97kbw>`8WU3*J#YwX6TgM~7Bo{U7 zg~BVI6k3XxY5lN;!;Ne4ZYuUc3JbCUgTd5%3;#Uuo*0p z!uirNz?I)G&xs5D)KpaxW2*A<#=BKjcRN_b96)*A<>?|yahwfv3sw=LFlu?u#&e9r ziC5UI16%}L*_{uz!IOz(8qAebJt$|mgvZL~@EV^BB*6J3g<^Qk2k^CEUR-s)KnDRenJ13`KiSm3qgF_5jPwTitoQWWkAQ$BlHZF&8oFe?9)98FZHk8xWQjM7rp0RcWG zNK*5QeGFPj7c31FI>M4FS>xoS9E8>MOyeiQ$*HY-Q}bGj6R#o%Wb<7jGn)O#)fzd` zX}+>?q^4#>8Fvy{lpD$o#KLMV8j-p`wOfXVT;Auf*mSb%p~k26mZz)K`Kd7VLLqwr z-^sYXz%h`sc`(B)s{^9xc9CuJiXHp9;=d_;$Li@SGWY`$y=~f4663@OxBjT~>76!~ zlAkbG8Pr?cV^cW=t|MXu&eC#v@g7;H&3^A>QOkx+45CR1;tsdWhGe;^NFvj4enKGK zRA_6|qj1>>Y5kXeO;H&};gGq}S#*aR=lLewxMG*xRQUT5?$*|t>{*J{Eh3p&EmCdm z8}IIX2zbQ}@QRy6;p~-`r#hnRAfK4N?_kymqq7pQ#{Y;zcEHp`bBw()qFzI^0w)e? z1e^vN!`*B2y-x?m0MGuv11WJkoqiA?SDC99vKkDliLhE3R;%J_NBIBghKr70@IO3k V`TNsi;Kc Date: Wed, 16 Aug 2023 11:39:30 -0500 Subject: [PATCH 2/3] Make configuration name helper file private --- .../PreviewSnapshots+assertSnapshots.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/PreviewSnapshotsTesting/PreviewSnapshots+assertSnapshots.swift b/Sources/PreviewSnapshotsTesting/PreviewSnapshots+assertSnapshots.swift index ee57952..f299b7f 100644 --- a/Sources/PreviewSnapshotsTesting/PreviewSnapshots+assertSnapshots.swift +++ b/Sources/PreviewSnapshotsTesting/PreviewSnapshots+assertSnapshots.swift @@ -270,7 +270,7 @@ extension PreviewSnapshots { // MARK: Configuration name helper -extension PreviewSnapshots.Configuration { +private extension PreviewSnapshots.Configuration { /// Construct a snapshot name based on the configuration name and an optional suffix. func snapshotName(prefix: String?) -> String { guard let prefix else { return name } From a7660a989ada110f81f0f2d9d0581b1cc975a361 Mon Sep 17 00:00:00 2001 From: John Flanagan Date: Wed, 16 Aug 2023 11:59:47 -0500 Subject: [PATCH 3/3] Fix doc comment --- .../PreviewSnapshots+assertSnapshots.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/PreviewSnapshotsTesting/PreviewSnapshots+assertSnapshots.swift b/Sources/PreviewSnapshotsTesting/PreviewSnapshots+assertSnapshots.swift index f299b7f..a0503ff 100644 --- a/Sources/PreviewSnapshotsTesting/PreviewSnapshots+assertSnapshots.swift +++ b/Sources/PreviewSnapshotsTesting/PreviewSnapshots+assertSnapshots.swift @@ -271,7 +271,7 @@ extension PreviewSnapshots { // MARK: Configuration name helper private extension PreviewSnapshots.Configuration { - /// Construct a snapshot name based on the configuration name and an optional suffix. + /// Construct a snapshot name based on the configuration name and an optional prefix. func snapshotName(prefix: String?) -> String { guard let prefix else { return name } return "\(prefix)-\(name)"