Skip to content

Commit ac7d3b3

Browse files
committed
2D operators tests
1 parent 1168614 commit ac7d3b3

File tree

5 files changed

+147
-4
lines changed

5 files changed

+147
-4
lines changed

.github/workflows/iOS.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ jobs:
1010

1111
steps:
1212
- uses: actions/checkout@v1
13+
- name: Print Swift version
14+
run: swift --version
1315
- name: Generate iOS xcodeproj
1416
run: swift package generate-xcodeproj
1517
- name: Run iOS tests

Sources/RectangleTools/Synthesized Conveniences/TwoDimensional Extensions.swift

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,22 @@ public extension TwoDimensional where Length: AdditiveArithmetic {
296296
static func + (value: Self, multiplier: Length) -> Self {
297297
multiplier + value
298298
}
299+
300+
301+
static func - (multiplier: Length, value: Self) -> Self {
302+
.init(
303+
measurementX: multiplier - value.measurementX,
304+
measurementY: multiplier - value.measurementY
305+
)
306+
}
307+
308+
309+
static func - (value: Self, multiplier: Length) -> Self {
310+
.init(
311+
measurementX: value.measurementX - multiplier,
312+
measurementY: value.measurementY - multiplier
313+
)
314+
}
299315
}
300316

301317

@@ -312,4 +328,20 @@ public extension TwoDimensional where Length: MultiplicativeArithmetic {
312328
static func * (value: Self, multiplier: Length) -> Self {
313329
multiplier * value
314330
}
331+
332+
333+
static func / (multiplier: Length, value: Self) -> Self {
334+
.init(
335+
measurementX: multiplier / value.measurementX,
336+
measurementY: multiplier / value.measurementY
337+
)
338+
}
339+
340+
341+
static func / (value: Self, multiplier: Length) -> Self {
342+
.init(
343+
measurementX: value.measurementX / multiplier,
344+
measurementY: value.measurementY / multiplier
345+
)
346+
}
315347
}

Tests/RectangleToolsTests/Inversion Tests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//
2-
// Test.swift
2+
// InversionTests.swift
33
// RectangleTools
44
//
55
// Created by Ky on 2024-08-05.

Tests/RectangleToolsTests/Test Constants.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import Foundation
1010
import CoreGraphics
11+
1112
import RectangleTools
1213

1314

Tests/RectangleToolsTests/TwoDimensional operator tests.swift

Lines changed: 111 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,120 @@
66
//
77

88
import Testing
9+
import CoreGraphics
910

11+
import RectangleTools
1012

1113

12-
struct TwoDimensional_operatorTests {
14+
15+
struct CGSize_operatorTests {
16+
@Test
17+
func testAdd() {
18+
#expect(CGSize(width: 0, height: 0) == (CGSize.zero + CGFloat.zero))
19+
#expect(CGSize(width: 0, height: 0) == (CGSize.zero - CGFloat.zero))
20+
21+
#expect(CGSize(width: 100, height: 100) == (CGSize.zero + 100))
22+
#expect(CGSize(width: -100, height: -100) == (CGSize.zero - 100))
23+
#expect(CGSize(width: 100, height: 100) == (100 + CGSize.zero))
24+
#expect(CGSize(width: 100, height: 100) == (100 - CGSize.zero))
25+
26+
#expect(CGSize(width: 101, height: 101) == (CGSize.one + 100))
27+
#expect(CGSize(width: -99, height: -99) == (CGSize.one - 100))
28+
#expect(CGSize(width: 101, height: 101) == (100 + CGSize.one))
29+
#expect(CGSize(width: 99, height: 99) == (100 - CGSize.one))
30+
31+
#expect(CGSize(width: 220, height: 316) == (CGSize(width: 173, height: 269) + 47))
32+
#expect(CGSize(width: 126, height: 222) == (CGSize(width: 173, height: 269) - 47))
33+
#expect(CGSize(width: 220, height: 316) == (47 + CGSize(width: 173, height: 269)))
34+
#expect(CGSize(width: -126, height: -222) == (47 - CGSize(width: 173, height: 269)))
35+
}
36+
37+
38+
@Test
39+
func testMultiply() {
40+
#expect(CGSize(width: 0 , height: 0 ) == (CGSize.zero * CGFloat.zero))
41+
#expect(CGSize(width: CGFloat.nan, height: .nan) ~== (CGSize.zero / CGFloat.zero))
42+
43+
#expect(CGSize(width: 0 , height: 0 ) == (CGSize.zero * 100))
44+
#expect(CGSize(width: 0 , height: 0 ) == (CGSize.zero / 100))
45+
#expect(CGSize(width: 0 , height: 0 ) == (100 * CGSize.zero))
46+
#expect(CGSize(width: CGFloat.infinity, height: .infinity) ~== (100 / CGSize.zero))
47+
48+
#expect(CGSize(width: 100 , height: 100 ) == (CGSize.one * 100))
49+
#expect(CGSize(width: 0.01, height: 0.01) ~== (CGSize.one / 100))
50+
#expect(CGSize(width: 100 , height: 100 ) == (100 * CGSize.one))
51+
#expect(CGSize(width: 100 , height: 100 ) == (100 / CGSize.one))
52+
53+
#expect(CGSize(width: 8_131 , height: 12_643 ) == (CGSize(width: 173, height: 269) * 47))
54+
#expect(CGSize(width: 3.68085106, height: 5.72340426) ~== (CGSize(width: 173, height: 269) / 47))
55+
#expect(CGSize(width: 8_131 , height: 12_643 ) == (47 * CGSize(width: 173, height: 269)))
56+
#expect(CGSize(width: 0.27167630, height: 0.17472119) ~== (47 / CGSize(width: 173, height: 269)))
57+
}
58+
}
59+
60+
61+
62+
struct CGPoint_operatorTests {
1363
@Test
14-
func testMultiply() async throws {
15-
<#body#>
64+
func testAdd() {
65+
#expect(CGPoint(x: 0, y: 0) == (CGPoint.zero + CGFloat.zero))
66+
67+
#expect(CGPoint(x: 100, y: 100) == (CGPoint.zero + 100))
68+
#expect(CGPoint(x: -100, y: -100) == (CGPoint.zero - 100))
69+
#expect(CGPoint(x: 100, y: 100) == (100 + CGPoint.zero))
70+
#expect(CGPoint(x: 100, y: 100) == (100 - CGPoint.zero))
71+
72+
#expect(CGPoint(x: 101, y: 101) == (CGPoint.one + 100))
73+
#expect(CGPoint(x: -99, y: -99) == (CGPoint.one - 100))
74+
#expect(CGPoint(x: 101, y: 101) == (100 + CGPoint.one))
75+
#expect(CGPoint(x: 99, y: 99) == (100 - CGPoint.one))
76+
77+
#expect(CGPoint(x: 220, y: 316) == (CGPoint(x: 173, y: 269) + 47))
78+
#expect(CGPoint(x: 126, y: 222) == (CGPoint(x: 173, y: 269) - 47))
79+
#expect(CGPoint(x: 220, y: 316) == (47 + CGPoint(x: 173, y: 269)))
80+
#expect(CGPoint(x: -126, y: -222) == (47 - CGPoint(x: 173, y: 269)))
1681
}
82+
83+
84+
@Test
85+
func testMultiply() {
86+
#expect(CGPoint(x: 0 , y: 0 ) == (CGPoint.zero * CGFloat.zero))
87+
#expect(CGPoint(x: CGFloat.nan, y: .nan) ~== (CGPoint.zero / CGFloat.zero))
88+
89+
#expect(CGPoint(x: 0 , y: 0 ) == (CGPoint.zero * 100))
90+
#expect(CGPoint(x: 0 , y: 0 ) == (CGPoint.zero / 100))
91+
#expect(CGPoint(x: 0 , y: 0 ) == (100 * CGPoint.zero))
92+
#expect(CGPoint(x: CGFloat.infinity, y: .infinity) ~== (100 / CGPoint.zero))
93+
94+
#expect(CGPoint(x: 100 , y: 100 ) == (CGPoint.one * 100))
95+
#expect(CGPoint(x: 0.01, y: 0.01) ~== (CGPoint.one / 100))
96+
#expect(CGPoint(x: 100 , y: 100 ) == (100 * CGPoint.one))
97+
#expect(CGPoint(x: 100 , y: 100 ) == (100 / CGPoint.one))
98+
99+
#expect(CGPoint(x: 8_131 , y: 12_643 ) == (CGPoint(x: 173, y: 269) * 47))
100+
#expect(CGPoint(x: 3.68085106, y: 5.72340426) ~== (CGPoint(x: 173, y: 269) / 47))
101+
#expect(CGPoint(x: 8_131 , y: 12_643 ) == (47 * CGPoint(x: 173, y: 269)))
102+
#expect(CGPoint(x: 0.27167630, y: 0.17472119) ~== (47 / CGPoint(x: 173, y: 269)))
103+
}
104+
}
105+
106+
107+
108+
infix operator ~== : ComparisonPrecedence
109+
110+
private func ~== <T> (lhs: T, rhs: T) -> Bool
111+
where T: TwoDimensional,
112+
T.Length: BinaryFloatingPoint
113+
{
114+
(lhs.measurementX ~== rhs.measurementX)
115+
&& (lhs.measurementY ~== rhs.measurementY)
116+
}
117+
118+
119+
private func ~== <T> (lhs: T, rhs: T) -> Bool
120+
where T: BinaryFloatingPoint
121+
{
122+
(lhs.isNaN && rhs.isNaN)
123+
|| (lhs.isInfinite && rhs.isInfinite)
124+
|| abs(lhs - rhs) < 0.0001
17125
}

0 commit comments

Comments
 (0)