exercism/zig/sum-of-multiples/test_sum_of_multiples.zig
2024-07-28 17:45:02 -04:00

141 lines
4.4 KiB
Zig

const std = @import("std");
const testing = std.testing;
const sum = @import("sum_of_multiples.zig").sum;
test "no multiples within limit" {
const expected: u64 = 0;
const factors = [_]u32{ 3, 5 };
const limit = 1;
const actual = try sum(testing.allocator, &factors, limit);
try testing.expectEqual(expected, actual);
}
test "one factor has multiples within limit" {
const expected: u64 = 3;
const factors = [_]u32{ 3, 5 };
const limit = 4;
const actual = try sum(testing.allocator, &factors, limit);
try testing.expectEqual(expected, actual);
}
test "more than one multiple within limit" {
const expected: u64 = 9;
const factors = [_]u32{3};
const limit = 7;
const actual = try sum(testing.allocator, &factors, limit);
try testing.expectEqual(expected, actual);
}
test "more than one factor with multiples within limit" {
const expected: u64 = 23;
const factors = [_]u32{ 3, 5 };
const limit = 10;
const actual = try sum(testing.allocator, &factors, limit);
try testing.expectEqual(expected, actual);
}
test "each multiple is only counted once" {
const expected: u64 = 2318;
const factors = [_]u32{ 3, 5 };
const limit = 100;
const actual = try sum(testing.allocator, &factors, limit);
try testing.expectEqual(expected, actual);
}
test "a much larger limit" {
const expected: u64 = 233_168;
const factors = [_]u32{ 3, 5 };
const limit = 1000;
const actual = try sum(testing.allocator, &factors, limit);
try testing.expectEqual(expected, actual);
}
test "three factors" {
const expected: u64 = 51;
const factors = [_]u32{ 7, 13, 17 };
const limit = 20;
const actual = try sum(testing.allocator, &factors, limit);
try testing.expectEqual(expected, actual);
}
test "factors not relatively prime" {
const expected: u64 = 30;
const factors = [_]u32{ 4, 6 };
const limit = 15;
const actual = try sum(testing.allocator, &factors, limit);
try testing.expectEqual(expected, actual);
}
test "some pairs of factors relatively prime and some not" {
const expected: u64 = 4419;
const factors = [_]u32{ 5, 6, 8 };
const limit = 150;
const actual = try sum(testing.allocator, &factors, limit);
try testing.expectEqual(expected, actual);
}
test "one factor is a multiple of another" {
const expected: u64 = 275;
const factors = [_]u32{ 5, 25 };
const limit = 51;
const actual = try sum(testing.allocator, &factors, limit);
try testing.expectEqual(expected, actual);
}
test "much larger factors" {
const expected: u64 = 2_203_160;
const factors = [_]u32{ 43, 47 };
const limit = 10_000;
const actual = try sum(testing.allocator, &factors, limit);
try testing.expectEqual(expected, actual);
}
test "all numbers are multiples of 1" {
const expected: u64 = 4_950;
const factors = [_]u32{1};
const limit = 100;
const actual = try sum(testing.allocator, &factors, limit);
try testing.expectEqual(expected, actual);
}
test "no factors means an empty sum" {
const expected: u64 = 0;
const factors = [_]u32{};
const limit = 10_000;
const actual = try sum(testing.allocator, &factors, limit);
try testing.expectEqual(expected, actual);
}
test "the only multiple of 0 is 0" {
const expected: u64 = 0;
const factors = [_]u32{0};
const limit = 1;
const actual = try sum(testing.allocator, &factors, limit);
try testing.expectEqual(expected, actual);
}
test "the factor 0 does not affect the sum of multiples of other factors" {
const expected: u64 = 3;
const factors = [_]u32{ 3, 0 };
const limit = 4;
const actual = try sum(testing.allocator, &factors, limit);
try testing.expectEqual(expected, actual);
}
test "solutions using include-exclude must extend to cardinality greater than 3" {
const expected: u64 = 39_614_537;
const factors = [_]u32{ 2, 3, 5, 7, 11 };
const limit = 10_000;
const actual = try sum(testing.allocator, &factors, limit);
try testing.expectEqual(expected, actual);
}
test "sum is greater than maximum value of u32" {
// Note that for a u32 `limit`, the maximum sum of multiples fits in a u64.
const expected: u64 = 4_500_000_000;
const factors = [_]u32{100_000_000};
const limit = 1_000_000_000;
const actual = try sum(testing.allocator, &factors, limit);
try testing.expectEqual(expected, actual);
}