6 #include "../simpletest.h"
8 #include "../textarrayformat.h"
9 #include "../lexeme_id.h"
12 #include "../lexeme.h"
15 using namespace utakata;
17 bool lexer_test(smart_ptr<simpletest::SimpleTestAsserter> asserter)
20 ss << "==========" << endl;
21 ss << "(hoge 12 \"hoge\" )" << endl;
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));
28 utakata::lexer::Lexer lexer;
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");
35 asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "identifier");
38 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::number.toEnum(), "number");
41 asserter->checkOnly(m->getID(), lexeme::LexemeID::string, "string");
44 asserter->checkOnly(m->getID(), lexeme::LexemeID::closeParenthesis, "close");
46 // ここで終了しているはず。EOFの状態から実行されると、EOFのIDを持った
49 asserter->checkOnly(m->getID(), lexeme::LexemeID::eos, "eos");
51 return asserter->isOk();
54 bool lexer_test2(smart_ptr<simpletest::SimpleTestAsserter> asserter)
57 ss << "==========" << endl;
58 ss << ",@(hoge 12 `(hoge) 'huga #f #t)" << endl;
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));
65 utakata::lexer::Lexer lexer;
67 smart_ptr<lexeme::ILexeme> m(lexer.lex(st));
68 asserter->checkOnly(m->toString()->toStr(), ",@");
71 asserter->checkOnly(m->getID(), lexeme::LexemeID::openParenthesis, "open paren");
74 asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "identifier");
77 asserter->checkOnly(m->getID(), lexeme::LexemeID::number, "number");
80 asserter->checkOnly(m->getID(), lexeme::LexemeID::backquote, "back quote");
83 asserter->checkOnly(m->getID(), lexeme::LexemeID::openParenthesis, "open paren2");
86 asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "identifier2");
89 asserter->checkOnly(m->getID(), lexeme::LexemeID::closeParenthesis, "close");
92 asserter->checkOnly(m->getID(), lexeme::LexemeID::quote, "quote");
95 asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "identifier2");
97 // booleanの解析が行えるかどうか。
99 asserter->checkOnly(m->getID(), lexeme::LexemeID::boolean, "boolean:false");
101 asserter->checkOnly(m->getID(), lexeme::LexemeID::boolean, "boolean:true");
104 asserter->checkOnly(m->getID(), lexeme::LexemeID::closeParenthesis, "close");
106 // ここで終了しているはず。EOFの状態から実行されると、EOFのIDを持った
109 asserter->checkOnly(m->getID(), lexeme::LexemeID::eos, "eos");
111 return asserter->isOk();
114 bool lexer_test3(smart_ptr<simpletest::SimpleTestAsserter> asserter)
116 std::stringstream ss;
117 ss << "==========" << endl;
118 ss << "#'(hoge #,12 #`(hoge) 'huga) ; comment" << endl;
119 ss << "hoge #vu8(12 12) #(vector)" << endl;
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));
126 utakata::lexer::Lexer lexer;
128 smart_ptr<lexeme::ILexeme> m(lexer.lex(st));
129 asserter->checkOnly(m->toString()->toStr(), "#'");
132 asserter->checkOnly(lexeme::LexemeID::openParenthesis, m->getID(), "open paren");
135 asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "identifier");
138 asserter->checkOnly(m->toString()->toStr(), "#,");
139 asserter->checkOnly(m->getID(), lexeme::LexemeID::unsyntax, "unsyntax");
142 asserter->checkOnly(m->getID(), lexeme::LexemeID::number, "number");
145 asserter->checkOnly(m->getID(), lexeme::LexemeID::quasiSyntax, "quasi syntax");
148 asserter->checkOnly(m->getID(), lexeme::LexemeID::openParenthesis, "open paren2");
151 asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "identifier2");
154 asserter->checkOnly(m->getID(), lexeme::LexemeID::closeParenthesis, "close");
157 asserter->checkOnly(m->getID(), lexeme::LexemeID::quote, "quote");
160 asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "identifier2");
163 asserter->checkOnly(m->getID(), lexeme::LexemeID::closeParenthesis, "close");
166 asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "identifier3");
169 asserter->checkOnly(m->getID(), lexeme::LexemeID::byteVector, "byteVector");
171 asserter->checkOnly(m->getID(), lexeme::LexemeID::number, "byteVector:number1");
173 asserter->checkOnly(m->getID(), lexeme::LexemeID::number, "byteVector:number2");
175 asserter->checkOnly(m->getID(), lexeme::LexemeID::closeParenthesis, "close");
178 asserter->checkOnly(m->getID(), lexeme::LexemeID::vector, "vector");
180 asserter->checkOnly(m->getID(), lexeme::LexemeID::identifier, "vector:identifier");
182 asserter->checkOnly(m->getID(), lexeme::LexemeID::closeParenthesis, "close");
184 // ここで終了しているはず。EOFの状態から実行されると、EOFのIDを持った
187 asserter->checkOnly(m->getID(), lexeme::LexemeID::eos, "eos");
189 return asserter->isOk();
193 int main(int argc, char *argv[])
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()));