OSDN Git Service

-lexeme_idを、private inherit Enum idiomで書き直した。なんかよくわからないエラーが出るけど気にしない。
[simplecms/utakata.git] / test / lexer_test.cpp
1 #include <iostream>
2 #include <sstream>
3 #include <string>
4 #include <functional>
5
6 #include "../simpletest.h"
7
8 #include "../textarrayformat.h"
9 #include "../lexeme_id.h"
10 #include "../utf8.h"
11 #include "../lexer.h"
12 #include "../lexeme.h"
13
14 using namespace std;
15 using namespace utakata;
16
17 bool lexer_test(smart_ptr<simpletest::SimpleTestAsserter> asserter)
18 {
19     std::stringstream ss;
20     ss << "==========" << endl;
21     ss << "(hoge 12 \"hoge\" )" << endl;
22
23     textarrayformat::TextArrayReader reader(ss);
24     smart_ptr<istream> formats(new stringstream(reader.get()));
25     smart_ptr<utakata::utf8::UTF8InputStream> st;
26     st.add(new utakata::utf8::UTF8InputStream(formats));
27     
28     utakata::lexer::Lexer lexer;
29
30     smart_ptr<lexeme::ILexeme> m(lexer.lex(st));
31     asserter->checkOnly(m->toString()->toStr(), "(");
32     asserter->checkOnly(m->getID(), lexeme::LexemeID::openParenthesis, "open paren");
33
34     m = lexer.lex(st);
35     asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "identifier");
36
37     m = lexer.lex(st);
38     asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::number.toEnum(), "number");
39
40     m = lexer.lex(st);
41     asserter->checkOnly(m->getID(), lexeme::LexemeID::string, "string");
42
43     m = lexer.lex(st);
44     asserter->checkOnly(m->getID(), lexeme::LexemeID::closeParenthesis, "close");
45
46     // ここで終了しているはず。EOFの状態から実行されると、EOFのIDを持った
47     // lexemeが返される。
48     m = lexer.lex(st);
49     asserter->checkOnly(m->getID(), lexeme::LexemeID::eos, "eos");
50     
51     return asserter->isOk();
52 }
53
54 bool lexer_test2(smart_ptr<simpletest::SimpleTestAsserter> asserter)
55 {
56     std::stringstream ss;
57     ss << "==========" << endl;
58     ss << ",@(hoge 12 `(hoge) 'huga #f #t)" << endl;
59
60     textarrayformat::TextArrayReader reader(ss);
61     smart_ptr<istream> formats(new stringstream(reader.get()));
62     smart_ptr<utakata::utf8::UTF8InputStream> st;
63     st.add(new utakata::utf8::UTF8InputStream(formats));
64     
65     utakata::lexer::Lexer lexer;
66
67     smart_ptr<lexeme::ILexeme> m(lexer.lex(st));
68     asserter->checkOnly(m->toString()->toStr(), ",@");
69
70     m = lexer.lex(st);
71     asserter->checkOnly(m->getID(), lexeme::LexemeID::openParenthesis, "open paren");
72
73     m = lexer.lex(st);
74     asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "identifier");
75
76     m = lexer.lex(st);
77     asserter->checkOnly(m->getID(), lexeme::LexemeID::number, "number");
78
79     m = lexer.lex(st);
80     asserter->checkOnly(m->getID(), lexeme::LexemeID::backquote, "back quote");
81
82     m = lexer.lex(st);
83     asserter->checkOnly(m->getID(), lexeme::LexemeID::openParenthesis, "open paren2");
84
85     m = lexer.lex(st);
86     asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "identifier2");
87
88     m = lexer.lex(st);
89     asserter->checkOnly(m->getID(), lexeme::LexemeID::closeParenthesis, "close");
90
91     m = lexer.lex(st);
92     asserter->checkOnly(m->getID(), lexeme::LexemeID::quote, "quote");
93
94     m = lexer.lex(st);
95     asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "identifier2");
96
97     // booleanの解析が行えるかどうか。
98     m = lexer.lex(st);
99     asserter->checkOnly(m->getID(), lexeme::LexemeID::boolean, "boolean:false");
100     m = lexer.lex(st);
101     asserter->checkOnly(m->getID(), lexeme::LexemeID::boolean, "boolean:true");
102
103     m = lexer.lex(st);
104     asserter->checkOnly(m->getID(), lexeme::LexemeID::closeParenthesis, "close");
105
106     // ここで終了しているはず。EOFの状態から実行されると、EOFのIDを持った
107     // lexemeが返される。
108     m = lexer.lex(st);
109     asserter->checkOnly(m->getID(), lexeme::LexemeID::eos, "eos");
110     
111     return asserter->isOk();
112 }
113
114 bool lexer_test3(smart_ptr<simpletest::SimpleTestAsserter> asserter)
115 {
116     std::stringstream ss;
117     ss << "==========" << endl;
118     ss << "#'(hoge #,12 #`(hoge) 'huga) ; comment" << endl;
119     ss << "hoge #vu8(12 12) #(vector)" << endl;
120
121     textarrayformat::TextArrayReader reader(ss);
122     smart_ptr<istream> formats(new stringstream(reader.get()));
123     smart_ptr<utakata::utf8::UTF8InputStream> st;
124     st.add(new utakata::utf8::UTF8InputStream(formats));
125     
126     utakata::lexer::Lexer lexer;
127
128     smart_ptr<lexeme::ILexeme> m(lexer.lex(st));
129     asserter->checkOnly(m->toString()->toStr(), "#'");
130
131     m = lexer.lex(st);
132     asserter->checkOnly(lexeme::LexemeID::openParenthesis, m->getID(), "open paren");
133
134     m = lexer.lex(st);
135     asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "identifier");
136
137     m = lexer.lex(st);
138     asserter->checkOnly(m->toString()->toStr(), "#,");
139     asserter->checkOnly(m->getID(), lexeme::LexemeID::unsyntax, "unsyntax");
140
141     m = lexer.lex(st);
142     asserter->checkOnly(m->getID(), lexeme::LexemeID::number, "number");
143
144     m = lexer.lex(st);
145     asserter->checkOnly(m->getID(), lexeme::LexemeID::quasiSyntax, "quasi syntax");
146
147     m = lexer.lex(st);
148     asserter->checkOnly(m->getID(), lexeme::LexemeID::openParenthesis, "open paren2");
149
150     m = lexer.lex(st);
151     asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "identifier2");
152
153     m = lexer.lex(st);
154     asserter->checkOnly(m->getID(), lexeme::LexemeID::closeParenthesis, "close");
155
156     m = lexer.lex(st);
157     asserter->checkOnly(m->getID(), lexeme::LexemeID::quote, "quote");
158
159     m = lexer.lex(st);
160     asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "identifier2");
161
162     m = lexer.lex(st);
163     asserter->checkOnly(m->getID(), lexeme::LexemeID::closeParenthesis, "close");
164
165     m = lexer.lex(st);
166     asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "identifier3");
167
168     m = lexer.lex(st);
169     asserter->checkOnly(m->getID(), lexeme::LexemeID::byteVector, "byteVector");
170     m = lexer.lex(st);
171     asserter->checkOnly(m->getID(), lexeme::LexemeID::number, "byteVector:number1");
172     m = lexer.lex(st);
173     asserter->checkOnly(m->getID(), lexeme::LexemeID::number, "byteVector:number2");
174     m = lexer.lex(st);
175     asserter->checkOnly(m->getID(), lexeme::LexemeID::closeParenthesis, "close");
176
177     m = lexer.lex(st);
178     asserter->checkOnly(m->getID(), lexeme::LexemeID::vector, "vector");
179     m = lexer.lex(st);
180     asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "vector:identifier");
181     m = lexer.lex(st);
182     asserter->checkOnly(m->getID(), lexeme::LexemeID::closeParenthesis, "close");
183     
184     // ここで終了しているはず。EOFの状態から実行されると、EOFのIDを持った
185     // lexemeが返される。
186     m = lexer.lex(st);
187     asserter->checkOnly(m->getID(), lexeme::LexemeID::eos, "eos");
188     
189     return asserter->isOk();
190 }
191
192
193 int main(int argc, char *argv[])
194 {
195     simpletest::SimpleTestSuite suite("main lexer test");
196     suite.addTester(sfcr::screate(lexer_test, suite.getAsserter()));
197     suite.addTester(sfcr::screate(lexer_test2, suite.getAsserter()));
198     suite.addTester(sfcr::screate(lexer_test3, suite.getAsserter()));
199     suite.run();
200     return 0;
201 }