import { test } from "node:test"; import assert from "node:assert/strict"; import { parseCidr, contains, familyOf, parseAddress } from "../src/declaration/net.ts"; test("family is inferred from the address", () => { assert.equal(familyOf("203.0.113.1"), "v4"); assert.equal(familyOf("2001:db8::1"), "v6"); }); test("v4 containment", () => { const range = parseCidr("203.0.113.0/24"); assert.equal(contains(range, "203.0.113.0"), true); assert.equal(contains(range, "203.0.113.255"), true); assert.equal(contains(range, "203.0.114.0"), false); assert.equal(contains(range, "202.0.113.1"), false); }); test("v4 containment on a non-byte prefix", () => { const range = parseCidr("198.51.100.0/25"); assert.equal(contains(range, "198.51.100.127"), true); assert.equal(contains(range, "198.51.100.128"), false); }); test("v6 containment, including :: compression", () => { const range = parseCidr("2001:db8:a::/48"); assert.equal(contains(range, "2001:db8:a::10"), true); assert.equal(contains(range, "2001:db8:a:ffff::1"), true); assert.equal(contains(range, "2001:db8:b::10"), false); }); test("a range never contains an address of the other family", () => { assert.equal(contains(parseCidr("203.0.113.0/24"), "2001:db8::1"), false); assert.equal(contains(parseCidr("2001:db8::/32"), "203.0.113.1"), false); }); test("a cidr whose address has host bits set still masks to its network", () => { // 203.0.113.5/24 means the 203.0.113.0/24 network, not a range starting at .5 assert.equal(contains(parseCidr("203.0.113.5/24"), "203.0.113.1"), true); }); test("malformed input is refused rather than guessed at", () => { assert.throws(() => parseCidr("203.0.113.0"), /no prefix length/); assert.throws(() => parseCidr("203.0.113.0/33"), /out of range/); assert.throws(() => parseCidr("2001:db8::/129"), /out of range/); assert.throws(() => parseAddress("203.0.113"), /not an IPv4/); assert.throws(() => parseAddress("203.0.113.256"), /out of range/); assert.throws(() => parseAddress("2001:db8::1::2"), /not an IPv6/); assert.throws(() => parseAddress("::ffff:192.0.2.1"), /not supported/); });