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