6 #include "../simpletest.h"
8 #include "../textarrayformat.h"
9 #include "../lexeme_id.h"
10 #include "../reader.h"
11 #include "../utf8_transcoder.h"
12 #include "../unicode.h"
15 #include "../lexeme.h"
18 using namespace utakata;
20 bool lexer_test(smart_ptr<simpletest::SimpleTestAsserter> asserter)
23 ss << "==========" << endl;
24 ss << "(hoge 12 \"hoge\" )" << endl;
26 textarrayformat::TextArrayReader reader(ss);
27 smart_ptr<istream> formats(new stringstream(reader.get()));
28 smart_ptr<utakata::reader::StreamReader> st(
29 new utakata::reader::StreamReader(formats,
30 smart_ptr<transcoder::ITranscoder>(
31 new transcoder::UTF8Transcoder())));
33 utakata::lexer::Lexer lexer;
35 smart_ptr<lexeme::ILexeme> m(lexer.lex(st));
36 asserter->checkOnly((*m->toString())[0].getRawCode(), '(');
37 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::openParenthesis.toEnum(), "open paren");
40 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::identifier.toEnum(), "identifier");
43 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::number.toEnum(), "number");
46 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::string.toEnum(), "string");
49 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::closeParenthesis.toEnum(), "close");
51 // ここで終了しているはず。EOFの状態から実行されると、EOFのIDを持った
54 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::eos.toEnum(), "eos");
56 return asserter->isOk();
59 bool lexer_test2(smart_ptr<simpletest::SimpleTestAsserter> asserter)
62 ss << "==========" << endl;
63 ss << ",@(hoge 12 `(hoge) 'huga #f #t)" << endl;
66 textarrayformat::TextArrayReader reader(ss);
67 smart_ptr<istream> formats(new stringstream(reader.get()));
68 smart_ptr<utakata::reader::StreamReader> st(
69 new utakata::reader::StreamReader(formats,
70 smart_ptr<transcoder::ITranscoder>(
71 new transcoder::UTF8Transcoder())));
73 utakata::lexer::Lexer lexer;
75 smart_ptr<lexeme::ILexeme> m(lexer.lex(st));
76 asserter->checkOnly((*m->toString())[0].getRawCode(), ',');
79 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::openParenthesis.toEnum(), "open paren");
82 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::identifier.toEnum(), "identifier");
85 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::number.toEnum(), "number");
88 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::backquote.toEnum(), "back quote");
91 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::openParenthesis.toEnum(), "open paren2");
94 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::identifier.toEnum(), "identifier2");
97 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::closeParenthesis.toEnum(), "close");
100 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::quote.toEnum(), "quote");
103 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::identifier.toEnum(), "identifier2");
105 // booleanの解析が行えるかどうか。
107 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::boolean.toEnum(), "boolean:false");
109 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::boolean.toEnum(), "boolean:true");
112 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::closeParenthesis.toEnum(), "close");
114 // ここで終了しているはず。EOFの状態から実行されると、EOFのIDを持った
117 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::eos.toEnum(), "eos");
119 return asserter->isOk();
122 bool lexer_test3(smart_ptr<simpletest::SimpleTestAsserter> asserter)
124 std::stringstream ss;
125 ss << "==========" << endl;
126 ss << "#'(hoge #,12 #`(hoge) 'huga) ; comment" << endl;
127 ss << "hoge #vu8(12 12) #(vector)" << endl;
129 textarrayformat::TextArrayReader reader(ss);
130 smart_ptr<istream> formats(new stringstream(reader.get()));
131 smart_ptr<utakata::reader::StreamReader> st(
132 new utakata::reader::StreamReader(formats,
133 smart_ptr<transcoder::ITranscoder>(
134 new transcoder::UTF8Transcoder())));
135 utakata::lexer::Lexer lexer;
137 smart_ptr<lexeme::ILexeme> m(lexer.lex(st));
138 asserter->checkOnly((*m->toString())[0].getRawCode(), '#', "syntax");
141 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::openParenthesis.toEnum(), "open paren");
144 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::identifier.toEnum(), "identifier");
147 asserter->checkOnly((*m->toString())[1].getRawCode(), ',', "unsyntax");
148 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::unsyntax.toEnum(), "unsyntax");
151 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::number.toEnum(), "number");
154 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::quasiSyntax.toEnum(), "quasi syntax");
157 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::openParenthesis.toEnum(), "open paren2");
160 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::identifier.toEnum(), "identifier2");
163 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::closeParenthesis.toEnum(), "close");
166 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::quote.toEnum(), "quote");
169 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::identifier.toEnum(), "identifier2");
172 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::closeParenthesis.toEnum(), "close");
175 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::identifier.toEnum(), "identifier3");
178 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::byteVector.toEnum(), "byteVector");
180 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::number.toEnum(), "byteVector:number1");
182 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::number.toEnum(), "byteVector:number2");
184 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::closeParenthesis.toEnum(), "close");
187 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::vector.toEnum(), "vector");
189 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::identifier.toEnum(), "vector:identifier");
191 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::closeParenthesis.toEnum(), "close");
193 // ここで終了しているはず。EOFの状態から実行されると、EOFのIDを持った
196 asserter->checkOnly(m->getID().toEnum(), lexeme::LexemeID::eos.toEnum(), "eos");
198 return asserter->isOk();
202 int main(int argc, char *argv[])
204 simpletest::SimpleTestSuite suite("main lexer test");
205 suite.addTester(sfcr::screate(lexer_test, suite.getAsserter()));
206 suite.addTester(sfcr::screate(lexer_test2, suite.getAsserter()));
207 suite.addTester(sfcr::screate(lexer_test3, suite.getAsserter()));