Skip to content

Commit 21f7aa4

Browse files
author
Jairon Terrero
committed
feature: Adds a unitless percent unit
1 parent 4e14254 commit 21f7aa4

4 files changed

Lines changed: 75 additions & 0 deletions

File tree

Sources/Units/Registry.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,5 +336,9 @@ internal class Registry {
336336
DefaultUnits.imperialPint,
337337
DefaultUnits.imperialGallon,
338338
DefaultUnits.metricCup,
339+
340+
// MARK: Unitless
341+
342+
DefaultUnits.percent
339343
]
340344
}

Sources/Units/Unit/DefaultUnits.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,4 +1055,13 @@ enum DefaultUnits {
10551055
dimension: [.Length: 3],
10561056
coefficient: 0.00025
10571057
)
1058+
1059+
// MARK: Unitless
1060+
1061+
static let percent = try! DefinedUnit(
1062+
name: "percent",
1063+
symbol: "%",
1064+
dimension: [:],
1065+
coefficient: 0.01
1066+
)
10581067
}

Sources/Units/Unit/Unit+DefaultUnits.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,4 +245,8 @@ public extension Unit {
245245
static let imperialPint = Unit(definedBy: DefaultUnits.imperialPint)
246246
static let imperialGallon = Unit(definedBy: DefaultUnits.imperialGallon)
247247
static let metricCup = Unit(definedBy: DefaultUnits.metricCup)
248+
249+
// MARK: Unitless
250+
251+
static let percent = Unit(definedBy: DefaultUnits.percent)
248252
}

Tests/UnitsTests/MeasurementTests.swift

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,64 @@ final class MeasurementTests: XCTestCase {
196196
)
197197
}
198198

199+
func testPercent() throws {
200+
XCTAssertEqual(
201+
1.measured(in: .percent),
202+
1.measured(in: .percent)
203+
)
204+
205+
XCTAssertNotEqual(
206+
100.measured(in: .percent),
207+
1.measured(in: .none)
208+
)
209+
210+
try {
211+
let percent1 = 5.measured(in: .percent)
212+
let percent2 = 5.measured(in: .percent)
213+
XCTAssertEqual(
214+
try percent1 + percent2,
215+
10.measured(in: .percent),
216+
accuracy: accuracy
217+
)
218+
}()
219+
220+
try {
221+
let percent1 = 5.measured(in: .percent)
222+
let value2 = 5.measured(in: .none)
223+
XCTAssertThrowsError(try percent1 + value2)
224+
}()
225+
226+
XCTAssertTrue(
227+
2.measured(in: .percent).isDimensionallyEquivalent(
228+
to: 2.measured(in: .percent)
229+
)
230+
)
231+
232+
XCTAssertTrue(
233+
2.measured(in: .percent).isDimensionallyEquivalent(
234+
to: 2.measured(in: .none)
235+
)
236+
)
237+
238+
XCTAssertEqual(
239+
try 1.measured(in: .percent).convert(to: .none),
240+
0.01.measured(in: .none),
241+
accuracy: accuracy
242+
)
243+
244+
XCTAssertEqual(
245+
try 1.measured(in: .none).convert(to: .percent),
246+
100.measured(in: .percent),
247+
accuracy: accuracy
248+
)
249+
250+
_ = {
251+
let measurement = 1.measured(in: .percent) / 2.measured(in: .second)
252+
XCTAssertEqual(measurement.unit, Unit.percent / Unit.second)
253+
XCTAssertEqual(measurement.value, 0.5, accuracy: accuracy)
254+
}()
255+
}
256+
199257
func testComplexArithmetic() throws {
200258
XCTAssertEqual(
201259
try 1.measured(in: .mile / .mile) * 1.measured(in: .mile) - 1.measured(in: .mile),

0 commit comments

Comments
 (0)