18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file regex_test.cpp
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * A simple test for libregex. Run it through:
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * $ regex_test
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * or
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * $ regex_test filename(s)
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * when no argument is provided "mangled-name" is used,
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * see it for the input file format
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2003 OProfile authors
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author Philippe Elie
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "string_manip.h"
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_regex.h"
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <iostream>
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <fstream>
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include <cstdlib>
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddusing namespace std;
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic int nr_error = 0;
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddstatic void do_test(istream& fin)
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	regular_expression_replace rep;
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	setup_regex(rep, "../stl.pat");
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	string test, expect, last;
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool first = true;
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	while (getline(fin, last)) {
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		last = trim(last);
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (last.length() == 0 || last[0] == '#')
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			continue;
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (first) {
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			test = last;
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			first = false;
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		} else {
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			expect = last;
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			first = true;
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			string str(test);
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			rep.execute(str);
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if (str != expect) {
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				cerr << "mistmatch: test, expect, returned\n"
538cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				     << '"' << test << '"' << endl
548cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				     << '"' << expect << '"' << endl
558cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				     << '"' << str << '"' << endl;
568cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				++nr_error;
578cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			}
588cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
598cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
608cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
618cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	if (!first)
628cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		cerr << "input file ill formed\n";
638cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
648cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
658cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddint main(int argc, char * argv[])
668cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
678cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	try {
688cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (argc > 1) {
698cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			for (int i = 1; i < argc; ++i) {
708cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				ifstream fin(argv[i]);
718cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				do_test(fin);
728cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			}
738cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		} else {
748cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			ifstream fin("mangled-name");
758cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			if (!fin) {
768cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				cerr << "Unable to open input test "
778cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				     << "\"mangled_name\"\n" << endl;
788cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd				exit(EXIT_FAILURE);
798cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			}
808cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			do_test(fin);
818cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		}
828cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
838cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	catch (bad_regex const & e) {
848cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		cerr << "bad_regex " << e.what() << endl;
858cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return EXIT_FAILURE;
868cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
878cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	catch (exception const & e) {
888cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		cerr << "exception: " << e.what() << endl;
898cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return EXIT_FAILURE;
908cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
918cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
928cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	return nr_error ? EXIT_FAILURE : EXIT_SUCCESS;
938cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd}
948cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
95