Skip to content

Commit 0f08626

Browse files
committed
test: add behavior tests for catch |e| switch (e)
1 parent 5578eaf commit 0f08626

File tree

1 file changed

+165
-0
lines changed

1 file changed

+165
-0
lines changed

test/behavior/switch.zig

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -831,3 +831,168 @@ test "peer type resolution on switch captures ignores unused payload bits" {
831831

832832
try expect(x == 123);
833833
}
834+
835+
test "switch on error union catch" {
836+
const S = struct {
837+
fn doTheTest() !void {
838+
const Error = error{ A, B, C };
839+
{
840+
var a: Error!u64 = 3;
841+
_ = &a;
842+
const b: u64 = a catch |err| switch (err) {
843+
error.A => 0,
844+
error.B => @intFromError(err),
845+
error.C => @intFromError(err),
846+
};
847+
try std.testing.expectEqual(@as(u64, 3), b);
848+
}
849+
{
850+
var a: Error!u64 = 3;
851+
_ = &a;
852+
const b: u64 = a catch |err| switch (err) {
853+
error.A, error.B => 0,
854+
error.C => @intFromError(err),
855+
};
856+
try std.testing.expectEqual(@as(u64, 3), b);
857+
}
858+
{
859+
var a: Error!u64 = 3;
860+
_ = &a;
861+
const b: u64 = a catch |err| switch (err) {
862+
error.A => 0,
863+
error.C, error.B => @intFromError(err),
864+
};
865+
try std.testing.expectEqual(@as(u64, 3), b);
866+
}
867+
{
868+
var a: Error!u64 = error.A;
869+
_ = &a;
870+
const b: u64 = a catch |err| switch (err) {
871+
error.A => 0,
872+
error.B => @intFromError(err),
873+
error.C => @intFromError(err),
874+
};
875+
try std.testing.expectEqual(@as(u64, 0), b);
876+
}
877+
{
878+
var a: Error!u64 = error.A;
879+
_ = &a;
880+
const b: u64 = a catch |err| switch (err) {
881+
error.A, error.B => 0,
882+
error.C => @intFromError(err),
883+
};
884+
try std.testing.expectEqual(@as(u64, 0), b);
885+
}
886+
{
887+
var a: Error!u64 = error.A;
888+
_ = &a;
889+
const b: u64 = a catch |err| switch (err) {
890+
error.A => 0,
891+
error.C, error.B => @intFromError(err),
892+
};
893+
try std.testing.expectEqual(@as(u64, 0), b);
894+
}
895+
{
896+
var a: Error!u64 = 3;
897+
_ = &a;
898+
const b: u64 = a catch |err| switch (err) {
899+
error.A => 0,
900+
else => @intFromError(err),
901+
};
902+
try std.testing.expectEqual(@as(u64, 3), b);
903+
}
904+
{
905+
var a: Error!u64 = error.A;
906+
_ = &a;
907+
const b: u64 = a catch |err| switch (err) {
908+
error.A => 1,
909+
else => @intFromError(err),
910+
};
911+
try std.testing.expectEqual(@as(u64, 1), b);
912+
}
913+
{
914+
var a: Error!u64 = error.A;
915+
_ = &a;
916+
const b: u64 = a catch |err| switch (err) {
917+
error.A => |e| @intFromError(e),
918+
else => @intFromError(err),
919+
};
920+
try std.testing.expectEqual(@as(u64, @intFromError(error.A)), b);
921+
}
922+
{
923+
var a: Error!u64 = error.B;
924+
_ = &a;
925+
const b: u64 = a catch |err| switch (err) {
926+
error.A => 0,
927+
else => @intFromError(err),
928+
};
929+
try std.testing.expectEqual(@as(u64, @intFromError(error.B)), b);
930+
}
931+
{
932+
var a: Error!u64 = error.B;
933+
_ = &a;
934+
const b: u64 = a catch |err| switch (err) {
935+
error.A => 0,
936+
inline else => @intFromError(err),
937+
};
938+
try std.testing.expectEqual(@as(u64, @intFromError(error.B)), b);
939+
}
940+
{
941+
var a: Error!u64 = error.B;
942+
_ = &a;
943+
const b: u64 = a catch |err| switch (err) {
944+
error.A => |e| @intFromError(e),
945+
inline else => @intFromError(err),
946+
};
947+
try std.testing.expectEqual(@as(u64, @intFromError(error.B)), b);
948+
}
949+
{
950+
var a: Error!u64 = error.B;
951+
_ = &a;
952+
const b: u64 = a catch |err| switch (err) {
953+
error.A => 0,
954+
error.B, error.C => @intFromError(err),
955+
};
956+
try std.testing.expectEqual(@as(u64, @intFromError(error.B)), b);
957+
}
958+
{
959+
var a: Error!u64 = error.B;
960+
_ = &a;
961+
const b: u64 = a catch |err| switch (err) {
962+
error.A => 0,
963+
error.B, error.C => |e| @intFromError(e),
964+
};
965+
try std.testing.expectEqual(@as(u64, @intFromError(error.B)), b);
966+
}
967+
{
968+
var a: Error!u64 = error.B;
969+
_ = &a;
970+
const b: u64 = a catch |err| switch (err) {
971+
error.A => 0,
972+
inline error.B, error.C => |e| @intFromError(e),
973+
};
974+
try std.testing.expectEqual(@as(u64, @intFromError(error.B)), b);
975+
}
976+
{
977+
var a: error{}!u64 = 0;
978+
_ = &a;
979+
const b: u64 = a catch |err| switch (err) {
980+
else => |e| return e,
981+
};
982+
try std.testing.expectEqual(@as(u64, 0), b);
983+
}
984+
{
985+
var a: error{}!u64 = 0;
986+
_ = &a;
987+
const b: u64 = a catch |err| switch (err) {
988+
error.UnknownError => return error.Fail,
989+
else => |e| return e,
990+
};
991+
try std.testing.expectEqual(@as(u64, 0), b);
992+
}
993+
}
994+
};
995+
996+
try comptime S.doTheTest();
997+
try S.doTheTest();
998+
}

0 commit comments

Comments
 (0)