diff --git a/src/lib/components/tools/CIDRInput.svelte b/src/lib/components/tools/CIDRInput.svelte
index b9fab54f..9ddf11ec 100644
--- a/src/lib/components/tools/CIDRInput.svelte
+++ b/src/lib/components/tools/CIDRInput.svelte
@@ -29,9 +29,9 @@
* Quick CIDR presets
*/
const cidrPresets = [
- { cidr: 8, label: '/8 (Class A)', hosts: '16M hosts' },
- { cidr: 16, label: '/16 (Class B)', hosts: '65K hosts' },
- { cidr: 24, label: '/24 (Class C)', hosts: '254 hosts' },
+ { cidr: 8, label: '/8', hosts: '16M hosts' },
+ { cidr: 16, label: '/16', hosts: '65K hosts' },
+ { cidr: 24, label: '/24', hosts: '254 hosts' },
{ cidr: 25, label: '/25', hosts: '126 hosts' },
{ cidr: 26, label: '/26', hosts: '62 hosts' },
{ cidr: 27, label: '/27', hosts: '30 hosts' },
diff --git a/src/lib/components/tools/IPEnumerate.svelte b/src/lib/components/tools/IPEnumerate.svelte
index 693a147b..d3ec77ee 100644
--- a/src/lib/components/tools/IPEnumerate.svelte
+++ b/src/lib/components/tools/IPEnumerate.svelte
@@ -50,7 +50,7 @@
description: '10 addresses',
},
{
- label: 'Class C /24',
+ label: 'Medium /24 network',
input: '192.168.0.0/24',
description: '256 addresses',
},
diff --git a/src/lib/components/tools/IPValidator.svelte b/src/lib/components/tools/IPValidator.svelte
index 6144a5b3..653dc853 100644
--- a/src/lib/components/tools/IPValidator.svelte
+++ b/src/lib/components/tools/IPValidator.svelte
@@ -111,32 +111,32 @@
details.scope = 'Host';
details.info.push('Used for local loopback communications');
} else if (a === 10) {
- details.addressType = 'Private (Class A)';
+ details.addressType = 'Private';
details.scope = 'Private Network';
details.isPrivate = true;
- details.info.push('RFC 1918 private address space');
+ details.info.push('RFC 1918 private address space (10.0.0.0/8)');
} else if (a === 172 && b >= 16 && b <= 31) {
- details.addressType = 'Private (Class B)';
+ details.addressType = 'Private';
details.scope = 'Private Network';
details.isPrivate = true;
- details.info.push('RFC 1918 private address space');
+ details.info.push('RFC 1918 private address space (172.16.0.0/12)');
} else if (a === 192 && b === 168) {
- details.addressType = 'Private (Class C)';
+ details.addressType = 'Private';
details.scope = 'Private Network';
details.isPrivate = true;
- details.info.push('RFC 1918 private address space');
+ details.info.push('RFC 1918 private address space (192.168.0.0/16)');
} else if (a === 169 && b === 254) {
details.addressType = 'Link-Local (APIPA)';
details.scope = 'Link-Local';
details.isReserved = true;
details.info.push('Automatic Private IP Addressing');
} else if (a >= 224 && a <= 239) {
- details.addressType = 'Multicast (Class D)';
+ details.addressType = 'Multicast';
details.scope = 'Multicast';
details.isReserved = true;
- details.info.push('Used for multicast communications');
+ details.info.push('Used for multicast communications (224.0.0.0/4)');
} else if (a >= 240) {
- details.addressType = 'Reserved (Class E)';
+ details.addressType = 'Reserved';
details.scope = 'Reserved';
details.isReserved = true;
details.info.push('Reserved for future use');
diff --git a/src/lib/components/tools/ReverseZonesCalculator.svelte b/src/lib/components/tools/ReverseZonesCalculator.svelte
index 746aaf1d..fabfee53 100644
--- a/src/lib/components/tools/ReverseZonesCalculator.svelte
+++ b/src/lib/components/tools/ReverseZonesCalculator.svelte
@@ -25,17 +25,17 @@
{
label: 'IPv4 /24 Network',
cidr: '192.168.1.0/24',
- description: 'Single class C zone delegation',
+ description: 'Single /24 zone delegation',
},
{
label: 'IPv4 /16 Network',
cidr: '10.0.0.0/16',
- description: 'Class B with multiple /24 zones',
+ description: '/16 network with multiple /24 zones',
},
{
label: 'IPv4 /20 Block',
cidr: '172.16.32.0/20',
- description: '16 class C zones needed',
+ description: '16 /24 zones needed',
},
{
label: 'IPv4 /28 Subnet',
@@ -82,7 +82,7 @@
let delegationType = '';
if (ipv4Zones > 0) {
if (ipv4Zones === 1) {
- delegationType = zones[0].delegation.includes('/24') ? 'Class C (/24)' : `Custom (${zones[0].delegation})`;
+ delegationType = zones[0].delegation.includes('/24') ? '/24 network' : `Custom (${zones[0].delegation})`;
} else {
delegationType = `Multiple zones (${ipv4Zones} x /24)`;
}
@@ -268,11 +268,11 @@ chmod 644 /etc/bind/zones/${zone.zone}`;
{#if zone.type === 'IPv4'}
{#if zone.delegation === '/24'}
- Standard class C reverse zone for 256 addresses
+ Standard /24 reverse zone for 256 addresses
{:else if zone.delegation === '/16'}
- Class B reverse zone covering 65,536 addresses
+ /16 reverse zone covering 65,536 addresses
{:else if zone.delegation === '/8'}
- Class A reverse zone covering 16,777,216 addresses
+ /8 reverse zone covering 16,777,216 addresses
{:else}
Custom IPv4 reverse zone for {zone.delegation} prefix
{/if}
diff --git a/src/lib/constants/networks.ts b/src/lib/constants/networks.ts
index 666f88a4..340fdcc5 100644
--- a/src/lib/constants/networks.ts
+++ b/src/lib/constants/networks.ts
@@ -31,17 +31,17 @@ export const RESERVED_RANGES = {
},
PRIVATE_A: {
range: '10.0.0.0/8',
- description: 'Private network (Class A)',
+ description: 'Private network',
rfc: 'RFC 1918',
},
PRIVATE_B: {
range: '172.16.0.0/12',
- description: 'Private network (Class B)',
+ description: 'Private network',
rfc: 'RFC 1918',
},
PRIVATE_C: {
range: '192.168.0.0/16',
- description: 'Private network (Class C)',
+ description: 'Private network',
rfc: 'RFC 1918',
},
LINK_LOCAL: {
diff --git a/src/lib/content/private-vs-public-ip.ts b/src/lib/content/private-vs-public-ip.ts
index 9d017270..6c2791b5 100644
--- a/src/lib/content/private-vs-public-ip.ts
+++ b/src/lib/content/private-vs-public-ip.ts
@@ -17,7 +17,7 @@ The key difference is reachability: private IPs are only reachable within their
range: '10.0.0.0/8',
fullRange: '10.0.0.0 to 10.255.255.255',
addresses: '16,777,216 addresses',
- class: 'Class A private range',
+ class: 'RFC 1918 private range',
commonUse: 'Large enterprises, ISP internal networks',
examples: ['10.0.0.1', '10.1.1.1', '10.200.50.100'],
},
@@ -25,7 +25,7 @@ The key difference is reachability: private IPs are only reachable within their
range: '172.16.0.0/12',
fullRange: '172.16.0.0 to 172.31.255.255',
addresses: '1,048,576 addresses',
- class: 'Class B private range',
+ class: 'RFC 1918 private range',
commonUse: 'Medium businesses, cloud providers',
examples: ['172.16.0.1', '172.20.1.1', '172.31.255.254'],
},
@@ -33,7 +33,7 @@ The key difference is reachability: private IPs are only reachable within their
range: '192.168.0.0/16',
fullRange: '192.168.0.0 to 192.168.255.255',
addresses: '65,536 addresses',
- class: 'Class C private range',
+ class: 'RFC 1918 private range',
commonUse: 'Home networks, small offices',
examples: ['192.168.1.1', '192.168.0.100', '192.168.100.50'],
},
diff --git a/src/lib/utils/dns-tools.ts b/src/lib/utils/dns-tools.ts
index c4fdf6de..2c8e3987 100644
--- a/src/lib/utils/dns-tools.ts
+++ b/src/lib/utils/dns-tools.ts
@@ -279,8 +279,8 @@ function calculateIPv4ReverseZones(ip: string, prefix: number, cidr: string): Re
zones.push(`${thirdOctet}.${secondOctet}.${firstOctet}.in-addr.arpa`);
}
} else {
- // Very large networks - show class-based zones
- zones.push(`${networkOctets[0]}.in-addr.arpa (Class A network)`);
+ // Very large networks - show /8 zone
+ zones.push(`${networkOctets[0]}.in-addr.arpa (/8 network)`);
}
return {
diff --git a/src/lib/utils/ip-security.ts b/src/lib/utils/ip-security.ts
index c0db2cfa..e81aff0a 100644
--- a/src/lib/utils/ip-security.ts
+++ b/src/lib/utils/ip-security.ts
@@ -36,13 +36,13 @@ function isPrivateIPv4(ip: string): boolean {
// Loopback: 127.0.0.0/8
if (a === 127) return true;
- // Private Class A: 10.0.0.0/8
+ // Private: 10.0.0.0/8
if (a === 10) return true;
- // Private Class B: 172.16.0.0/12
+ // Private: 172.16.0.0/12
if (a === 172 && b >= 16 && b <= 31) return true;
- // Private Class C: 192.168.0.0/16
+ // Private: 192.168.0.0/16
if (a === 192 && b === 168) return true;
// Link-local: 169.254.0.0/16 (AWS metadata, APIPA)
diff --git a/src/lib/utils/ip-validation.ts b/src/lib/utils/ip-validation.ts
index 5875f7e9..be081f2b 100644
--- a/src/lib/utils/ip-validation.ts
+++ b/src/lib/utils/ip-validation.ts
@@ -163,20 +163,20 @@ export function validateIPv4Detailed(ip: string): DetailedValidationResponse {
details.scope = 'Host';
details.info.push('Loopback address (localhost)');
} else if (a === 10) {
- details.addressType = 'Private (Class A)';
+ details.addressType = 'Private';
details.scope = 'Private Network';
details.isPrivate = true;
- details.info.push('RFC 1918 private address space');
+ details.info.push('RFC 1918 private address space (10.0.0.0/8)');
} else if (a === 172 && b >= 16 && b <= 31) {
- details.addressType = 'Private (Class B)';
+ details.addressType = 'Private';
details.scope = 'Private Network';
details.isPrivate = true;
- details.info.push('RFC 1918 private address space');
+ details.info.push('RFC 1918 private address space (172.16.0.0/12)');
} else if (a === 192 && b === 168) {
- details.addressType = 'Private (Class C)';
+ details.addressType = 'Private';
details.scope = 'Private Network';
details.isPrivate = true;
- details.info.push('RFC 1918 private address space');
+ details.info.push('RFC 1918 private address space (192.168.0.0/16)');
} else if (a === 169 && b === 254) {
details.addressType = 'Link-Local (APIPA)';
details.scope = 'Link-Local';
diff --git a/src/routes/subnetting/+page.svelte b/src/routes/subnetting/+page.svelte
index db2dfc8f..70de5957 100644
--- a/src/routes/subnetting/+page.svelte
+++ b/src/routes/subnetting/+page.svelte
@@ -110,7 +110,7 @@
CIDR |
Subnet Mask |
Hosts |
- Subnets |
+ Subnets |
diff --git a/tests/unit/content/private-vs-public-ip.test.ts b/tests/unit/content/private-vs-public-ip.test.ts
index cb505b81..af606f60 100644
--- a/tests/unit/content/private-vs-public-ip.test.ts
+++ b/tests/unit/content/private-vs-public-ip.test.ts
@@ -16,23 +16,23 @@ describe('Private vs Public IP content', () => {
it('defines RFC 1918 private ranges correctly', () => {
expect(privateVsPublicContent.privateRanges).toHaveLength(3);
- const classA = privateVsPublicContent.privateRanges[0];
- expect(classA.range).toBe("10.0.0.0/8");
- expect(classA.fullRange).toBe("10.0.0.0 to 10.255.255.255");
- expect(classA.class).toBe("Class A private range");
- expect(classA.examples).toContain("10.0.0.1");
-
- const classB = privateVsPublicContent.privateRanges[1];
- expect(classB.range).toBe("172.16.0.0/12");
- expect(classB.fullRange).toBe("172.16.0.0 to 172.31.255.255");
- expect(classB.class).toBe("Class B private range");
- expect(classB.examples).toContain("172.16.0.1");
-
- const classC = privateVsPublicContent.privateRanges[2];
- expect(classC.range).toBe("192.168.0.0/16");
- expect(classC.fullRange).toBe("192.168.0.0 to 192.168.255.255");
- expect(classC.class).toBe("Class C private range");
- expect(classC.examples).toContain("192.168.1.1");
+ const range10 = privateVsPublicContent.privateRanges[0];
+ expect(range10.range).toBe("10.0.0.0/8");
+ expect(range10.fullRange).toBe("10.0.0.0 to 10.255.255.255");
+ expect(range10.class).toBe("RFC 1918 private range");
+ expect(range10.examples).toContain("10.0.0.1");
+
+ const range172 = privateVsPublicContent.privateRanges[1];
+ expect(range172.range).toBe("172.16.0.0/12");
+ expect(range172.fullRange).toBe("172.16.0.0 to 172.31.255.255");
+ expect(range172.class).toBe("RFC 1918 private range");
+ expect(range172.examples).toContain("172.16.0.1");
+
+ const range192 = privateVsPublicContent.privateRanges[2];
+ expect(range192.range).toBe("192.168.0.0/16");
+ expect(range192.fullRange).toBe("192.168.0.0 to 192.168.255.255");
+ expect(range192.class).toBe("RFC 1918 private range");
+ expect(range192.examples).toContain("192.168.1.1");
});
it('has accurate address counts', () => {
diff --git a/tests/unit/content/special-use-ipv4.test.ts b/tests/unit/content/special-use-ipv4.test.ts
index f1261a5b..c1d1224e 100644
--- a/tests/unit/content/special-use-ipv4.test.ts
+++ b/tests/unit/content/special-use-ipv4.test.ts
@@ -4,8 +4,8 @@ import { specialIPv4Content } from '../../../src/lib/content/special-use-ipv4';
describe('Special-use IPv4 content', () => {
it('has valid structure', () => {
expect(specialIPv4Content).toBeDefined();
- expect(specialIPv4Content.title).toBe("Special-Use IPv4 Blocks (RFC 6890)");
- expect(specialIPv4Content.description).toContain("reserved IPv4 address blocks");
+ expect(specialIPv4Content.title).toBe('Special-Use IPv4 Blocks (RFC 6890)');
+ expect(specialIPv4Content.description).toContain('reserved IPv4 address blocks');
expect(specialIPv4Content.ranges).toBeInstanceOf(Array);
expect(specialIPv4Content.categories).toBeDefined();
expect(specialIPv4Content.quickTips).toBeInstanceOf(Array);
@@ -13,174 +13,174 @@ describe('Special-use IPv4 content', () => {
it('includes all major special-use ranges', () => {
expect(specialIPv4Content.ranges).toHaveLength(16);
-
- const networks = specialIPv4Content.ranges.map(r => r.network);
- expect(networks).toContain("10.0.0.0/8");
- expect(networks).toContain("127.0.0.0/8");
- expect(networks).toContain("169.254.0.0/16");
- expect(networks).toContain("192.168.0.0/16");
- expect(networks).toContain("100.64.0.0/10");
- expect(networks).toContain("224.0.0.0/4");
- expect(networks).toContain("240.0.0.0/4");
+
+ const networks = specialIPv4Content.ranges.map((r) => r.network);
+ expect(networks).toContain('10.0.0.0/8');
+ expect(networks).toContain('127.0.0.0/8');
+ expect(networks).toContain('169.254.0.0/16');
+ expect(networks).toContain('192.168.0.0/16');
+ expect(networks).toContain('100.64.0.0/10');
+ expect(networks).toContain('224.0.0.0/4');
+ expect(networks).toContain('240.0.0.0/4');
});
it('correctly identifies RFC 1918 private ranges', () => {
- const privateRanges = specialIPv4Content.ranges.filter(r => r.rfc === "RFC 1918");
+ const privateRanges = specialIPv4Content.ranges.filter((r) => r.rfc === 'RFC 1918');
expect(privateRanges).toHaveLength(3);
-
- const classA = privateRanges.find(r => r.network === "10.0.0.0/8");
- expect(classA?.purpose).toBe("Private-Use Networks");
- expect(classA?.routable).toBe(false);
- expect(classA?.description).toContain("Class A");
-
- const classB = privateRanges.find(r => r.network === "172.16.0.0/12");
- expect(classB?.purpose).toBe("Private-Use Networks");
- expect(classB?.description).toContain("Class B");
-
- const classC = privateRanges.find(r => r.network === "192.168.0.0/16");
- expect(classC?.purpose).toBe("Private-Use Networks");
- expect(classC?.description).toContain("Class C");
+
+ const range10 = privateRanges.find((r) => r.network === '10.0.0.0/8');
+ expect(range10?.purpose).toBe('Private-Use Networks');
+ expect(range10?.routable).toBe(false);
+ expect(range10?.description).toBe('Private addresses for internal networks (Class A)');
+
+ const range172 = privateRanges.find((r) => r.network === '172.16.0.0/12');
+ expect(range172?.purpose).toBe('Private-Use Networks');
+ expect(range172?.description).toBe('Private addresses for internal networks (Class B)');
+
+ const range192 = privateRanges.find((r) => r.network === '192.168.0.0/16');
+ expect(range192?.purpose).toBe('Private-Use Networks');
+ expect(range192?.description).toBe('Private addresses for internal networks (Class C)');
});
it('includes CGNAT range (RFC 6598)', () => {
- const cgnatRange = specialIPv4Content.ranges.find(r => r.network === "100.64.0.0/10");
+ const cgnatRange = specialIPv4Content.ranges.find((r) => r.network === '100.64.0.0/10');
expect(cgnatRange).toBeDefined();
- expect(cgnatRange?.purpose).toBe("Shared Address Space (CGNAT)");
- expect(cgnatRange?.rfc).toBe("RFC 6598");
+ expect(cgnatRange?.purpose).toBe('Shared Address Space (CGNAT)');
+ expect(cgnatRange?.rfc).toBe('RFC 6598');
expect(cgnatRange?.routable).toBe(false);
- expect(cgnatRange?.description).toContain("Carrier-Grade NAT");
+ expect(cgnatRange?.description).toContain('Carrier-Grade NAT');
});
it('defines loopback range correctly', () => {
- const loopback = specialIPv4Content.ranges.find(r => r.network === "127.0.0.0/8");
+ const loopback = specialIPv4Content.ranges.find((r) => r.network === '127.0.0.0/8');
expect(loopback).toBeDefined();
- expect(loopback?.purpose).toBe("Loopback");
- expect(loopback?.rfc).toBe("RFC 1122");
+ expect(loopback?.purpose).toBe('Loopback');
+ expect(loopback?.rfc).toBe('RFC 1122');
expect(loopback?.routable).toBe(false);
- expect(loopback?.description).toContain("127.0.0.1");
+ expect(loopback?.description).toContain('127.0.0.1');
});
it('includes link-local/APIPA range', () => {
- const linkLocal = specialIPv4Content.ranges.find(r => r.network === "169.254.0.0/16");
+ const linkLocal = specialIPv4Content.ranges.find((r) => r.network === '169.254.0.0/16');
expect(linkLocal).toBeDefined();
- expect(linkLocal?.purpose).toBe("Link Local (APIPA)");
- expect(linkLocal?.rfc).toBe("RFC 3927");
+ expect(linkLocal?.purpose).toBe('Link Local (APIPA)');
+ expect(linkLocal?.rfc).toBe('RFC 3927');
expect(linkLocal?.routable).toBe(false);
- expect(linkLocal?.description).toContain("DHCP fails");
+ expect(linkLocal?.description).toContain('DHCP fails');
});
it('defines TEST-NET ranges for documentation', () => {
- const testNets = specialIPv4Content.ranges.filter(r => r.purpose.includes("TEST-NET"));
+ const testNets = specialIPv4Content.ranges.filter((r) => r.purpose.includes('TEST-NET'));
expect(testNets).toHaveLength(3);
-
- const testNet1 = testNets.find(r => r.network === "192.0.2.0/24");
- expect(testNet1?.purpose).toBe("TEST-NET-1");
- expect(testNet1?.rfc).toBe("RFC 5737");
-
- const testNet2 = testNets.find(r => r.network === "198.51.100.0/24");
- expect(testNet2?.purpose).toBe("TEST-NET-2");
-
- const testNet3 = testNets.find(r => r.network === "203.0.113.0/24");
- expect(testNet3?.purpose).toBe("TEST-NET-3");
-
- testNets.forEach(testNet => {
+
+ const testNet1 = testNets.find((r) => r.network === '192.0.2.0/24');
+ expect(testNet1?.purpose).toBe('TEST-NET-1');
+ expect(testNet1?.rfc).toBe('RFC 5737');
+
+ const testNet2 = testNets.find((r) => r.network === '198.51.100.0/24');
+ expect(testNet2?.purpose).toBe('TEST-NET-2');
+
+ const testNet3 = testNets.find((r) => r.network === '203.0.113.0/24');
+ expect(testNet3?.purpose).toBe('TEST-NET-3');
+
+ testNets.forEach((testNet) => {
expect(testNet.routable).toBe(false);
- expect(testNet.description).toContain("Documentation");
+ expect(testNet.description).toContain('Documentation');
});
});
it('includes multicast range', () => {
- const multicast = specialIPv4Content.ranges.find(r => r.network === "224.0.0.0/4");
+ const multicast = specialIPv4Content.ranges.find((r) => r.network === '224.0.0.0/4');
expect(multicast).toBeDefined();
- expect(multicast?.purpose).toBe("Multicast");
- expect(multicast?.rfc).toBe("RFC 1112");
+ expect(multicast?.purpose).toBe('Multicast');
+ expect(multicast?.rfc).toBe('RFC 1112');
expect(multicast?.routable).toBe(true);
- expect(multicast?.description).toContain("multicast addresses");
+ expect(multicast?.description).toContain('multicast addresses');
});
it('includes reserved range', () => {
- const reserved = specialIPv4Content.ranges.find(r => r.network === "240.0.0.0/4");
+ const reserved = specialIPv4Content.ranges.find((r) => r.network === '240.0.0.0/4');
expect(reserved).toBeDefined();
- expect(reserved?.purpose).toBe("Reserved for Future Use");
+ expect(reserved?.purpose).toBe('Reserved for Future Use');
expect(reserved?.routable).toBe(false);
- expect(reserved?.description).toContain("not usable");
+ expect(reserved?.description).toContain('not usable');
});
it('includes broadcast address', () => {
- const broadcast = specialIPv4Content.ranges.find(r => r.network === "255.255.255.255/32");
+ const broadcast = specialIPv4Content.ranges.find((r) => r.network === '255.255.255.255/32');
expect(broadcast).toBeDefined();
- expect(broadcast?.purpose).toBe("Limited Broadcast");
- expect(broadcast?.rfc).toBe("RFC 919");
+ expect(broadcast?.purpose).toBe('Limited Broadcast');
+ expect(broadcast?.rfc).toBe('RFC 919');
expect(broadcast?.routable).toBe(false);
- expect(broadcast?.description).toContain("Broadcast to all hosts");
+ expect(broadcast?.description).toContain('Broadcast to all hosts');
});
it('categorizes ranges appropriately', () => {
const categories = specialIPv4Content.categories;
-
- expect(categories.private).toEqual(["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]);
- expect(categories.testing).toEqual(["192.0.2.0/24", "198.51.100.0/24", "203.0.113.0/24"]);
- expect(categories.special).toEqual(["127.0.0.0/8", "169.254.0.0/16", "224.0.0.0/4"]);
- expect(categories.cgnat).toEqual(["100.64.0.0/10"]);
+
+ expect(categories.private).toEqual(['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16']);
+ expect(categories.testing).toEqual(['192.0.2.0/24', '198.51.100.0/24', '203.0.113.0/24']);
+ expect(categories.special).toEqual(['127.0.0.0/8', '169.254.0.0/16', '224.0.0.0/4']);
+ expect(categories.cgnat).toEqual(['100.64.0.0/10']);
});
it('provides practical quick tips', () => {
expect(specialIPv4Content.quickTips).toHaveLength(6);
- expect(specialIPv4Content.quickTips[0]).toContain("Private addresses");
- expect(specialIPv4Content.quickTips[1]).toContain("100.64.x.x means your ISP is using Carrier-Grade NAT");
- expect(specialIPv4Content.quickTips[2]).toContain("169.254.x.x means DHCP failed");
- expect(specialIPv4Content.quickTips[3]).toContain("TEST-NET addresses are safe");
- expect(specialIPv4Content.quickTips[4]).toContain("224.x.x.x and above are multicast");
- expect(specialIPv4Content.quickTips[5]).toContain("Never use 240.x.x.x");
+ expect(specialIPv4Content.quickTips[0]).toContain('Private addresses');
+ expect(specialIPv4Content.quickTips[1]).toContain('100.64.x.x means your ISP is using Carrier-Grade NAT');
+ expect(specialIPv4Content.quickTips[2]).toContain('169.254.x.x means DHCP failed');
+ expect(specialIPv4Content.quickTips[3]).toContain('TEST-NET addresses are safe');
+ expect(specialIPv4Content.quickTips[4]).toContain('224.x.x.x and above are multicast');
+ expect(specialIPv4Content.quickTips[5]).toContain('Never use 240.x.x.x');
});
it('validates range data structure', () => {
- specialIPv4Content.ranges.forEach(range => {
+ specialIPv4Content.ranges.forEach((range) => {
expect(range).toHaveProperty('network');
expect(range).toHaveProperty('purpose');
expect(range).toHaveProperty('rfc');
expect(range).toHaveProperty('routable');
expect(range).toHaveProperty('description');
-
+
expect(typeof range.network).toBe('string');
expect(typeof range.purpose).toBe('string');
expect(typeof range.rfc).toBe('string');
expect(typeof range.routable).toBe('boolean');
expect(typeof range.description).toBe('string');
-
+
expect(range.network).toMatch(/^\d+\.\d+\.\d+\.\d+\/\d+$/);
expect(range.rfc).toMatch(/^RFC \d+$/);
});
});
it('correctly marks routable vs non-routable ranges', () => {
- const routableRanges = specialIPv4Content.ranges.filter(r => r.routable);
- const nonRoutableRanges = specialIPv4Content.ranges.filter(r => !r.routable);
-
+ const routableRanges = specialIPv4Content.ranges.filter((r) => r.routable);
+ const nonRoutableRanges = specialIPv4Content.ranges.filter((r) => !r.routable);
+
expect(routableRanges.length).toBe(3);
expect(nonRoutableRanges.length).toBe(13);
-
+
// Routable ranges should include
- expect(routableRanges.some(r => r.network === "192.0.0.0/24")).toBe(true);
- expect(routableRanges.some(r => r.network === "192.88.99.0/24")).toBe(true);
- expect(routableRanges.some(r => r.network === "224.0.0.0/4")).toBe(true);
-
+ expect(routableRanges.some((r) => r.network === '192.0.0.0/24')).toBe(true);
+ expect(routableRanges.some((r) => r.network === '192.88.99.0/24')).toBe(true);
+ expect(routableRanges.some((r) => r.network === '224.0.0.0/4')).toBe(true);
+
// Non-routable ranges should include private addresses
- expect(nonRoutableRanges.some(r => r.network === "10.0.0.0/8")).toBe(true);
- expect(nonRoutableRanges.some(r => r.network === "172.16.0.0/12")).toBe(true);
- expect(nonRoutableRanges.some(r => r.network === "192.168.0.0/16")).toBe(true);
- expect(nonRoutableRanges.some(r => r.network === "127.0.0.0/8")).toBe(true);
+ expect(nonRoutableRanges.some((r) => r.network === '10.0.0.0/8')).toBe(true);
+ expect(nonRoutableRanges.some((r) => r.network === '172.16.0.0/12')).toBe(true);
+ expect(nonRoutableRanges.some((r) => r.network === '192.168.0.0/16')).toBe(true);
+ expect(nonRoutableRanges.some((r) => r.network === '127.0.0.0/8')).toBe(true);
});
it('includes proper RFC references', () => {
- const rfcReferences = [...new Set(specialIPv4Content.ranges.map(r => r.rfc))];
-
- expect(rfcReferences).toContain("RFC 1918"); // Private addresses
- expect(rfcReferences).toContain("RFC 1122"); // Loopback and this network
- expect(rfcReferences).toContain("RFC 3927"); // Link-local
- expect(rfcReferences).toContain("RFC 5737"); // TEST-NET ranges
- expect(rfcReferences).toContain("RFC 6598"); // CGNAT
- expect(rfcReferences).toContain("RFC 6890"); // Special-use IPv4 addresses
- expect(rfcReferences).toContain("RFC 1112"); // Multicast and reserved
+ const rfcReferences = [...new Set(specialIPv4Content.ranges.map((r) => r.rfc))];
+
+ expect(rfcReferences).toContain('RFC 1918'); // Private addresses
+ expect(rfcReferences).toContain('RFC 1122'); // Loopback and this network
+ expect(rfcReferences).toContain('RFC 3927'); // Link-local
+ expect(rfcReferences).toContain('RFC 5737'); // TEST-NET ranges
+ expect(rfcReferences).toContain('RFC 6598'); // CGNAT
+ expect(rfcReferences).toContain('RFC 6890'); // Special-use IPv4 addresses
+ expect(rfcReferences).toContain('RFC 1112'); // Multicast and reserved
});
-});
\ No newline at end of file
+});
diff --git a/tests/unit/utils/ip-validation-extended.test.ts b/tests/unit/utils/ip-validation-extended.test.ts
index 9863ea3e..e3ce38ce 100644
--- a/tests/unit/utils/ip-validation-extended.test.ts
+++ b/tests/unit/utils/ip-validation-extended.test.ts
@@ -139,18 +139,18 @@ describe('validateIPv4Detailed', () => {
expect(result.details.isReserved).toBe(true);
});
- it('validates class A private addresses', () => {
+ it('validates 10.0.0.0/8 private addresses', () => {
const result = validateIPv4Detailed('10.0.0.1');
expect(result.isValid).toBe(true);
- expect(result.details.addressType).toContain('Private');
- expect(result.details.addressType).toContain('Class A');
+ expect(result.details.addressType).toBe('Private');
+ expect(result.details.isPrivate).toBe(true);
});
- it('validates class B private addresses', () => {
+ it('validates 172.16.0.0/12 private addresses', () => {
const result = validateIPv4Detailed('172.16.0.1');
expect(result.isValid).toBe(true);
- expect(result.details.addressType).toContain('Private');
- expect(result.details.addressType).toContain('Class B');
+ expect(result.details.addressType).toBe('Private');
+ expect(result.details.isPrivate).toBe(true);
});
it('handles negative numbers', () => {