Skip to content

Commit 858247b

Browse files
author
Jairon Terrero
committed
feature: Adds a unitless percent unit
1 parent eefd864 commit 858247b

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
@@ -379,5 +379,9 @@ class Registry {
379379
DefaultUnits.imperialGallon,
380380
DefaultUnits.imperialPeck,
381381
DefaultUnits.metricCup,
382+
383+
// MARK: Unitless
384+
385+
DefaultUnits.percent
382386
]
383387
}

Sources/Units/Unit/DefaultUnits.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,4 +1271,13 @@ enum DefaultUnits {
12711271
dimension: [.Length: 3],
12721272
coefficient: 0.00025
12731273
)
1274+
1275+
// MARK: Unitless
1276+
1277+
static let percent = try! DefinedUnit(
1278+
name: "percent",
1279+
symbol: "%",
1280+
dimension: [:],
1281+
coefficient: 0.01
1282+
)
12741283
}

Sources/Units/Unit/Unit+DefaultUnits.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,4 +278,8 @@ public extension Unit {
278278
static let imperialGallon = Unit(definedBy: DefaultUnits.imperialGallon)
279279
static let imperialPeck = Unit(definedBy: DefaultUnits.imperialPeck)
280280
static let metricCup = Unit(definedBy: DefaultUnits.metricCup)
281+
282+
// MARK: Unitless
283+
284+
static let percent = Unit(definedBy: DefaultUnits.percent)
281285
}

Tests/UnitsTests/MeasurementTests.swift

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,64 @@ final class MeasurementTests: XCTestCase {
210210
)
211211
}
212212

213+
func testPercent() throws {
214+
XCTAssertEqual(
215+
1.measured(in: .percent),
216+
1.measured(in: .percent)
217+
)
218+
219+
XCTAssertNotEqual(
220+
100.measured(in: .percent),
221+
1.measured(in: .none)
222+
)
223+
224+
try {
225+
let percent1 = 5.measured(in: .percent)
226+
let percent2 = 5.measured(in: .percent)
227+
XCTAssertEqual(
228+
try percent1 + percent2,
229+
10.measured(in: .percent),
230+
accuracy: accuracy
231+
)
232+
}()
233+
234+
try {
235+
let percent1 = 5.measured(in: .percent)
236+
let value2 = 5.measured(in: .none)
237+
XCTAssertThrowsError(try percent1 + value2)
238+
}()
239+
240+
XCTAssertTrue(
241+
2.measured(in: .percent).isDimensionallyEquivalent(
242+
to: 2.measured(in: .percent)
243+
)
244+
)
245+
246+
XCTAssertTrue(
247+
2.measured(in: .percent).isDimensionallyEquivalent(
248+
to: 2.measured(in: .none)
249+
)
250+
)
251+
252+
XCTAssertEqual(
253+
try 1.measured(in: .percent).convert(to: .none),
254+
0.01.measured(in: .none),
255+
accuracy: accuracy
256+
)
257+
258+
XCTAssertEqual(
259+
try 1.measured(in: .none).convert(to: .percent),
260+
100.measured(in: .percent),
261+
accuracy: accuracy
262+
)
263+
264+
_ = {
265+
let measurement = 1.measured(in: .percent) / 2.measured(in: .second)
266+
XCTAssertEqual(measurement.unit, Unit.percent / Unit.second)
267+
XCTAssertEqual(measurement.value, 0.5, accuracy: accuracy)
268+
}()
269+
}
270+
213271
func testComplexArithmetic() throws {
214272
XCTAssertEqual(
215273
try 1.measured(in: .mile / .mile) * 1.measured(in: .mile) - 1.measured(in: .mile),

0 commit comments

Comments
 (0)