aboutsummaryrefslogtreecommitdiff
path: root/test/behavior/maximum_minimum.zig
diff options
context:
space:
mode:
authormlugg <mlugg@mlugg.co.uk>2023-04-30 10:30:40 +0100
committerAndrew Kelley <andrew@ziglang.org>2023-05-02 16:46:27 -0700
commit152c7b1885a0ed8e5a2435ef7b51568b357eaea4 (patch)
treebbc028d9f181ae476121fdc5b71b843887f0b237 /test/behavior/maximum_minimum.zig
parente9cbdb2cfd6ccc51b50e97e7df419451aa8a1c95 (diff)
downloadzig-152c7b1885a0ed8e5a2435ef7b51568b357eaea4.tar.gz
zig-152c7b1885a0ed8e5a2435ef7b51568b357eaea4.zip
Implement multi-argument @min/@max and notice bounds
Resolves: #14039
Diffstat (limited to 'test/behavior/maximum_minimum.zig')
-rw-r--r--test/behavior/maximum_minimum.zig56
1 files changed, 56 insertions, 0 deletions
diff --git a/test/behavior/maximum_minimum.zig b/test/behavior/maximum_minimum.zig
index 9a4ae40eef..d7b93c56c0 100644
--- a/test/behavior/maximum_minimum.zig
+++ b/test/behavior/maximum_minimum.zig
@@ -106,3 +106,59 @@ test "@min/@max on lazy values" {
const size = @max(@sizeOf(A), @sizeOf(B));
try expect(size == @sizeOf(B));
}
+
+test "@min/@max more than two arguments" {
+ const x: u32 = 30;
+ const y: u32 = 10;
+ const z: u32 = 20;
+ try expectEqual(@as(u32, 10), @min(x, y, z));
+ try expectEqual(@as(u32, 30), @max(x, y, z));
+}
+
+test "@min/@max more than two vector arguments" {
+ if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
+
+ const x: @Vector(2, u32) = .{ 3, 2 };
+ const y: @Vector(2, u32) = .{ 4, 1 };
+ const z: @Vector(2, u32) = .{ 5, 0 };
+ try expectEqual(@Vector(2, u32){ 3, 0 }, @min(x, y, z));
+ try expectEqual(@Vector(2, u32){ 5, 2 }, @max(x, y, z));
+}
+
+test "@min/@max notices bounds" {
+ if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
+
+ var x: u16 = 20;
+ const y = 30;
+ var z: u32 = 100;
+ const min = @min(x, y, z);
+ const max = @max(x, y, z);
+ try expectEqual(x, min);
+ try expectEqual(u5, @TypeOf(min));
+ try expectEqual(z, max);
+ try expectEqual(u32, @TypeOf(max));
+}
+
+test "@min/@max notices vector bounds" {
+ if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
+
+ var x: @Vector(2, u16) = .{ 140, 40 };
+ const y: @Vector(2, u64) = .{ 5, 100 };
+ var z: @Vector(2, u32) = .{ 10, 300 };
+ const min = @min(x, y, z);
+ const max = @max(x, y, z);
+ try expectEqual(@Vector(2, u32){ 5, 40 }, min);
+ try expectEqual(@Vector(2, u7), @TypeOf(min));
+ try expectEqual(@Vector(2, u32){ 140, 300 }, max);
+ try expectEqual(@Vector(2, u32), @TypeOf(max));
+}