/*
 * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
 * Copyright (C) 2004-2010 Red Hat, Inc. All rights reserved.
 *
 * This file is part of LVM2.
 *
 * This copyrighted material is made available to anyone wishing to use,
 * modify, copy, or redistribute it subject to the terms and conditions
 * of the GNU General Public License v.2.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include "units.h"

#include "matcher_data.h"

static struct dm_pool *mem = NULL;

int regex_init(void) {
	mem = dm_pool_create("bitset test", 1024);
	return mem == NULL;
}

int regex_fini(void) {
	dm_pool_destroy(mem);
	return 0;
}

static struct dm_regex *make_scanner(const char **rx)
{
	struct dm_regex *scanner;
	int nrx = 0;
	for (; rx[nrx]; ++nrx);

	scanner = dm_regex_create(mem, rx, nrx);
	CU_ASSERT_FATAL(scanner != NULL);
	return scanner;
}

static void test_fingerprints(void) {
	struct dm_regex *scanner;

	scanner = make_scanner(dev_patterns);
	CU_ASSERT_EQUAL(dm_regex_fingerprint(scanner), 0x7f556c09);

	scanner = make_scanner(random_patterns);
	CU_ASSERT_EQUAL(dm_regex_fingerprint(scanner), 0x9f11076c);
}

static void test_matching(void) {
	struct dm_regex *scanner;
	int i;

	scanner = make_scanner(dev_patterns);
	for (i = 0; devices[i].str; ++i)
		CU_ASSERT_EQUAL(dm_regex_match(scanner, devices[i].str), devices[i].expected - 1);

	scanner = make_scanner(nonprint_patterns);
	for (i = 0; nonprint[i].str; ++i)
		CU_ASSERT_EQUAL(dm_regex_match(scanner, nonprint[i].str), nonprint[i].expected - 1);
}

CU_TestInfo regex_list[] = {
	{ (char*)"fingerprints", test_fingerprints },
	{ (char*)"matching", test_matching },
	CU_TEST_INFO_NULL
};
