Skip to content

Commit 5550cee

Browse files
authored
Merge pull request #21 from tayloraswift/uuid
UUID
2 parents e604843 + 40421db commit 5550cee

21 files changed

+714
-639
lines changed

Package.resolved

Lines changed: 0 additions & 23 deletions
This file was deleted.

Package.swift

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
1-
// swift-tools-version:5.8
1+
// swift-tools-version:6.0
22
import PackageDescription
33

44
let package:Package = .init(
55
name: "swift-hash",
6-
platforms: [.macOS(.v10_15), .iOS(.v13), .tvOS(.v13), .watchOS(.v6)],
6+
platforms: [.macOS(.v14), .iOS(.v17), .tvOS(.v17), .visionOS(.v1), .watchOS(.v10)],
77
products: [
8-
.library(name: "Base16", targets: ["Base16"]),
9-
.library(name: "Base64", targets: ["Base64"]),
10-
.library(name: "CRC", targets: ["CRC"]),
11-
.library(name: "InlineBuffer", targets: ["InlineBuffer"]),
12-
.library(name: "MD5", targets: ["MD5"]),
8+
.library(name: "Base16", targets: ["Base16"]),
9+
.library(name: "Base64", targets: ["Base64"]),
10+
.library(name: "CRC", targets: ["CRC"]),
11+
.library(name: "InlineBuffer", targets: ["InlineBuffer"]),
12+
.library(name: "MD5", targets: ["MD5"]),
1313
.library(name: "MessageAuthentication", targets: ["MessageAuthentication"]),
14-
.library(name: "SHA1", targets: ["SHA1"]),
15-
.library(name: "SHA2", targets: ["SHA2"]),
16-
],
17-
dependencies: [
18-
.package(url: "https://github.com/tayloraswift/swift-grammar", .upToNextMinor(
19-
from: "0.4.0")),
14+
.library(name: "SHA1", targets: ["SHA1"]),
15+
.library(name: "SHA2", targets: ["SHA2"]),
16+
.library(name: "UUID", targets: ["UUID"]),
2017
],
2118
targets: [
2219
.target(name: "BaseDigits"),
@@ -56,27 +53,28 @@ let package:Package = .init(
5653
.target(name: "MessageAuthentication"),
5754
]),
5855

59-
.executableTarget(name: "Base64Tests",
56+
.target(name: "UUID",
57+
dependencies: [
58+
.target(name: "Base16"),
59+
]),
60+
61+
.testTarget(name: "Base64Tests",
6062
dependencies: [
61-
.product(name: "Testing_", package: "swift-grammar"),
6263
.target(name: "Base64"),
6364
]),
6465

65-
.executableTarget(name: "CRCTests",
66+
.testTarget(name: "CRCTests",
6667
dependencies: [
67-
.product(name: "Testing_", package: "swift-grammar"),
6868
.target(name: "CRC"),
6969
]),
7070

71-
.executableTarget(name: "MD5Tests",
71+
.testTarget(name: "MD5Tests",
7272
dependencies: [
7373
.target(name: "MD5"),
74-
.product(name: "Testing_", package: "swift-grammar"),
7574
]),
7675

77-
.executableTarget(name: "SHA2Tests",
76+
.testTarget(name: "SHA2Tests",
7877
dependencies: [
79-
.product(name: "Testing_", package: "swift-grammar"),
8078
.target(name: "SHA2"),
8179
]),
8280
]
@@ -87,12 +85,7 @@ for target:PackageDescription.Target in package.targets
8785
{
8886
var settings:[PackageDescription.SwiftSetting] = $0 ?? []
8987

90-
settings.append(.enableUpcomingFeature("BareSlashRegexLiterals"))
91-
settings.append(.enableUpcomingFeature("ConciseMagicFile"))
92-
settings.append(.enableUpcomingFeature("DeprecateApplicationMain"))
9388
settings.append(.enableUpcomingFeature("ExistentialAny"))
94-
settings.append(.enableUpcomingFeature("GlobalConcurrency"))
95-
settings.append(.enableUpcomingFeature("IsolatedDefaultValues"))
9689
settings.append(.enableExperimentalFeature("StrictConcurrency"))
9790

9891
settings.append(.define("DEBUG", .when(configuration: .debug)))

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
## Requirements
2020

21-
The swift-hash library requires Swift 5.9 or later.
21+
The swift-hash library requires Swift 6.0 or later.
2222

2323

2424
| Platform | Status |
@@ -65,3 +65,7 @@ This package vends the following library products:
6565
1. [`SHA2`](https://swiftinit.org/docs/swift-hash/sha2)
6666

6767
Implements the [SHA-256](https://en.wikipedia.org/wiki/SHA-2) hashing function.
68+
69+
1. [`UUID`](https://swiftinit.org/docs/swift-hash/uuid)
70+
71+
Provides a UUID type.

Scripts/TestAll

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#!/bin/bash
22
set -e
3+
34
swift --version
4-
swift build -c release
5-
for f in .build/release/*Tests; do
6-
$f
7-
done
5+
swift build -c release --build-tests
6+
swift test -c release --skip-build

Sources/Base64Tests/Base64Test.swift renamed to Sources/Base64Tests/Encoding.TestCase.swift

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
import Base64
22

3-
struct Base64Test
3+
extension Encoding
44
{
5-
let name:String
6-
let degenerate:String?
7-
let canonical:String
8-
let expected:[UInt8]
9-
10-
init(name:String,
11-
degenerate:String? = nil,
12-
canonical:String,
13-
expected:[UInt8])
5+
struct TestCase
146
{
15-
self.name = name
16-
self.degenerate = degenerate
17-
self.canonical = canonical
18-
self.expected = expected
7+
let name:String
8+
let degenerate:String?
9+
let canonical:String
10+
let expected:[UInt8]
11+
12+
init(name:String,
13+
degenerate:String? = nil,
14+
canonical:String,
15+
expected:[UInt8])
16+
{
17+
self.name = name
18+
self.degenerate = degenerate
19+
self.canonical = canonical
20+
self.expected = expected
21+
}
1922
}
2023
}
21-
extension Base64Test
24+
extension Encoding.TestCase
2225
{
2326
init<UTF8>(name:String,
2427
degenerate:String? = nil,

Sources/Base64Tests/Encoding.swift

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
import Base64
2+
import Testing
3+
4+
@Suite
5+
struct Encoding
6+
{
7+
private
8+
static let binary:[TestCase] = [
9+
.init(name: "all",
10+
degenerate:
11+
"""
12+
AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4v\
13+
MDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5f\
14+
YGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6P\
15+
kJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/\
16+
wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v\
17+
8PHy8/T19vf4+fr7/P3+/w
18+
""",
19+
canonical:
20+
"""
21+
AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4v\
22+
MDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5f\
23+
YGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6P\
24+
kJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/\
25+
wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v\
26+
8PHy8/T19vf4+fr7/P3+/w==
27+
""",
28+
expected: 0x00 ... 0xff),
29+
30+
.init(name: "reversed",
31+
degenerate:
32+
"""
33+
//79/Pv6+fj39vX08/Lx8O/u7ezr6uno5+bl5OPi4eDf3t3c29rZ2NfW1dTT0tHQ\
34+
z87NzMvKycjHxsXEw8LBwL++vby7urm4t7a1tLOysbCvrq2sq6qpqKempaSjoqGg\
35+
n56dnJuamZiXlpWUk5KRkI+OjYyLiomIh4aFhIOCgYB/fn18e3p5eHd2dXRzcnFw\
36+
b25tbGtqaWhnZmVkY2JhYF9eXVxbWllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkFA\
37+
Pz49PDs6OTg3NjU0MzIxMC8uLSwrKikoJyYlJCMiISAfHh0cGxoZGBcWFRQTEhEQ\
38+
Dw4NDAsKCQgHBgUEAwIBAA
39+
""",
40+
canonical:
41+
"""
42+
//79/Pv6+fj39vX08/Lx8O/u7ezr6uno5+bl5OPi4eDf3t3c29rZ2NfW1dTT0tHQ\
43+
z87NzMvKycjHxsXEw8LBwL++vby7urm4t7a1tLOysbCvrq2sq6qpqKempaSjoqGg\
44+
n56dnJuamZiXlpWUk5KRkI+OjYyLiomIh4aFhIOCgYB/fn18e3p5eHd2dXRzcnFw\
45+
b25tbGtqaWhnZmVkY2JhYF9eXVxbWllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkFA\
46+
Pz49PDs6OTg3NjU0MzIxMC8uLSwrKikoJyYlJCMiISAfHh0cGxoZGBcWFRQTEhEQ\
47+
Dw4NDAsKCQgHBgUEAwIBAA==
48+
""",
49+
expected: (0x00 ... 0xff).reversed()),
50+
]
51+
52+
private
53+
static let string:[TestCase] = [
54+
.init(name: "empty",
55+
canonical: "",
56+
expected: ""),
57+
58+
.init(name: "single",
59+
degenerate: "YQ",
60+
canonical: "YQ==",
61+
expected: "a"),
62+
63+
.init(name: "double",
64+
degenerate: "YWI",
65+
canonical: "YWI=",
66+
expected: "ab"),
67+
68+
.init(name: "triple",
69+
canonical: "YWJj",
70+
expected: "abc"),
71+
72+
.init(name: "basic",
73+
canonical: "TWFueSBoYW5kcyBtYWtlIGxpZ2h0IHdvcmsu",
74+
expected: "Many hands make light work."),
75+
76+
.init(name: "whitespace",
77+
degenerate:
78+
"""
79+
T\u{0C}WFueSBoY W5kc\ryBtYWt\tlIGxpZ2
80+
h0IHd
81+
82+
vcmsu
83+
""",
84+
canonical: "TWFueSBoYW5kcyBtYWtlIGxpZ2h0IHdvcmsu",
85+
expected: "Many hands make light work."),
86+
87+
.init(name: "padding-11-16",
88+
degenerate: "bGlnaHQgd29yay4",
89+
canonical: "bGlnaHQgd29yay4=",
90+
expected: "light work."),
91+
92+
.init(name: "padding-10-16",
93+
degenerate: "bGlnaHQgd29yaw",
94+
canonical: "bGlnaHQgd29yaw==",
95+
expected: "light work"),
96+
97+
.init(name: "padding-9-12",
98+
canonical: "bGlnaHQgd29y",
99+
expected: "light wor"),
100+
101+
.init(name: "padding-8-12",
102+
degenerate: "bGlnaHQgd28",
103+
canonical: "bGlnaHQgd28=",
104+
expected: "light wo"),
105+
106+
.init(name: "padding-7-12",
107+
degenerate: "bGlnaHQgdw",
108+
canonical: "bGlnaHQgdw==",
109+
expected: "light w"),
110+
]
111+
112+
@Test(arguments: Self.binary + Self.string)
113+
static func defaultDigits(_ test:TestCase) throws
114+
{
115+
#expect(test.expected == Base64.decode(test.canonical.utf8, to: [UInt8].self))
116+
#expect(test.canonical == Base64.encode(test.expected))
117+
118+
if let degenerate:String = test.degenerate
119+
{
120+
let decoded:[UInt8] = Base64.decode(degenerate, to: [UInt8].self)
121+
let encoded:String = Base64.encode(decoded)
122+
#expect(decoded == test.expected)
123+
#expect(encoded == test.canonical)
124+
}
125+
}
126+
127+
@Test
128+
static func urlSafeDigits()
129+
{
130+
let encoded:String = Base64.encode("<<???>>".utf8,
131+
padding: false,
132+
with: Base64.SafeDigits.self)
133+
134+
#expect(encoded == "PDw_Pz8-Pg")
135+
}
136+
}

0 commit comments

Comments
 (0)