xref: /aosp_15_r20/external/antlr/runtime/Cpp/tests/t012.cpp (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot #include "UserTestTraits.hpp"
2*16467b97STreehugger Robot #include "t012lexerXMLLexer.hpp"
3*16467b97STreehugger Robot 
4*16467b97STreehugger Robot #include <sys/types.h>
5*16467b97STreehugger Robot 
6*16467b97STreehugger Robot #include <iostream>
7*16467b97STreehugger Robot #include <sstream>
8*16467b97STreehugger Robot #include <fstream>
9*16467b97STreehugger Robot 
10*16467b97STreehugger Robot using namespace Antlr3Test;
11*16467b97STreehugger Robot using namespace std;
12*16467b97STreehugger Robot 
13*16467b97STreehugger Robot int testValid(string const& in, string const& out);
14*16467b97STreehugger Robot int testMalformedInput1(string const& data);
15*16467b97STreehugger Robot int testMalformedInput2(string const& data);
16*16467b97STreehugger Robot int testMalformedInput3(string const& data);
17*16467b97STreehugger Robot string slurp(string const& fileName);
18*16467b97STreehugger Robot 
19*16467b97STreehugger Robot static t012lexerXMLLexer *lxr;
20*16467b97STreehugger Robot 
main(int argc,char * argv[])21*16467b97STreehugger Robot int main (int argc, char *argv[])
22*16467b97STreehugger Robot {
23*16467b97STreehugger Robot 	testValid("t012lexerXML.input", "t012lexerXML.output");
24*16467b97STreehugger Robot 	testMalformedInput1("<?xml version='1.0'?>\n<document d>\n</document>\n");
25*16467b97STreehugger Robot 	testMalformedInput2("<?tml version='1.0'?>\n<document>\n</document>\n");
26*16467b97STreehugger Robot 	testMalformedInput3("<?xml version='1.0'?>\n<docu ment attr=\"foo\">\n</document>\n");
27*16467b97STreehugger Robot 
28*16467b97STreehugger Robot 	return 0;
29*16467b97STreehugger Robot }
30*16467b97STreehugger Robot 
testValid(string const & inFilename,string const & outFilename)31*16467b97STreehugger Robot int testValid(string const& inFilename, string const& outFilename)
32*16467b97STreehugger Robot {
33*16467b97STreehugger Robot 	string data = slurp(inFilename);
34*16467b97STreehugger Robot 	t012lexerXMLLexerTraits::InputStreamType* input	= new t012lexerXMLLexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
35*16467b97STreehugger Robot 										       ANTLR_ENC_8BIT,
36*16467b97STreehugger Robot 										       data.length(), //strlen(data.c_str()),
37*16467b97STreehugger Robot 											   (ANTLR_UINT8*)inFilename.c_str());
38*16467b97STreehugger Robot 	if (lxr == NULL)
39*16467b97STreehugger Robot 		lxr = new t012lexerXMLLexer(input);
40*16467b97STreehugger Robot 	else
41*16467b97STreehugger Robot 		lxr->setCharStream(input);
42*16467b97STreehugger Robot 
43*16467b97STreehugger Robot 	std::cout << "testValid: \"" << inFilename << '"' <<std::endl;
44*16467b97STreehugger Robot 	for(;;)
45*16467b97STreehugger Robot 	{
46*16467b97STreehugger Robot 		t012lexerXMLLexerTraits::CommonTokenType *token = lxr->nextToken();
47*16467b97STreehugger Robot 		if( token->getType() == t012lexerXMLLexerTokens::EOF_TOKEN)
48*16467b97STreehugger Robot 			break;
49*16467b97STreehugger Robot 	}
50*16467b97STreehugger Robot 
51*16467b97STreehugger Robot 	string expOutput = slurp(outFilename);
52*16467b97STreehugger Robot 	string lxrOutput = lxr->outbuf.str();
53*16467b97STreehugger Robot 
54*16467b97STreehugger Robot 	ofstream out("t012.lxr.output");
55*16467b97STreehugger Robot 	out << lxrOutput;
56*16467b97STreehugger Robot 
57*16467b97STreehugger Robot 	std::cout << inFilename << '\t' << (expOutput == lxrOutput ?  "OK" : "Fail") << std::endl;
58*16467b97STreehugger Robot 
59*16467b97STreehugger Robot 	delete lxr; lxr = NULL;
60*16467b97STreehugger Robot 	delete input;
61*16467b97STreehugger Robot 	return 0;
62*16467b97STreehugger Robot }
63*16467b97STreehugger Robot 
testMalformedInput1(string const & data)64*16467b97STreehugger Robot int testMalformedInput1(string const& data)
65*16467b97STreehugger Robot {
66*16467b97STreehugger Robot 	t012lexerXMLLexerTraits::InputStreamType* input	= new t012lexerXMLLexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
67*16467b97STreehugger Robot 										       ANTLR_ENC_8BIT,
68*16467b97STreehugger Robot 										       data.length(), //strlen(data.c_str()),
69*16467b97STreehugger Robot 										       (ANTLR_UINT8*)"t012");
70*16467b97STreehugger Robot 	if (lxr == NULL)
71*16467b97STreehugger Robot 		lxr = new t012lexerXMLLexer(input);
72*16467b97STreehugger Robot 	else
73*16467b97STreehugger Robot 		lxr->setCharStream(input);
74*16467b97STreehugger Robot 
75*16467b97STreehugger Robot 	std::cout << "testMalformedInput1: \"" << data << '"' <<std::endl;
76*16467b97STreehugger Robot 
77*16467b97STreehugger Robot 	t012lexerXMLLexerTraits::CommonTokenType *token;
78*16467b97STreehugger Robot 	token = lxr->nextToken();
79*16467b97STreehugger Robot 	std::cout << token->getText() << std::endl;
80*16467b97STreehugger Robot 	token = lxr->nextToken();
81*16467b97STreehugger Robot 	std::cout << token->getText() << std::endl;
82*16467b97STreehugger Robot 	token = lxr->nextToken();
83*16467b97STreehugger Robot 	std::cout << token->getText() << std::endl;
84*16467b97STreehugger Robot 
85*16467b97STreehugger Robot         // try:
86*16467b97STreehugger Robot         //     while True:
87*16467b97STreehugger Robot         //         token = lexer.nextToken()
88*16467b97STreehugger Robot         //         # Should raise NoViableAltException before hitting EOF
89*16467b97STreehugger Robot         //         if token.type == antlr3.EOF:
90*16467b97STreehugger Robot         //             self.fail()
91*16467b97STreehugger Robot 	//
92*16467b97STreehugger Robot         // except antlr3.NoViableAltException as exc:
93*16467b97STreehugger Robot         //     self.assertEqual(exc.unexpectedType, '>')
94*16467b97STreehugger Robot         //     self.assertEqual(exc.charPositionInLine, 11)
95*16467b97STreehugger Robot         //     self.assertEqual(exc.line, 2)
96*16467b97STreehugger Robot 
97*16467b97STreehugger Robot 	delete lxr; lxr = NULL;
98*16467b97STreehugger Robot 	delete input;
99*16467b97STreehugger Robot 	return 0;
100*16467b97STreehugger Robot }
101*16467b97STreehugger Robot 
testMalformedInput2(string const & data)102*16467b97STreehugger Robot int testMalformedInput2(string const& data)
103*16467b97STreehugger Robot {
104*16467b97STreehugger Robot 	t012lexerXMLLexerTraits::InputStreamType* input	= new t012lexerXMLLexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
105*16467b97STreehugger Robot 										       ANTLR_ENC_8BIT,
106*16467b97STreehugger Robot 										       data.length(), //strlen(data.c_str()),
107*16467b97STreehugger Robot 										       (ANTLR_UINT8*)"t012");
108*16467b97STreehugger Robot 	if (lxr == NULL)
109*16467b97STreehugger Robot 		lxr = new t012lexerXMLLexer(input);
110*16467b97STreehugger Robot 	else
111*16467b97STreehugger Robot 		lxr->setCharStream(input);
112*16467b97STreehugger Robot 
113*16467b97STreehugger Robot 	std::cout << "testMalformedInput2: \"" << data << '"' <<std::endl;
114*16467b97STreehugger Robot 
115*16467b97STreehugger Robot 	t012lexerXMLLexerTraits::CommonTokenType *token;
116*16467b97STreehugger Robot 	token = lxr->nextToken();
117*16467b97STreehugger Robot 	std::cout << token->getText() << std::endl;
118*16467b97STreehugger Robot 	token = lxr->nextToken();
119*16467b97STreehugger Robot 	std::cout << token->getText() << std::endl;
120*16467b97STreehugger Robot 	token = lxr->nextToken();
121*16467b97STreehugger Robot 	std::cout << token->getText() << std::endl;
122*16467b97STreehugger Robot 
123*16467b97STreehugger Robot         // try:
124*16467b97STreehugger Robot         //     while True:
125*16467b97STreehugger Robot         //         token = lexer.nextToken()
126*16467b97STreehugger Robot         //         # Should raise NoViableAltException before hitting EOF
127*16467b97STreehugger Robot         //         if token.type == antlr3.EOF:
128*16467b97STreehugger Robot         //             self.fail()
129*16467b97STreehugger Robot 	//
130*16467b97STreehugger Robot         // except antlr3.MismatchedSetException as exc:
131*16467b97STreehugger Robot         //     self.assertEqual(exc.unexpectedType, 't')
132*16467b97STreehugger Robot         //     self.assertEqual(exc.charPositionInLine, 2)
133*16467b97STreehugger Robot         //     self.assertEqual(exc.line, 1)
134*16467b97STreehugger Robot 
135*16467b97STreehugger Robot 	delete lxr; lxr = NULL;
136*16467b97STreehugger Robot 	delete input;
137*16467b97STreehugger Robot 	return 0;
138*16467b97STreehugger Robot }
139*16467b97STreehugger Robot 
testMalformedInput3(string const & data)140*16467b97STreehugger Robot int testMalformedInput3(string const& data)
141*16467b97STreehugger Robot {
142*16467b97STreehugger Robot 	t012lexerXMLLexerTraits::InputStreamType* input	= new t012lexerXMLLexerTraits::InputStreamType((const ANTLR_UINT8 *)data.c_str(),
143*16467b97STreehugger Robot 										       ANTLR_ENC_8BIT,
144*16467b97STreehugger Robot 										       data.length(), //strlen(data.c_str()),
145*16467b97STreehugger Robot 										       (ANTLR_UINT8*)"t012");
146*16467b97STreehugger Robot 	if (lxr == NULL)
147*16467b97STreehugger Robot 		lxr = new t012lexerXMLLexer(input);
148*16467b97STreehugger Robot 	else
149*16467b97STreehugger Robot 		lxr->setCharStream(input);
150*16467b97STreehugger Robot 
151*16467b97STreehugger Robot 	std::cout << "testMalformedInput3: \"" << data << '"' <<std::endl;
152*16467b97STreehugger Robot 
153*16467b97STreehugger Robot 	t012lexerXMLLexerTraits::CommonTokenType *token;
154*16467b97STreehugger Robot 	token = lxr->nextToken();
155*16467b97STreehugger Robot 	std::cout << token->getText() << std::endl;
156*16467b97STreehugger Robot 	token = lxr->nextToken();
157*16467b97STreehugger Robot 	std::cout << token->getText() << std::endl;
158*16467b97STreehugger Robot 	token = lxr->nextToken();
159*16467b97STreehugger Robot 	std::cout << token->getText() << std::endl;
160*16467b97STreehugger Robot 
161*16467b97STreehugger Robot         // try:
162*16467b97STreehugger Robot         //     while True:
163*16467b97STreehugger Robot         //         token = lexer.nextToken()
164*16467b97STreehugger Robot         //         # Should raise NoViableAltException before hitting EOF
165*16467b97STreehugger Robot         //         if token.type == antlr3.EOF:
166*16467b97STreehugger Robot         //             self.fail()
167*16467b97STreehugger Robot 	//
168*16467b97STreehugger Robot         // except antlr3.NoViableAltException as exc:
169*16467b97STreehugger Robot         //     self.assertEqual(exc.unexpectedType, 'a')
170*16467b97STreehugger Robot         //     self.assertEqual(exc.charPositionInLine, 11)
171*16467b97STreehugger Robot         //     self.assertEqual(exc.line, 2)
172*16467b97STreehugger Robot 
173*16467b97STreehugger Robot 	delete lxr; lxr = NULL;
174*16467b97STreehugger Robot 	delete input;
175*16467b97STreehugger Robot 	return 0;
176*16467b97STreehugger Robot }
177*16467b97STreehugger Robot 
slurp(string const & fileName)178*16467b97STreehugger Robot string slurp(string const& fileName)
179*16467b97STreehugger Robot {
180*16467b97STreehugger Robot 	ifstream ifs(fileName.c_str(), ios::in | ios::binary | ios::ate);
181*16467b97STreehugger Robot 	ifstream::pos_type fileSize = ifs.tellg();
182*16467b97STreehugger Robot 	ifs.seekg(0, ios::beg);
183*16467b97STreehugger Robot 
184*16467b97STreehugger Robot 	stringstream sstr;
185*16467b97STreehugger Robot 	sstr << ifs.rdbuf();
186*16467b97STreehugger Robot 	return sstr.str();
187*16467b97STreehugger Robot }
188