Skip to content

Commit 4a7a496

Browse files
committed
Merge pull request #566 from frootloops/test-algorithm
[tests] basic min/max test cases
2 parents 101cf49 + 9f728c6 commit 4a7a496

File tree

2 files changed

+56
-24
lines changed

2 files changed

+56
-24
lines changed

stdlib/public/core/Algorithm.swift

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -74,27 +74,15 @@ public func min<T : Comparable>(x: T, _ y: T, _ z: T, _ rest: T...) -> T {
7474
/// Returns the greater of `x` and `y`.
7575
@warn_unused_result
7676
public func max<T : Comparable>(x: T, _ y: T) -> T {
77-
var r = y
78-
if y < x {
79-
r = x
80-
}
81-
return r
77+
return y >= x ? y : x
8278
}
8379

8480
/// Returns the greatest argument passed.
8581
@warn_unused_result
8682
public func max<T : Comparable>(x: T, _ y: T, _ z: T, _ rest: T...) -> T {
87-
var r = y
88-
if y < x {
89-
r = x
90-
}
91-
if r < z {
92-
r = z
93-
}
94-
for t in rest {
95-
if t >= r {
96-
r = t
97-
}
83+
var r = max(max(x, y), z)
84+
for t in rest where t >= r {
85+
r = t
9886
}
9987
return r
10088
}

validation-test/stdlib/Algorithm.swift

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,58 @@ public func == (
2525

2626
// FIXME(prext): move this struct to the point of use.
2727
Algorithm.test("min,max") {
28-
expectEqual(2, min(3, 2))
29-
expectEqual(3, min(3, 7, 5))
30-
expectEqual(3, max(3, 2))
31-
expectEqual(7, max(3, 7, 5))
32-
33-
// FIXME: add tests that check that min/max return the
34-
// first element of the sequence (by reference equality) that satisfy the
35-
// condition.
28+
// Identities are unique in this set.
29+
let a1 = MinimalComparableValue(0, identity: 1)
30+
let a2 = MinimalComparableValue(0, identity: 2)
31+
let a3 = MinimalComparableValue(0, identity: 3)
32+
let b1 = MinimalComparableValue(1, identity: 4)
33+
let b2 = MinimalComparableValue(1, identity: 5)
34+
let b3 = MinimalComparableValue(1, identity: 6)
35+
let c1 = MinimalComparableValue(2, identity: 7)
36+
let c2 = MinimalComparableValue(2, identity: 8)
37+
let c3 = MinimalComparableValue(2, identity: 9)
38+
39+
// 2-arg min()
40+
expectEqual(a1.identity, min(a1, b1).identity)
41+
expectEqual(a1.identity, min(b1, a1).identity)
42+
expectEqual(a1.identity, min(a1, a2).identity)
43+
44+
// 2-arg max()
45+
expectEqual(c1.identity, max(c1, b1).identity)
46+
expectEqual(c1.identity, max(b1, c1).identity)
47+
expectEqual(c1.identity, max(c2, c1).identity)
48+
49+
// 3-arg min()
50+
expectEqual(a1.identity, min(a1, b1, c1).identity)
51+
expectEqual(a1.identity, min(b1, a1, c1).identity)
52+
expectEqual(a1.identity, min(c1, b1, a1).identity)
53+
expectEqual(a1.identity, min(c1, a1, b1).identity)
54+
expectEqual(a1.identity, min(a1, a2, a3).identity)
55+
expectEqual(a1.identity, min(a1, a2, b1).identity)
56+
expectEqual(a1.identity, min(a1, b1, a2).identity)
57+
expectEqual(a1.identity, min(b1, a1, a2).identity)
58+
59+
// 3-arg max()
60+
expectEqual(c1.identity, max(c1, b1, a1).identity)
61+
expectEqual(c1.identity, max(a1, c1, b1).identity)
62+
expectEqual(c1.identity, max(b1, a1, c1).identity)
63+
expectEqual(c1.identity, max(b1, c1, a1).identity)
64+
expectEqual(c1.identity, max(c3, c2, c1).identity)
65+
expectEqual(c1.identity, max(c2, c1, b1).identity)
66+
expectEqual(c1.identity, max(c2, b1, c1).identity)
67+
expectEqual(c1.identity, max(b1, c2, c1).identity)
68+
69+
// 4-arg min()
70+
expectEqual(a1.identity, min(a1, b1, a2, b2).identity)
71+
expectEqual(a1.identity, min(b1, a1, a2, b2).identity)
72+
expectEqual(a1.identity, min(c1, b1, b2, a1).identity)
73+
expectEqual(a1.identity, min(c1, b1, a1, a2).identity)
74+
75+
// 4-arg max()
76+
expectEqual(c1.identity, max(c2, b1, c1, b2).identity)
77+
expectEqual(c1.identity, max(b1, c2, c1, b2).identity)
78+
expectEqual(c1.identity, max(a1, b1, b2, c1).identity)
79+
expectEqual(c1.identity, max(a1, b1, c2, c1).identity)
3680
}
3781

3882
Algorithm.test("sorted/strings")

0 commit comments

Comments
 (0)