Functional Weave
Code in Rust

net.ipv4@1.0.0

vectors.json

4,414 bytes · view raw

[
  { "fn": "parseIpv4", "name": "a private address: 192*2^24 + 168*2^16 + 1*2^8 + 1", "args": ["192.168.1.1"], "expect": 3232235777 },
  { "fn": "parseIpv4", "name": "loopback is 127*2^24 + 1", "args": ["127.0.0.1"], "expect": 2130706433 },
  { "fn": "parseIpv4", "name": "each octet in its own byte", "args": ["1.2.3.4"], "expect": 16909060 },
  { "fn": "parseIpv4", "name": "all zeros is 0 (a lone 0 octet is not a leading zero)", "args": ["0.0.0.0"], "expect": 0 },
  { "fn": "parseIpv4", "name": "all ones is 2^32 - 1", "args": ["255.255.255.255"], "expect": 4294967295 },
  { "fn": "parseIpv4", "name": "10.0.0.1", "args": ["10.0.0.1"], "expect": 167772161 },
  { "fn": "parseIpv4", "name": "a leading zero is refused, not read as octal (inet_aton would say 1.2.3.4 or 8.x)", "args": ["010.1.1.1"], "expectError": "is not a dotted-quad IPv4 address" },
  { "fn": "parseIpv4", "name": "an octet above 255", "args": ["256.1.1.1"], "expectError": "is not a dotted-quad IPv4 address" },
  { "fn": "parseIpv4", "name": "three parts is not shorthand for 1.2.0.3", "args": ["1.2.3"], "expectError": "is not a dotted-quad IPv4 address" },
  { "fn": "parseIpv4", "name": "five parts", "args": ["1.2.3.4.5"], "expectError": "is not a dotted-quad IPv4 address" },
  { "fn": "parseIpv4", "name": "an empty octet", "args": ["1..3.4"], "expectError": "is not a dotted-quad IPv4 address" },
  { "fn": "parseIpv4", "name": "hex is refused", "args": ["0x7f.0.0.1"], "expectError": "is not a dotted-quad IPv4 address" },
  { "fn": "parseIpv4", "name": "a sign is refused", "args": ["+1.2.3.4"], "expectError": "is not a dotted-quad IPv4 address" },
  { "fn": "parseIpv4", "name": "leading whitespace is refused", "args": [" 1.2.3.4"], "expectError": "is not a dotted-quad IPv4 address" },
  { "fn": "parseIpv4", "name": "a trailing newline is refused", "args": ["1.2.3.4\n"], "expectError": "is not a dotted-quad IPv4 address" },
  { "fn": "parseIpv4", "name": "a non-ASCII digit is refused", "args": ["١.2.3.4"], "expectError": "is not a dotted-quad IPv4 address" },
  { "fn": "parseIpv4", "name": "empty text", "args": [""], "expectError": "is not a dotted-quad IPv4 address" },

  { "fn": "formatIpv4", "name": "3232235777 is 192.168.1.1", "args": [3232235777], "expect": "192.168.1.1" },
  { "fn": "formatIpv4", "name": "2130706433 is loopback", "args": [2130706433], "expect": "127.0.0.1" },
  { "fn": "formatIpv4", "name": "zero", "args": [0], "expect": "0.0.0.0" },
  { "fn": "formatIpv4", "name": "the largest address", "args": [4294967295], "expect": "255.255.255.255" },
  { "fn": "formatIpv4", "name": "256 carries into the third octet", "args": [256], "expect": "0.0.1.0" },
  { "fn": "formatIpv4", "name": "2^24 is 1.0.0.0", "args": [16777216], "expect": "1.0.0.0" },
  { "fn": "formatIpv4", "name": "above 2^31 does not go negative (signed 32-bit shifts would)", "args": [3221225985], "expect": "192.0.2.1" },
  { "fn": "formatIpv4", "name": "16909060 is 1.2.3.4", "args": [16909060], "expect": "1.2.3.4" },
  { "fn": "formatIpv4", "name": "negative", "args": [-1], "expectError": "IPv4 value must be an integer from 0 to 4294967295" },
  { "fn": "formatIpv4", "name": "2^32 is out of range", "args": [4294967296], "expectError": "IPv4 value must be an integer from 0 to 4294967295" },
  { "fn": "formatIpv4", "name": "a fraction", "args": [1.5], "expectError": "IPv4 value must be an integer from 0 to 4294967295" },

  { "fn": "isIpv4", "name": "an ordinary address", "args": ["192.168.0.1"], "expect": true },
  { "fn": "isIpv4", "name": "all zeros", "args": ["0.0.0.0"], "expect": true },
  { "fn": "isIpv4", "name": "all ones", "args": ["255.255.255.255"], "expect": true },
  { "fn": "isIpv4", "name": "a double zero octet is a leading zero", "args": ["00.0.0.0"], "expect": false },
  { "fn": "isIpv4", "name": "a short form", "args": ["127.1"], "expect": false },
  { "fn": "isIpv4", "name": "out of range", "args": ["999.999.999.999"], "expect": false },
  { "fn": "isIpv4", "name": "a trailing newline", "args": ["1.2.3.4\n"], "expect": false },
  { "fn": "isIpv4", "name": "non-ASCII digits", "args": ["١٢.1.1.1"], "expect": false },
  { "fn": "isIpv4", "name": "an IPv6 address", "args": ["::1"], "expect": false },
  { "fn": "isIpv4", "name": "a CIDR block is not an address", "args": ["10.0.0.0/8"], "expect": false },
  { "fn": "isIpv4", "name": "empty text", "args": [""], "expect": false }
]