Lindenii Project Forge
Login

hare-ds

Data structures for Hare

Warning: Due to various recent migrations, viewing non-HEAD refs may be broken.

/ds/set/bloom/test.ha (raw)

use ds::set;
use errors;

fn testhash(_params: nullable *opaque, key: []u8) size = {
	let val: u64 = 0;
	let limit = if (len(key) < 8z) len(key) else 8z;
	for (let i = 0z; i < limit; i += 1) {
		val |= (key[i]: u64) << (8u64 * (i: u64));
	};
	return (val: size);
};

fn put_le64(dst: *[8]u8, v: u64) []u8 = {
	for (let i = 0z; i < 8z; i += 1) {
		dst[i] = ((v >> (8u64 * (i: u64))) & 0xFFu64): u8;
	};
	return dst[..];
};

@test fn invalid() void = {
	match (new(0, 1, &testhash, null)) {
	case errors::invalid => void;
	case *set => abort("new accepted m=0");
	case nomem => abort("new(m=0) returned nomem");
	};
	match (new(64, 0, &testhash, null)) {
	case errors::invalid => void;
	case *set => abort("new accepted k=0");
	case nomem => abort("new(k=0) returned nomem");
	};
};

@test fn basic() void = {
	let s = match (new(256, 2, &testhash, null)) {
	case let sp: *set => yield sp;
	case errors::invalid => abort("basic: invalid");
	case nomem => abort("basic: nomem");
	};
	defer finish(s);
	let iface: *set::set = (s: *set::set);

	const inserted: [4]u64 = [1u64, 3u64, 17u64, 41u64];
	let keybuf: [8]u8 = [0...];
	for (let i = 0z; i < len(inserted); i += 1) {
		let key = put_le64(&keybuf, inserted[i]);
		assert(!contains(s, key), "contains before add");
		match (set::add(iface, key)) {
		case void => void;
		case nomem => abort("basic: add nomem");
		};
		assert(set::contains(iface, key), "contains after add");
	};

	const missing: [3]u64 = [11u64, 21u64, 111u64];
	for (let i = 0z; i < len(missing); i += 1) {
		let key = put_le64(&keybuf, missing[i]);
		assert(!set::contains(iface, key), "contains false positive");
	};
};