| ... | @@ -3,8 +3,6 @@ const builtin = @import("builtin"); | ... | @@ -3,8 +3,6 @@ const builtin = @import("builtin"); |
| 3 | const mem = std.mem; | 3 | const mem = std.mem; |
| 4 | const math = std.math; | 4 | const math = std.math; |
| 5 | const expect = std.testing.expect; | 5 | const expect = std.testing.expect; |
| 6 | const expectEqual = std.testing.expectEqual; | | |
| 7 | const expectApproxEqRel = std.testing.expectApproxEqRel; | | |
| 8 | const Vector = std.meta.Vector; | 6 | const Vector = std.meta.Vector; |
| 9 | | 7 | |
| 10 | test "implicit cast vector to array - bool" { | 8 | test "implicit cast vector to array - bool" { |
| ... | @@ -118,10 +116,16 @@ test "implicit cast vector to array" { | ... | @@ -118,10 +116,16 @@ test "implicit cast vector to array" { |
| 118 | | 116 | |
| 119 | test "array to vector" { | 117 | test "array to vector" { |
| 120 | if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO | 118 | if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO |
| 121 | var foo: f32 = 3.14; | 119 | const S = struct { |
| 122 | var arr = [4]f32{ foo, 1.5, 0.0, 0.0 }; | 120 | fn doTheTest() !void { |
| 123 | var vec: Vector(4, f32) = arr; | 121 | var foo: f32 = 3.14; |
| 124 | _ = vec; | 122 | var arr = [4]f32{ foo, 1.5, 0.0, 0.0 }; |
| | 123 | var vec: Vector(4, f32) = arr; |
| | 124 | try expect(mem.eql(f32, &@as([4]f32, vec), &arr)); |
| | 125 | } |
| | 126 | }; |
| | 127 | try S.doTheTest(); |
| | 128 | comptime try S.doTheTest(); |
| 125 | } | 129 | } |
| 126 | | 130 | |
| 127 | test "vector casts of sizes not divisible by 8" { | 131 | test "vector casts of sizes not divisible by 8" { |
| ... | @@ -160,9 +164,9 @@ test "vector @splat" { | ... | @@ -160,9 +164,9 @@ test "vector @splat" { |
| 160 | fn testForT(comptime N: comptime_int, v: anytype) !void { | 164 | fn testForT(comptime N: comptime_int, v: anytype) !void { |
| 161 | const T = @TypeOf(v); | 165 | const T = @TypeOf(v); |
| 162 | var vec = @splat(N, v); | 166 | var vec = @splat(N, v); |
| 163 | try expectEqual(Vector(N, T), @TypeOf(vec)); | 167 | try expect(Vector(N, T) == @TypeOf(vec)); |
| 164 | var as_array = @as([N]T, vec); | 168 | var as_array = @as([N]T, vec); |
| 165 | for (as_array) |elem| try expectEqual(v, elem); | 169 | for (as_array) |elem| try expect(v == elem); |
| 166 | } | 170 | } |
| 167 | fn doTheTest() !void { | 171 | fn doTheTest() !void { |
| 168 | // Splats with multiple-of-8 bit types that fill a 128bit vector. | 172 | // Splats with multiple-of-8 bit types that fill a 128bit vector. |
| ... | @@ -294,27 +298,27 @@ test "vector comparison operators" { | ... | @@ -294,27 +298,27 @@ test "vector comparison operators" { |
| 294 | { | 298 | { |
| 295 | const v1: Vector(4, bool) = [_]bool{ true, false, true, false }; | 299 | const v1: Vector(4, bool) = [_]bool{ true, false, true, false }; |
| 296 | const v2: Vector(4, bool) = [_]bool{ false, true, false, true }; | 300 | const v2: Vector(4, bool) = [_]bool{ false, true, false, true }; |
| 297 | try expectEqual(@splat(4, true), v1 == v1); | 301 | try expect(mem.eql(bool, &@as([4]bool, @splat(4, true)), &@as([4]bool, v1 == v1))); |
| 298 | try expectEqual(@splat(4, false), v1 == v2); | 302 | try expect(mem.eql(bool, &@as([4]bool, @splat(4, false)), &@as([4]bool, v1 == v2))); |
| 299 | try expectEqual(@splat(4, true), v1 != v2); | 303 | try expect(mem.eql(bool, &@as([4]bool, @splat(4, true)), &@as([4]bool, v1 != v2))); |
| 300 | try expectEqual(@splat(4, false), v2 != v2); | 304 | try expect(mem.eql(bool, &@as([4]bool, @splat(4, false)), &@as([4]bool, v2 != v2))); |
| 301 | } | 305 | } |
| 302 | { | 306 | { |
| 303 | const v1 = @splat(4, @as(u32, 0xc0ffeeee)); | 307 | const v1 = @splat(4, @as(u32, 0xc0ffeeee)); |
| 304 | const v2: Vector(4, c_uint) = v1; | 308 | const v2: Vector(4, c_uint) = v1; |
| 305 | const v3 = @splat(4, @as(u32, 0xdeadbeef)); | 309 | const v3 = @splat(4, @as(u32, 0xdeadbeef)); |
| 306 | try expectEqual(@splat(4, true), v1 == v2); | 310 | try expect(mem.eql(bool, &@as([4]bool, @splat(4, true)), &@as([4]bool, v1 == v2))); |
| 307 | try expectEqual(@splat(4, false), v1 == v3); | 311 | try expect(mem.eql(bool, &@as([4]bool, @splat(4, false)), &@as([4]bool, v1 == v3))); |
| 308 | try expectEqual(@splat(4, true), v1 != v3); | 312 | try expect(mem.eql(bool, &@as([4]bool, @splat(4, true)), &@as([4]bool, v1 != v3))); |
| 309 | try expectEqual(@splat(4, false), v1 != v2); | 313 | try expect(mem.eql(bool, &@as([4]bool, @splat(4, false)), &@as([4]bool, v1 != v2))); |
| 310 | } | 314 | } |
| 311 | { | 315 | { |
| 312 | // Comptime-known LHS/RHS | 316 | // Comptime-known LHS/RHS |
| 313 | var v1: @Vector(4, u32) = [_]u32{ 2, 1, 2, 1 }; | 317 | var v1: @Vector(4, u32) = [_]u32{ 2, 1, 2, 1 }; |
| 314 | const v2 = @splat(4, @as(u32, 2)); | 318 | const v2 = @splat(4, @as(u32, 2)); |
| 315 | const v3: @Vector(4, bool) = [_]bool{ true, false, true, false }; | 319 | const v3: @Vector(4, bool) = [_]bool{ true, false, true, false }; |
| 316 | try expectEqual(v3, v1 == v2); | 320 | try expect(mem.eql(bool, &@as([4]bool, v3), &@as([4]bool, v1 == v2))); |
| 317 | try expectEqual(v3, v2 == v1); | 321 | try expect(mem.eql(bool, &@as([4]bool, v3), &@as([4]bool, v2 == v1))); |
| 318 | } | 322 | } |
| 319 | } | 323 | } |
| 320 | }; | 324 | }; |
| ... | @@ -329,20 +333,20 @@ test "vector division operators" { | ... | @@ -329,20 +333,20 @@ test "vector division operators" { |
| 329 | if (!comptime std.meta.trait.isSignedInt(T)) { | 333 | if (!comptime std.meta.trait.isSignedInt(T)) { |
| 330 | const d0 = x / y; | 334 | const d0 = x / y; |
| 331 | for (@as([4]T, d0)) |v, i| { | 335 | for (@as([4]T, d0)) |v, i| { |
| 332 | try expectEqual(x[i] / y[i], v); | 336 | try expect(x[i] / y[i] == v); |
| 333 | } | 337 | } |
| 334 | } | 338 | } |
| 335 | const d1 = @divExact(x, y); | 339 | const d1 = @divExact(x, y); |
| 336 | for (@as([4]T, d1)) |v, i| { | 340 | for (@as([4]T, d1)) |v, i| { |
| 337 | try expectEqual(@divExact(x[i], y[i]), v); | 341 | try expect(@divExact(x[i], y[i]) == v); |
| 338 | } | 342 | } |
| 339 | const d2 = @divFloor(x, y); | 343 | const d2 = @divFloor(x, y); |
| 340 | for (@as([4]T, d2)) |v, i| { | 344 | for (@as([4]T, d2)) |v, i| { |
| 341 | try expectEqual(@divFloor(x[i], y[i]), v); | 345 | try expect(@divFloor(x[i], y[i]) == v); |
| 342 | } | 346 | } |
| 343 | const d3 = @divTrunc(x, y); | 347 | const d3 = @divTrunc(x, y); |
| 344 | for (@as([4]T, d3)) |v, i| { | 348 | for (@as([4]T, d3)) |v, i| { |
| 345 | try expectEqual(@divTrunc(x[i], y[i]), v); | 349 | try expect(@divTrunc(x[i], y[i]) == v); |
| 346 | } | 350 | } |
| 347 | } | 351 | } |
| 348 | | 352 | |
| ... | @@ -350,16 +354,16 @@ test "vector division operators" { | ... | @@ -350,16 +354,16 @@ test "vector division operators" { |
| 350 | if ((!comptime std.meta.trait.isSignedInt(T)) and @typeInfo(T) != .Float) { | 354 | if ((!comptime std.meta.trait.isSignedInt(T)) and @typeInfo(T) != .Float) { |
| 351 | const r0 = x % y; | 355 | const r0 = x % y; |
| 352 | for (@as([4]T, r0)) |v, i| { | 356 | for (@as([4]T, r0)) |v, i| { |
| 353 | try expectEqual(x[i] % y[i], v); | 357 | try expect(x[i] % y[i] == v); |
| 354 | } | 358 | } |
| 355 | } | 359 | } |
| 356 | const r1 = @mod(x, y); | 360 | const r1 = @mod(x, y); |
| 357 | for (@as([4]T, r1)) |v, i| { | 361 | for (@as([4]T, r1)) |v, i| { |
| 358 | try expectEqual(@mod(x[i], y[i]), v); | 362 | try expect(@mod(x[i], y[i]) == v); |
| 359 | } | 363 | } |
| 360 | const r2 = @rem(x, y); | 364 | const r2 = @rem(x, y); |
| 361 | for (@as([4]T, r2)) |v, i| { | 365 | for (@as([4]T, r2)) |v, i| { |
| 362 | try expectEqual(@rem(x[i], y[i]), v); | 366 | try expect(@rem(x[i], y[i]) == v); |
| 363 | } | 367 | } |
| 364 | } | 368 | } |
| 365 | | 369 | |
| ... | @@ -411,7 +415,7 @@ test "vector bitwise not operator" { | ... | @@ -411,7 +415,7 @@ test "vector bitwise not operator" { |
| 411 | fn doTheTestNot(comptime T: type, x: Vector(4, T)) !void { | 415 | fn doTheTestNot(comptime T: type, x: Vector(4, T)) !void { |
| 412 | var y = ~x; | 416 | var y = ~x; |
| 413 | for (@as([4]T, y)) |v, i| { | 417 | for (@as([4]T, y)) |v, i| { |
| 414 | try expectEqual(~x[i], v); | 418 | try expect(~x[i] == v); |
| 415 | } | 419 | } |
| 416 | } | 420 | } |
| 417 | fn doTheTest() !void { | 421 | fn doTheTest() !void { |
| ... | @@ -444,11 +448,11 @@ test "vector shift operators" { | ... | @@ -444,11 +448,11 @@ test "vector shift operators" { |
| 444 | | 448 | |
| 445 | var z0 = xv >> yv; | 449 | var z0 = xv >> yv; |
| 446 | for (@as([N]TX, z0)) |v, i| { | 450 | for (@as([N]TX, z0)) |v, i| { |
| 447 | try expectEqual(x[i] >> y[i], v); | 451 | try expect(x[i] >> y[i] == v); |
| 448 | } | 452 | } |
| 449 | var z1 = xv << yv; | 453 | var z1 = xv << yv; |
| 450 | for (@as([N]TX, z1)) |v, i| { | 454 | for (@as([N]TX, z1)) |v, i| { |
| 451 | try expectEqual(x[i] << y[i], v); | 455 | try expect(x[i] << y[i] == v); |
| 452 | } | 456 | } |
| 453 | } | 457 | } |
| 454 | fn doTheTestShiftExact(x: anytype, y: anytype, dir: enum { Left, Right }) !void { | 458 | fn doTheTestShiftExact(x: anytype, y: anytype, dir: enum { Left, Right }) !void { |
| ... | @@ -462,7 +466,7 @@ test "vector shift operators" { | ... | @@ -462,7 +466,7 @@ test "vector shift operators" { |
| 462 | var z = if (dir == .Left) @shlExact(xv, yv) else @shrExact(xv, yv); | 466 | var z = if (dir == .Left) @shlExact(xv, yv) else @shrExact(xv, yv); |
| 463 | for (@as([N]TX, z)) |v, i| { | 467 | for (@as([N]TX, z)) |v, i| { |
| 464 | const check = if (dir == .Left) x[i] << y[i] else x[i] >> y[i]; | 468 | const check = if (dir == .Left) x[i] << y[i] else x[i] >> y[i]; |
| 465 | try expectEqual(check, v); | 469 | try expect(check == v); |
| 466 | } | 470 | } |
| 467 | } | 471 | } |
| 468 | fn doTheTest() !void { | 472 | fn doTheTest() !void { |
| ... | @@ -681,9 +685,9 @@ test "saturating add" { | ... | @@ -681,9 +685,9 @@ test "saturating add" { |
| 681 | const S = struct { | 685 | const S = struct { |
| 682 | fn doTheTest() !void { | 686 | fn doTheTest() !void { |
| 683 | const u8x3 = std.meta.Vector(3, u8); | 687 | const u8x3 = std.meta.Vector(3, u8); |
| 684 | try expectEqual(u8x3{ 255, 255, 255 }, (u8x3{ 255, 254, 1 } +| u8x3{ 1, 2, 255 })); | 688 | try expect(mem.eql(u8, &@as([3]u8, u8x3{ 255, 255, 255 }), &@as([3]u8, u8x3{ 255, 254, 1 } +| u8x3{ 1, 2, 255 }))); |
| 685 | const i8x3 = std.meta.Vector(3, i8); | 689 | const i8x3 = std.meta.Vector(3, i8); |
| 686 | try expectEqual(i8x3{ 127, 127, 127 }, (i8x3{ 127, 126, 1 } +| i8x3{ 1, 2, 127 })); | 690 | try expect(mem.eql(i8, &@as([3]i8, i8x3{ 127, 127, 127 }), &@as([3]i8, i8x3{ 127, 126, 1 } +| i8x3{ 1, 2, 127 }))); |
| 687 | } | 691 | } |
| 688 | }; | 692 | }; |
| 689 | try S.doTheTest(); | 693 | try S.doTheTest(); |
| ... | @@ -695,7 +699,7 @@ test "saturating subtraction" { | ... | @@ -695,7 +699,7 @@ test "saturating subtraction" { |
| 695 | const S = struct { | 699 | const S = struct { |
| 696 | fn doTheTest() !void { | 700 | fn doTheTest() !void { |
| 697 | const u8x3 = std.meta.Vector(3, u8); | 701 | const u8x3 = std.meta.Vector(3, u8); |
| 698 | try expectEqual(u8x3{ 0, 0, 0 }, (u8x3{ 0, 0, 0 } -| u8x3{ 255, 255, 255 })); | 702 | try expect(mem.eql(u8, &@as([3]u8, u8x3{ 0, 0, 0 }), &@as([3]u8, u8x3{ 0, 0, 0 } -| u8x3{ 255, 255, 255 }))); |
| 699 | } | 703 | } |
| 700 | }; | 704 | }; |
| 701 | try S.doTheTest(); | 705 | try S.doTheTest(); |
| ... | @@ -710,7 +714,7 @@ test "saturating multiplication" { | ... | @@ -710,7 +714,7 @@ test "saturating multiplication" { |
| 710 | const S = struct { | 714 | const S = struct { |
| 711 | fn doTheTest() !void { | 715 | fn doTheTest() !void { |
| 712 | const u8x3 = std.meta.Vector(3, u8); | 716 | const u8x3 = std.meta.Vector(3, u8); |
| 713 | try expectEqual(u8x3{ 255, 255, 255 }, (u8x3{ 2, 2, 2 } *| u8x3{ 255, 255, 255 })); | 717 | try expect(mem.eql(u8, &@as([3]u8, u8x3{ 255, 255, 255 }), &@as([3]u8, u8x3{ 2, 2, 2 } *| u8x3{ 255, 255, 255 }))); |
| 714 | } | 718 | } |
| 715 | }; | 719 | }; |
| 716 | | 720 | |
| ... | @@ -723,7 +727,7 @@ test "saturating shift-left" { | ... | @@ -723,7 +727,7 @@ test "saturating shift-left" { |
| 723 | const S = struct { | 727 | const S = struct { |
| 724 | fn doTheTest() !void { | 728 | fn doTheTest() !void { |
| 725 | const u8x3 = std.meta.Vector(3, u8); | 729 | const u8x3 = std.meta.Vector(3, u8); |
| 726 | try expectEqual(u8x3{ 255, 255, 255 }, (u8x3{ 255, 255, 255 } <<| u8x3{ 1, 1, 1 })); | 730 | try expect(mem.eql(u8, &@as([3]u8, u8x3{ 255, 255, 255 }), &@as([3]u8, u8x3{ 255, 255, 255 } <<| u8x3{ 1, 1, 1 }))); |
| 727 | } | 731 | } |
| 728 | }; | 732 | }; |
| 729 | try S.doTheTest(); | 733 | try S.doTheTest(); |