hare

[hare] The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

test+test.ha (3328B)


      1 // SPDX-License-Identifier: MPL-2.0
      2 // (c) Hare authors <https://harelang.org>
      3 
      4 use strings;
      5 
      6 fn ip_test(s: str, expected: (addr|invalid)) void = {
      7 	let pr = parse(s);
      8 	let ip = if (pr is invalid) {
      9 		assert(expected is invalid);
     10 		return;
     11 	} else {
     12 		assert(expected is addr);
     13 		assert(equal(pr as addr, expected as addr));
     14 		yield pr as addr;
     15 	};
     16 	let fmted = string(ip);
     17 	let iprp = parse(fmted);
     18 	assert(iprp is addr);
     19 	let ipr = iprp as addr;
     20 	assert(equal(ip, ipr));
     21 	if (ip is addr4) {
     22 		assert(fmted == s);
     23 	} else {
     24 		const dup = strings::dup(fmted);
     25 		defer free(dup);
     26 		assert(dup == string(ipr));
     27 	};
     28 };
     29 
     30 @test fn parse_ip() void = {
     31 	let tests: [](str, (addr|invalid)) = [
     32 		("127.0.0.1", [127, 0, 0, 1]: addr4),
     33 		("192.168.18.1", [192, 168, 18, 1]: addr4),
     34 		("-127.0.0.1", invalid),
     35 		("127.-0.0.1", invalid),
     36 		("0.011.001.000", invalid),
     37 		("::", [0...]: addr6),
     38 		("::1", [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]: addr6),
     39 		("::FFFF:FFFF", [0,0,0,0,0,0,0,0,0,0,0,0,0xFF,0xFF,0xFF,0xFF]: addr6),
     40 		("::FFFF", [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xFF,0xFF]: addr6),
     41 		(":FFFF", invalid),
     42 		("::1:1", [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1]: addr6),
     43 		("1::1", [0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1]: addr6),
     44 		(":::1:1", invalid),
     45 		(":::", invalid),
     46 		("::1::1", invalid),
     47 		("1::::1", invalid),
     48 		("FFFF::FFFF::1", invalid),
     49 		("::127.0.0.1", [0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,1]: addr6),
     50 		("FFFF:FFFF", invalid),
     51 		("DEAD::BEef", [0xDE, 0xAD, 0,0,0,0,0,0,0,0,0,0,0,0, 0xBE, 0xEF]: addr6),
     52 		("DEAD::BEef:A12D", [0xDE, 0xAD, 0,0,0,0,0,0,0,0,0,0, 0xBE, 0xEF, 0xA1, 0x2D]: addr6),
     53 		("DEAD:BEef::0102:A12D", [0xDE, 0xAD,0xBE,0xEF,0,0,0,0,0,0,0,0,0x01,0x02,0xA1,0x2D]: addr6),
     54 		("DEAD:BEef:::A12D", invalid),
     55 		("1980:cafe:a:babe::1", [0x19, 0x80, 0xca, 0xfe, 0x0, 0xa, 0xba, 0xbe, 0, 0, 0, 0, 0, 0, 0, 1]: addr6),
     56 		("a1:a2:a3:a4::b1:b2:b3:b4", invalid),
     57 		("", invalid),
     58 	];
     59 	for (let (string, expected) .. tests) {
     60 		ip_test(string, expected);
     61 	};
     62 };
     63 
     64 fn subnet_test_simple(s: str) void = {
     65 	let net = match (parsecidr(s)) {
     66 	case let a: subnet =>
     67 		yield a;
     68 	case =>
     69 		return;
     70 	};
     71 	let fmted = string(net);
     72 	assert(fmted == s);
     73 	let netrp = parsecidr(fmted);
     74 	assert(netrp is subnet);
     75 	let netr = netrp as subnet;
     76 	assert(equal(net.addr, netr.addr));
     77 	assert(equal(net.mask, netr.mask));
     78 };
     79 
     80 @test fn parse_subnet() void = {
     81 	let subnet_tests: []str = [
     82 		"192.168.1.0/0",
     83 		"192.168.1.0/23",
     84 		"192.168.1.0/24",
     85 		"192.168.1.0/32",
     86 	];
     87 	for (let test .. subnet_tests) {
     88 		subnet_test_simple(test);
     89 	};
     90 };
     91 
     92 @test fn test_subnet_contains() void = {
     93 	let addr_tests: [](str, str, bool) = [
     94 		// a, b, want
     95 		("10.10.10.0/24", "10.10.10.0",   true),
     96 		("10.10.10.0/24", "10.10.10.255", true),
     97 		("10.10.10.0/24", "10.10.11.0",   false),
     98 		("127.0.0.1/24",  "::1",          false),
     99 		("::1/8",         "::1",          true),
    100 	];
    101 	let cidr_tests: [](str, str, bool) = [
    102 		// a, b, want
    103 		("10.10.10.0/24", "10.10.10.0/24", true),
    104 		("10.10.10.0/24", "10.10.10.0/25", true),
    105 		("10.10.10.0/24", "10.10.10.0/23", false),
    106 		("10.10.10.0/24", "10.10.11.0/24", false),
    107 	];
    108 	for (let (a, b, want) .. addr_tests) {
    109 		let a = parsecidr(a)!;
    110 		let b = parse(b)!;
    111 		assert(subnet_contains(a, b) == want);
    112 	};
    113 	for (let (a, b, want) .. cidr_tests) {
    114 		let a = parsecidr(a)!;
    115 		let b = parsecidr(b)!;
    116 		assert(subnet_contains(a, b) == want);
    117 	};
    118 };