@@ -135,6 +135,18 @@ struct ReferenceTests {
135135 )
136136 ) ,
137137
138+ ReferenceTestCase (
139+ reference:
140+ " example.com/foo@sha512:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef " ,
141+ expected: try ! ImageReference (
142+ registry: " example.com " ,
143+ repository: ImageReference . Repository ( " foo " ) ,
144+ reference: ImageReference . Digest (
145+ " sha512:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef "
146+ )
147+ )
148+ ) ,
149+
138150 ReferenceTestCase (
139151 reference: " foo:1234/bar:1234 " ,
140152 expected: try ! ImageReference (
@@ -262,3 +274,59 @@ struct ReferenceTests {
262274 )
263275 }
264276}
277+
278+ struct DigestTests {
279+ @Test ( arguments: [
280+ (
281+ digest: " sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef " ,
282+ algorithm: " sha256 " , value: " 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef "
283+ ) ,
284+ (
285+ digest: " sha512: "
286+ + " 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef "
287+ + " 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef " ,
288+ algorithm: " sha512 " ,
289+ value: " 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef "
290+ + " 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef "
291+ ) ,
292+ ] )
293+ func testParseValidDigest( digest: String , algorithm: String , value: String ) throws {
294+ let parsed = try ! ImageReference . Digest ( digest)
295+
296+ #expect( parsed. algorithm == algorithm)
297+ #expect( parsed. value == value)
298+ #expect( " \( parsed) " == digest)
299+ }
300+
301+ @Test ( arguments: [
302+ " sha256:0123456789abcdef0123456789abcdef0123456789abcdef " , // short digest
303+ " foo:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef " , // bad algorithm
304+ " sha256-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef " , // bad separator
305+ ] )
306+ func testParseInvalidDigest( digest: String ) throws {
307+ #expect( throws: ImageReference . Digest. ValidationError. invalidReferenceFormat ( digest) ) {
308+ try ImageReference . Digest ( digest)
309+ }
310+ }
311+
312+ @Test
313+ func testDigestEquality( ) throws {
314+ let digest1 = " sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef "
315+ let digest2 = " sha256:abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789 "
316+ let digest3 =
317+ " sha512:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef "
318+ + " 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef "
319+
320+ #expect( try ImageReference . Digest ( digest1) != ImageReference . Digest ( digest2) )
321+ #expect( try ImageReference . Digest ( digest1) != ImageReference . Digest ( digest3) )
322+
323+ // Same string, parsed twice, should yield the same digest
324+ let sha256left = try ImageReference . Digest ( digest1)
325+ let sha256right = try ImageReference . Digest ( digest1)
326+ #expect( sha256left == sha256right)
327+
328+ let sha512left = try ImageReference . Digest ( digest3)
329+ let sha512right = try ImageReference . Digest ( digest3)
330+ #expect( sha512left == sha512right)
331+ }
332+ }
0 commit comments