4#include <gtest/gtest.h>
16class ParserTest :
public ::testing::Test {
21 std::vector<std::string> m_postlex;
23 Logger::FuncCallback *m_log_callback_save;
24 void *m_log_callback_arg_save;
27 static void LoggerCallback(
void *param,
Logger::LogLevelType level,
const char * str,
bool flush) {
28 ParserTest *p =
static_cast<ParserTest *
> (param);
29 fprintf(stdout,
"%s", str);
39 Logger::Instance()->SaveCallback(m_log_callback_save, m_log_callback_arg_save);
40 Logger::Instance()->SetCallback(&LoggerCallback,
this);
44 Logger::Instance()->SetCallback(m_log_callback_save, m_log_callback_arg_save);
49 ast = Parser::ParseString(str, buffer, &m_postlex, diag);
53 int Count(
TermID token_id) {
55 for (
int c = 0; c < ast->size(); c++) {
56 if ((*ast)[c].second->m_id == token_id) {
63 std::string LexOut() {
65 for (
int i = 0; i < m_postlex.size(); i++) {
78TEST_F(ParserTest, LiteralInteger) {
79 ASSERT_TRUE(Parse(
"100;"));
80 ASSERT_EQ(TermID::INTEGER, ast->getTermID()) <<
newlang::toString(ast->getTermID());
81 ASSERT_STREQ(
"100", ast->m_text.c_str());
84TEST_F(ParserTest, LiteralNumber) {
85 ASSERT_TRUE(Parse(
"100.222;"));
86 ASSERT_EQ(TermID::NUMBER, ast->getTermID()) <<
newlang::toString(ast->getTermID());
87 ASSERT_STREQ(
"100.222", ast->m_text.c_str());
89 ASSERT_TRUE(Parse(
"1.2E-20;"));
90 ASSERT_EQ(TermID::NUMBER, ast->getTermID()) <<
newlang::toString(ast->getTermID());
91 ASSERT_STREQ(
"1.2E-20", ast->m_text.c_str());
93 ASSERT_TRUE(Parse(
"1.2E+20;"));
94 ASSERT_EQ(TermID::NUMBER, ast->getTermID()) <<
newlang::toString(ast->getTermID());
95 ASSERT_STREQ(
"1.2E+20", ast->m_text.c_str());
97 ASSERT_TRUE(Parse(
"0.e-10;"));
98 ASSERT_EQ(TermID::NUMBER, ast->getTermID()) <<
newlang::toString(ast->getTermID());
99 ASSERT_STREQ(
"0.e-10", ast->m_text.c_str());
101 ASSERT_TRUE(Parse(
"0.e+10;"));
102 ASSERT_EQ(TermID::NUMBER, ast->getTermID()) <<
newlang::toString(ast->getTermID());
103 ASSERT_STREQ(
"0.e+10", ast->m_text.c_str());
106TEST_F(ParserTest, LiteralString) {
107 ASSERT_TRUE(Parse(
"\"\";"));
108 ASSERT_EQ(TermID::STRWIDE, ast->getTermID()) <<
newlang::toString(ast->getTermID());
109 ASSERT_STREQ(
"\"\"", ast->toString().c_str());
112TEST_F(ParserTest, LiteralString0) {
113 ASSERT_TRUE(Parse(
"\"\"(123);"));
114 ASSERT_TRUE(Parse(
"\"\"(123);"));
115 ASSERT_EQ(TermID::STRWIDE, ast->getTermID()) <<
newlang::toString(ast->getTermID());
116 ASSERT_STREQ(
"\"\"(123)", ast->toString().c_str());
119TEST_F(ParserTest, LiteralString1) {
120 ASSERT_TRUE(Parse(
"\"\";"));
121 ASSERT_EQ(TermID::STRWIDE, ast->getTermID()) <<
newlang::toString(ast->getTermID());
122 ASSERT_STREQ(
"\"\"", ast->toString().c_str());
125TEST_F(ParserTest, LiteralString3) {
126 ASSERT_TRUE(Parse(
"'';"));
127 ASSERT_EQ(TermID::STRCHAR, ast->getTermID()) <<
newlang::toString(ast->getTermID());
128 ASSERT_STREQ(
"''", ast->toString().c_str());
131TEST_F(ParserTest, LiteralString4) {
132 ASSERT_TRUE(Parse(
"'strbyte'(term(), 123);"));
133 ASSERT_EQ(TermID::STRCHAR, ast->getTermID()) <<
newlang::toString(ast->getTermID());
134 ASSERT_STREQ(
"'strbyte'(term(), 123)", ast->toString().c_str());
137TEST_F(ParserTest, LiteralEval1) {
138 ASSERT_TRUE(Parse(
"``"));
139 ASSERT_EQ(TermID::EVAL, ast->getTermID()) <<
newlang::toString(ast->getTermID());
140 ASSERT_STREQ(
"``", ast->toString().c_str());
143TEST_F(ParserTest, LiteralEval2) {
144 ASSERT_TRUE(Parse(
"`strbyte(term(), 123);`"));
145 ASSERT_EQ(TermID::EVAL, ast->getTermID()) <<
newlang::toString(ast->getTermID());
146 ASSERT_STREQ(
"`strbyte(term(), 123);`", ast->toString().c_str());
149TEST_F(ParserTest, LiteralRational) {
150 ASSERT_TRUE(Parse(
"1\\1;"));
151 ASSERT_EQ(TermID::RATIONAL, ast->getTermID()) <<
newlang::toString(ast->getTermID());
152 ASSERT_STREQ(
"1\\1", ast->toString().c_str());
155 ASSERT_ANY_THROW(Parse(
"1/1"));
156 ASSERT_ANY_THROW(Parse(
"rrr := 1/1"));
157 ASSERT_NO_THROW(Parse(
"rrr := 1\\1"));
158 ASSERT_ANY_THROW(Parse(
"rrr := 11111111111111111/1"));
159 ASSERT_NO_THROW(Parse(
"rrr := 11111111111111111\\1"));
161 ASSERT_TRUE(Parse(
"100\\100;"));
162 ASSERT_EQ(TermID::RATIONAL, ast->getTermID()) <<
newlang::toString(ast->getTermID());
163 ASSERT_STREQ(
"100\\100", ast->toString().c_str());
165 ASSERT_TRUE(Parse(
"123456789123456789123456789\\123456789123456789123456789;"));
166 ASSERT_EQ(TermID::RATIONAL, ast->getTermID()) <<
newlang::toString(ast->getTermID());
167 ASSERT_STREQ(
"123456789123456789123456789\\123456789123456789123456789", ast->toString().c_str());
170TEST_F(ParserTest, DISABLED_LiteralComplex) {
171 ASSERT_TRUE(Parse(
"1+0j;"));
172 ASSERT_EQ(TermID::COMPLEX, ast->getTermID()) <<
newlang::toString(ast->getTermID());
173 ASSERT_STREQ(
"1+0j", ast->toString().c_str());
175 ASSERT_TRUE(Parse(
"1+0.1j;"));
176 ASSERT_EQ(TermID::COMPLEX, ast->getTermID()) <<
newlang::toString(ast->getTermID());
177 ASSERT_STREQ(
"1+0.1j", ast->toString().c_str());
180TEST_F(ParserTest, TermSimple) {
181 ASSERT_TRUE(Parse(
"term();"));
182 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
183 ASSERT_TRUE(ast->isCall());
184 ASSERT_STREQ(
"term", ast->m_text.c_str());
188 ASSERT_TRUE(Parse(
"term.filed();"));
189 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
190 ASSERT_STREQ(
"term", ast->m_text.c_str());
191 ASSERT_TRUE(ast->m_name.empty());
194TEST_F(ParserTest, Tensor1) {
195 ASSERT_TRUE(Parse(
"[,]:Int8"));
196 ASSERT_EQ(TermID::TENSOR, ast->getTermID()) <<
newlang::toString(ast->getTermID());
197 ASSERT_STREQ(
"[,]:Int8", ast->toString().c_str());
199 ASSERT_TRUE(Parse(
"term[1];"));
200 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
201 ASSERT_STREQ(
"term", ast->m_text.c_str());
202 ASSERT_TRUE(ast->Right());
204 ASSERT_EQ(TermID::INDEX, ast->Right()->getTermID()) <<
newlang::toString(ast->getTermID());
205 ASSERT_EQ(1, ast->Right()->size());
206 ASSERT_STREQ(
"1", (*ast->Right())[0].second->getText().c_str());
208 ASSERT_TRUE(Parse(
"term[1..2];"));
209 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
210 ASSERT_STREQ(
"term[1..2]", ast->toString().c_str());
219TEST_F(ParserTest, Tensor2) {
220 ASSERT_TRUE(Parse(
"term[1, 2];"));
221 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
222 ASSERT_STREQ(
"term", ast->m_text.c_str());
223 ASSERT_TRUE(ast->Right());
225 ASSERT_EQ(TermID::INDEX, ast->Right()->getTermID()) <<
newlang::toString(ast->getTermID());
226 ASSERT_EQ(2, ast->Right()->size());
227 ASSERT_STREQ(
"1", (*ast->Right())[0].second->getText().c_str());
228 ASSERT_STREQ(
"2", (*ast->Right())[1].second->getText().c_str());
230 ASSERT_TRUE(Parse(
"term[1, 1..2, 3];"));
232 ASSERT_EQ(TermID::INDEX, ast->Right()->getTermID()) <<
newlang::toString(ast->getTermID());
233 ASSERT_EQ(3, ast->Right()->size());
234 ASSERT_STREQ(
"1", (*ast->Right())[0].second->getText().c_str());
235 ASSERT_STREQ(
"1..2", (*ast->Right())[1].second->toString().c_str());
236 ASSERT_STREQ(
"3", (*ast->Right())[2].second->getText().c_str());
239TEST_F(ParserTest, Tensor3) {
240 ASSERT_TRUE(Parse(
"term := [1,2,];"));
242 ASSERT_TRUE(Parse(
"term[1, 3] := 0;"));
244 ASSERT_TRUE(Parse(
"term[1, 3] := [ [1,2,3,],];"));
264TEST_F(ParserTest, Tensor4) {
265 ASSERT_TRUE(Parse(
":Type( 1 );"));
266 ASSERT_STREQ(
":Type(1)", ast->toString().c_str());
268 ASSERT_TRUE(Parse(
":Type( [1,2,] )"));
269 ASSERT_STREQ(
":Type([1, 2,])", ast->toString().c_str());
271 ASSERT_TRUE(Parse(
":Type( 1, 2 )"));
272 ASSERT_STREQ(
":Type(1, 2)", ast->toString().c_str());
274 ASSERT_TRUE(Parse(
":Type( name=1 , name2=2 )"));
275 ASSERT_STREQ(
":Type(name=1, name2=2)", ast->toString().c_str());
277 ASSERT_TRUE(Parse(
":Type( \"str\" )"));
278 ASSERT_STREQ(
":Type(\"str\")", ast->toString().c_str());
280 ASSERT_TRUE(Parse(
":Int32[3]( \"str\" ) "));
281 ASSERT_STREQ(
":Int32[3](\"str\")", ast->toString().c_str());
283 ASSERT_TRUE(Parse(
":Int32[2,2](1,2,3,4);"));
284 ASSERT_STREQ(
":Int32[2,2](1, 2, 3, 4)", ast->toString().c_str());
286 ASSERT_TRUE(Parse(
":Int32[2,2]( 0, ... )"));
287 ASSERT_STREQ(
":Int32[2,2](0, ...)", ast->toString().c_str());
289 ASSERT_TRUE(Parse(
":Int32( ... ... dict )"));
290 ASSERT_STREQ(
":Int32(... ...dict)", ast->toString().c_str());
292 ASSERT_TRUE(Parse(
":Int32( ... dict )"));
293 ASSERT_STREQ(
":Int32(...dict)", ast->toString().c_str());
295 ASSERT_TRUE(Parse(
":Int32[2,2]( ... rand() ... )"));
296 ASSERT_STREQ(
":Int32[2,2](...rand()...)", ast->toString().c_str());
298 ASSERT_TRUE(Parse(
":type[10]( 1, 2, ... rand() ... )"));
299 ASSERT_STREQ(
":type[10](1, 2, ...rand()...)", ast->toString().c_str());
301 ASSERT_TRUE(Parse(
":range( 0..100 )"));
302 ASSERT_STREQ(
":range(0..100)", ast->toString().c_str());
304 ASSERT_TRUE(Parse(
"range( 0 .. 100 .. 0.1 )"));
305 ASSERT_STREQ(
"range(0..100..0.1)", ast->toString().c_str());
318TEST_F(ParserTest, ScalarType) {
324 ASSERT_TRUE(Parse(
"0;"));
325 ASSERT_TRUE(ast->m_type);
327 ASSERT_STREQ(
"0", ast->toString().c_str());
328 ASSERT_STREQ(
":Bool", ast->m_type->m_text.c_str());
330 ASSERT_TRUE(Parse(
"1;"));
331 ASSERT_TRUE(ast->m_type);
333 ASSERT_STREQ(
"1", ast->toString().c_str());
334 ASSERT_STREQ(
":Bool", ast->m_type->m_text.c_str());
336 ASSERT_TRUE(Parse(
"2;"));
337 ASSERT_STREQ(
"2", ast->toString().c_str());
338 ASSERT_TRUE(ast->m_type);
340 ASSERT_STREQ(
":Int8", ast->m_type->m_text.c_str());
342 ASSERT_TRUE(Parse(
"2_2;"));
343 ASSERT_STREQ(
"2_2", ast->toString().c_str());
344 ASSERT_TRUE(ast->m_type);
346 ASSERT_STREQ(
":Int8", ast->m_type->m_text.c_str());
348 ASSERT_TRUE(Parse(
"-1;"));
349 ASSERT_STREQ(
"-1", ast->toString().c_str());
350 ASSERT_TRUE(ast->m_type);
352 ASSERT_STREQ(
":Int8", ast->m_type->m_text.c_str());
354 ASSERT_TRUE(Parse(
"256;"));
355 ASSERT_STREQ(
"256", ast->toString().c_str());
356 ASSERT_TRUE(ast->m_type);
358 ASSERT_STREQ(
":Int16", ast->m_type->m_text.c_str());
360 ASSERT_TRUE(Parse(
"10_000;"));
361 ASSERT_STREQ(
"10_000", ast->toString().c_str());
362 ASSERT_TRUE(ast->m_type);
364 ASSERT_STREQ(
":Int16", ast->m_type->m_text.c_str());
366 ASSERT_TRUE(Parse(
"100_000;"));
367 ASSERT_STREQ(
"100_000", ast->toString().c_str());
368 ASSERT_TRUE(ast->m_type);
370 ASSERT_STREQ(
":Int32", ast->m_type->m_text.c_str());
372 ASSERT_TRUE(Parse(
"0.0;"));
373 ASSERT_STREQ(
"0.0", ast->toString().c_str());
374 ASSERT_TRUE(ast->m_type);
376 ASSERT_STREQ(
":Float64", ast->m_type->m_text.c_str());
380 ASSERT_TRUE(Parse(
"0:Bool;"));
381 ASSERT_STREQ(
"0:Bool", ast->toString().c_str());
382 ASSERT_TRUE(ast->m_type);
384 ASSERT_STREQ(
":Bool", ast->m_type->m_text.c_str());
386 ASSERT_TRUE(Parse(
"0:Int32;"));
387 ASSERT_STREQ(
"0:Int32", ast->toString().c_str());
388 ASSERT_TRUE(ast->m_type);
390 ASSERT_STREQ(
":Int32", ast->m_type->m_text.c_str());
392 ASSERT_TRUE(Parse(
"0:Int64;"));
393 ASSERT_STREQ(
"0:Int64", ast->toString().c_str());
394 ASSERT_TRUE(ast->m_type);
396 ASSERT_STREQ(
":Int64", ast->m_type->m_text.c_str());
398 ASSERT_TRUE(Parse(
"0:Float32;"));
399 ASSERT_STREQ(
"0:Float32", ast->toString().c_str());
400 ASSERT_TRUE(ast->m_type);
402 ASSERT_STREQ(
":Float32", ast->m_type->m_text.c_str());
408 ASSERT_TRUE(Parse(
"0:Float64;"));
409 ASSERT_STREQ(
"0:Float64", ast->toString().c_str());
410 ASSERT_TRUE(ast->m_type);
412 ASSERT_STREQ(
":Float64", ast->m_type->m_text.c_str());
415 ASSERT_TRUE(Parse(
"1:Bool;"));
416 ASSERT_STREQ(
"1:Bool", ast->toString().c_str());
417 ASSERT_TRUE(ast->m_type);
419 ASSERT_STREQ(
":Bool", ast->m_type->m_text.c_str());
421 ASSERT_TRUE(Parse(
"1:Int8;"));
422 ASSERT_STREQ(
"1:Int8", ast->toString().c_str());
423 ASSERT_TRUE(ast->m_type);
425 ASSERT_STREQ(
":Int8", ast->m_type->m_text.c_str());
427 ASSERT_TRUE(Parse(
"1:Int8;"));
428 ASSERT_STREQ(
"1:Int8", ast->toString().c_str());
429 ASSERT_TRUE(ast->m_type);
431 ASSERT_STREQ(
":Int8", ast->m_type->m_text.c_str());
433 ASSERT_TRUE(Parse(
"1:Float64;"));
434 ASSERT_STREQ(
"1:Float64", ast->toString().c_str());
435 ASSERT_TRUE(ast->m_type);
437 ASSERT_STREQ(
":Float64", ast->m_type->m_text.c_str());
439 ASSERT_TRUE(Parse(
"2:Int16;"));
440 ASSERT_STREQ(
"2:Int16", ast->toString().c_str());
441 ASSERT_TRUE(ast->m_type);
443 ASSERT_STREQ(
":Int16", ast->m_type->m_text.c_str());
445 ASSERT_TRUE(Parse(
"2_2:Int32;"));
446 ASSERT_STREQ(
"2_2:Int32", ast->toString().c_str());
447 ASSERT_TRUE(ast->m_type);
449 ASSERT_STREQ(
":Int32", ast->m_type->m_text.c_str());
451 ASSERT_TRUE(Parse(
"-1:Int8;"));
452 ASSERT_STREQ(
"-1:Int8", ast->toString().c_str());
453 ASSERT_TRUE(ast->m_type);
455 ASSERT_STREQ(
":Int8", ast->m_type->m_text.c_str());
457 ASSERT_TRUE(Parse(
"-1 :Int64;"));
458 ASSERT_STREQ(
"-1:Int64", ast->toString().c_str());
459 ASSERT_TRUE(ast->m_type);
461 ASSERT_STREQ(
":Int64", ast->m_type->m_text.c_str());
463 ASSERT_TRUE(Parse(
"256 :Int16;"));
464 ASSERT_STREQ(
"256:Int16", ast->toString().c_str());
465 ASSERT_TRUE(ast->m_type);
467 ASSERT_STREQ(
":Int16", ast->m_type->m_text.c_str());
469 ASSERT_TRUE(Parse(
"10_000 :Int64;"));
470 ASSERT_STREQ(
"10_000:Int64", ast->toString().c_str());
471 ASSERT_TRUE(ast->m_type);
473 ASSERT_STREQ(
":Int64", ast->m_type->m_text.c_str());
477 ASSERT_TRUE(Parse(
"100_000: Int32;"));
478 ASSERT_STREQ(
"100_000:Int32", ast->toString().c_str());
479 ASSERT_TRUE(ast->m_type);
481 ASSERT_STREQ(
":Int32", ast->m_type->m_text.c_str());
483 ASSERT_TRUE(Parse(
"-100_000: Int32;"));
484 ASSERT_STREQ(
"-100_000:Int32", ast->toString().c_str());
485 ASSERT_TRUE(ast->m_type);
487 ASSERT_STREQ(
":Int32", ast->m_type->m_text.c_str());
489 ASSERT_TRUE(Parse(
"1.0 : Float32;"));
490 ASSERT_STREQ(
"1.0:Float32", ast->toString().c_str());
491 ASSERT_TRUE(ast->m_type);
493 ASSERT_STREQ(
":Float32", ast->m_type->m_text.c_str());
496 ASSERT_TRUE(Parse(
"-0.0 :Float64;"));
497 ASSERT_STREQ(
"-0.0:Float64", ast->toString().c_str());
498 ASSERT_TRUE(ast->m_type);
500 ASSERT_STREQ(
":Float64", ast->m_type->m_text.c_str());
502 ASSERT_ANY_THROW(Parse(
"2:Bool;"));
503 ASSERT_ANY_THROW(Parse(
"-1:Bool;"));
504 ASSERT_ANY_THROW(Parse(
"300:Int8;"));
505 ASSERT_ANY_THROW(Parse(
"100000:Int16;"));
506 ASSERT_ANY_THROW(Parse(
"0.0:Bool;"));
507 ASSERT_ANY_THROW(Parse(
"0.0:Int8;"));
508 ASSERT_ANY_THROW(Parse(
"0.0:Int32;"));
509 ASSERT_ANY_THROW(Parse(
"0.0:Int64;"));
512TEST_F(ParserTest, TensorType) {
513 ASSERT_TRUE(Parse(
"term:Int8[1,2] := [ [1,2,],[3,4,],];"));
514 ASSERT_STREQ(
"term:Int8[1,2] := [[1, 2,], [3, 4,],];", ast->toString().c_str());
516 ASSERT_TRUE(Parse(
"term[..., 3] := 0;"));
517 ASSERT_STREQ(
"term[..., 3] := 0;", ast->toString().c_str());
519 ASSERT_TRUE(Parse(
"term []= [2, 3,]:Int32;"));
520 ASSERT_STREQ(
"term []= [2, 3,]:Int32;", ast->toString().c_str());
522 ASSERT_TRUE(Parse(
":Bool();"));
523 ASSERT_TRUE(Parse(
":Bool[...]();"));
524 ASSERT_TRUE(Parse(
":Bool[1]();"));
526 ASSERT_TRUE(Parse(
":Bool[_]();"));
527 ASSERT_TRUE(Parse(
"1.._..2"));
528 ASSERT_TRUE(Parse(
"1.._"));
529 ASSERT_TRUE(Parse(
":Bool[1.._..2]();"));
530 ASSERT_TRUE(Parse(
":Bool[1.._]();"));
553TEST_F(ParserTest, DictType) {
554 ASSERT_TRUE(Parse(
"(1,2,)"));
555 ASSERT_STREQ(
"(1, 2,)", ast->toString().c_str());
557 ASSERT_TRUE(Parse(
"(1, arg=2,)"));
558 ASSERT_STREQ(
"(1, arg=2,)", ast->toString().c_str());
560 ASSERT_TRUE(Parse(
"(1, arg=2, '',)"));
561 ASSERT_STREQ(
"(1, arg=2, '',)", ast->toString().c_str());
563 ASSERT_TRUE(Parse(
"(1, .arg=2,)"));
564 ASSERT_STREQ(
"(1, arg=2,)", ast->toString().c_str());
566 ASSERT_TRUE(Parse(
"(1, arg=2, '',)"));
567 ASSERT_STREQ(
"(1, arg=2, '',)", ast->toString().c_str());
571 ASSERT_TRUE(Parse(
"(1, arg=2, '',):Class"));
572 ASSERT_STREQ(
"(1, arg=2, '',):Class", ast->toString().c_str());
575TEST_F(ParserTest, TermNoArg) {
576 ASSERT_TRUE(Parse(
"term();"));
577 ASSERT_TRUE(ast->isCall());
578 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
579 ASSERT_STREQ(
"term", ast->m_text.c_str());
581 ASSERT_TRUE(Parse(
"term();"));
582 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
583 ASSERT_STREQ(
"term", ast->m_text.c_str());
586TEST_F(ParserTest, TermFullName2) {
587 ASSERT_TRUE(Parse(
"term::name::name2;"));
588 ASSERT_STREQ(
"term::name::name2", ast->toString().c_str());
591TEST_F(ParserTest, TermFullName3) {
592 ASSERT_TRUE(Parse(
"term::name::name2();"));
593 ASSERT_STREQ(
"term::name::name2()", ast->toString().c_str());
596TEST_F(ParserTest, TermFullName4) {
597 ASSERT_TRUE(Parse(
"term::name::name2();"));
598 ASSERT_STREQ(
"term::name::name2()", ast->toString().c_str());
601TEST_F(ParserTest, TermFullName5) {
602 ASSERT_TRUE(Parse(
"::term::name::name2;"));
603 ASSERT_STREQ(
"::term::name::name2", ast->toString().c_str());
606TEST_F(ParserTest, TermFullName6) {
607 ASSERT_TRUE(Parse(
"::term::name::name2();"));
608 ASSERT_STREQ(
"::term::name::name2()", ast->toString().c_str());
611TEST_F(ParserTest, TermFullName7) {
612 ASSERT_TRUE(Parse(
"::term::name::name2();"));
613 ASSERT_STREQ(
"::term::name::name2()", ast->toString().c_str());
616TEST_F(ParserTest, TermFullName8) {
617 ASSERT_TRUE(Parse(
"::name2(arg);"));
618 ASSERT_STREQ(
"::name2(arg)", ast->toString().c_str());
621TEST_F(ParserTest, TermFullName9) {
622 ASSERT_TRUE(Parse(
"name::name2(arg);"));
623 ASSERT_STREQ(
"name::name2(arg)", ast->toString().c_str());
626TEST_F(ParserTest, FuncNoArg) {
627 ASSERT_TRUE(Parse(
"@term();"));
628 ASSERT_EQ(TermID::MACRO, ast->getTermID()) <<
newlang::toString(ast->getTermID());
629 ASSERT_STREQ(
"@term", ast->m_text.c_str());
632TEST_F(ParserTest, TermNoArgSpace) {
633 ASSERT_TRUE(Parse(
"term( );"));
634 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
635 ASSERT_STREQ(
"term", ast->m_text.c_str());
636 ASSERT_EQ(0, ast->size());
639TEST_F(ParserTest, TermArgTerm) {
640 ASSERT_TRUE(Parse(
"term(arg);"));
641 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
642 ASSERT_STREQ(
"term", ast->m_text.c_str());
643 ASSERT_EQ(1, ast->size());
644 ASSERT_STREQ(
"arg", (*ast)[0].second->m_text.c_str());
645 ASSERT_FALSE((*ast)[0].second->m_ref);
648 ASSERT_TRUE(Parse(
"term(name=value);"));
649 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
650 ASSERT_STREQ(
"term", ast->m_text.c_str());
652 ASSERT_EQ(1, ast->size());
653 ASSERT_STREQ(
"name", (*ast)[0].second->getName().c_str());
654 ASSERT_STREQ(
"value", (*ast)[0].second->getText().c_str());
655 ASSERT_FALSE((*ast)[0].second->m_ref);
658TEST_F(ParserTest, TermArgTermRef) {
659 ASSERT_TRUE(Parse(
"term(&arg);"));
660 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
661 ASSERT_STREQ(
"term", ast->m_text.c_str());
662 ASSERT_EQ(1, ast->size());
663 ASSERT_STREQ(
"arg", (*ast)[0].second->m_text.c_str());
664 ASSERT_TRUE((*ast)[0].second->m_ref);
667 ASSERT_TRUE(Parse(
"term(name=&value);"));
668 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
669 ASSERT_STREQ(
"term", ast->m_text.c_str());
671 ASSERT_EQ(1, ast->size());
672 ASSERT_STREQ(
"name", (*ast)[0].second->getName().c_str());
673 ASSERT_STREQ(
"value", (*ast)[0].second->getText().c_str());
674 ASSERT_TRUE((*ast)[0].second->m_ref);
677 ASSERT_TRUE(Parse(
"term(name=&?value);"));
678 ASSERT_TRUE(Parse(
"term(name=&&value);"));
679 ASSERT_TRUE(Parse(
"term(name=&*value);"));
680 ASSERT_TRUE(Parse(
"term(&?name=value);"));
681 ASSERT_TRUE(Parse(
"term(&&name=value);"));
682 ASSERT_TRUE(Parse(
"term(&*name=value);"));
686TEST_F(ParserTest, Misc) {
688 ASSERT_NO_THROW(Parse(
"func(arg:Int32) := { };"));
689 ASSERT_NO_THROW(Parse(
"func(arg:~Int32) := { };"));
690 ASSERT_NO_THROW(Parse(
"func(arg:~~Int32) := { };"));
691 ASSERT_NO_THROW(Parse(
"func(arg:~~~Int32) := { };"));
693 ASSERT_NO_THROW(Parse(
"func( & arg:Int32 ) := { };"));
694 ASSERT_NO_THROW(Parse(
"func( &? arg:Int32 ) := { };"));
695 ASSERT_NO_THROW(Parse(
"func( &* arg:Int32 ) := { };"));
696 ASSERT_NO_THROW(Parse(
"func( && arg:Int32 ) := { };"));
698 ASSERT_ANY_THROW(Parse(
"func( & arg:Int32 = 0 ) := { };"));
699 ASSERT_ANY_THROW(Parse(
"func( &? arg:Int32 = 0 ) := { };"));
700 ASSERT_ANY_THROW(Parse(
"func( &* arg:Int32 = 0 ) := { };"));
701 ASSERT_ANY_THROW(Parse(
"func( && arg:Int32 = 0 ) := { };"));
703 ASSERT_NO_THROW(Parse(
"func( & arg:Int32 = term ) := { };"));
704 ASSERT_NO_THROW(Parse(
"func( &? arg:Int32 = term ) := { };"));
705 ASSERT_NO_THROW(Parse(
"func( &* arg:Int32 = term ) := { };"));
706 ASSERT_NO_THROW(Parse(
"func( && arg:Int32 = term ) := { };"));
708 ASSERT_NO_THROW(Parse(
"func( & arg ) := { };"));
709 ASSERT_NO_THROW(Parse(
"func( &? arg ) := { };"));
710 ASSERT_NO_THROW(Parse(
"func( &* arg ) := { };"));
711 ASSERT_NO_THROW(Parse(
"func( && arg ) := { };"));
713 ASSERT_NO_THROW(Parse(
"func( & arg = func() ) := { };"));
714 ASSERT_NO_THROW(Parse(
"func( &? arg = func() ) := { };"));
715 ASSERT_NO_THROW(Parse(
"func( &* arg = func() ) := { };"));
716 ASSERT_NO_THROW(Parse(
"func( && arg = func() ) := { };"));
718 ASSERT_ANY_THROW(Parse(
"func( & arg = 0 ) := { };"));
719 ASSERT_ANY_THROW(Parse(
"func( &? arg = 0 ) := { };"));
720 ASSERT_ANY_THROW(Parse(
"func( &* arg = 0 ) := { };"));
721 ASSERT_ANY_THROW(Parse(
"func( && arg = 0 ) := { };"));
723 ASSERT_NO_THROW(Parse(
"func( & arg = term(0) ) := { };"));
724 ASSERT_NO_THROW(Parse(
"func( &? arg = term(0) ) := { };"));
725 ASSERT_NO_THROW(Parse(
"func( &* arg = term(0) ) := { };"));
726 ASSERT_NO_THROW(Parse(
"func( && arg = term(0) ) := { };"));
728 ASSERT_ANY_THROW(Parse(
"func( & arg:Int32 = 0 ) := { };"));
729 ASSERT_ANY_THROW(Parse(
"func( &? arg:~Int32 = 0 ) := { };"));
730 ASSERT_ANY_THROW(Parse(
"func( &* arg:~~Int32 = 0 ) := { };"));
731 ASSERT_ANY_THROW(Parse(
"func( && arg:~~~Int32 = 0 ) := { };"));
733 ASSERT_NO_THROW(Parse(
"func( & arg:Int32 = val ) := { };"));
734 ASSERT_NO_THROW(Parse(
"func( &? arg:~Int32 = val ) := { };"));
735 ASSERT_NO_THROW(Parse(
"func( &* arg:~~Int32 = val ) := { };"));
736 ASSERT_NO_THROW(Parse(
"func( && arg:~~~Int32 = val ) := { };"));
738 ASSERT_NO_THROW(Parse(
"func( & arg:Int32 = term(0) ) := { };"));
739 ASSERT_NO_THROW(Parse(
"func( &? arg:~Int32 = term(0) ) := { };"));
740 ASSERT_NO_THROW(Parse(
"func( &* arg:~~Int32 = term(0) ) := { };"));
741 ASSERT_NO_THROW(Parse(
"func( && arg:~~~Int32 = term(0) ) := { };"));
743 ASSERT_NO_THROW(Parse(
"func( arg = & val );"));
744 ASSERT_NO_THROW(Parse(
"func( arg = &? val );"));
745 ASSERT_NO_THROW(Parse(
"func( arg = &* val );"));
746 ASSERT_NO_THROW(Parse(
"func( arg = && val );"));
748 ASSERT_NO_THROW(Parse(
":RefInt32 := & :Int32;"));
749 ASSERT_NO_THROW(Parse(
":RefInt32 := &? :Int32;"));
750 ASSERT_NO_THROW(Parse(
":RefInt32 := &* :Int32;"));
751 ASSERT_NO_THROW(Parse(
":RefInt32 := && :Int32;"));
753 ASSERT_NO_THROW(Parse(
"var:Int32 := 0;"));
754 ASSERT_NO_THROW(Parse(
"& var:Int32 := 0;"));
755 ASSERT_NO_THROW(Parse(
"&? var:Int32 := 0;"));
756 ASSERT_NO_THROW(Parse(
"&& var:Int32 := 0;"));
757 ASSERT_NO_THROW(Parse(
"&* var:Int32 := 0;"));
759 ASSERT_NO_THROW(Parse(
"var:Int32 := 0;"));
760 ASSERT_NO_THROW(Parse(
"&(var, __timeout__=1000) var:Int32 := 0;"));
761 ASSERT_NO_THROW(Parse(
"&?(var, __timeout__=1000) var:Int32 := 0;"));
762 ASSERT_NO_THROW(Parse(
"&&(var, __timeout__=1000) var:Int32 := 0;"));
763 ASSERT_NO_THROW(Parse(
"&*(var, __timeout__=1000) var:Int32 := 0;"));
766TEST_F(ParserTest, TermArgTermSpace) {
767 ASSERT_TRUE(Parse(
" \n \t term( \n arg \n ) ; \n "));
768 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
769 ASSERT_STREQ(
"term", ast->m_text.c_str());
770 ASSERT_EQ(1, ast->size());
771 ASSERT_STREQ(
"arg", (*ast)[0].second->m_text.c_str());
774TEST_F(ParserTest, TermArgs1) {
775 ASSERT_TRUE(Parse(
"term(arg1);"));
776 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
777 ASSERT_STREQ(
"term", ast->m_text.c_str());
778 ASSERT_EQ(1, ast->size());
779 ASSERT_STREQ(
"arg1", (*ast)[0].second->m_text.c_str());
782TEST_F(ParserTest, TermArgs2) {
783 ASSERT_TRUE(Parse(
"term(arg1,arg2);"));
784 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
785 ASSERT_STREQ(
"term", ast->m_text.c_str());
786 ASSERT_EQ(2, ast->size());
787 ASSERT_STREQ(
"arg1", (*ast)[0].second->getText().c_str());
788 ASSERT_STREQ(
"arg2", (*ast)[1].second->getText().c_str());
789 ASSERT_FALSE((*ast)[0].second->m_ref);
790 ASSERT_FALSE((*ast)[1].second->m_ref);
793TEST_F(ParserTest, TermArgsRef) {
794 ASSERT_TRUE(Parse(
"term(*arg1, *^arg2);"));
795 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
796 ASSERT_STREQ(
"term", ast->m_text.c_str());
797 ASSERT_EQ(2, ast->size());
803 ASSERT_TRUE(Parse(
"term(. name1=*arg1, . name2=*^arg2);"));
804 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
806 ASSERT_TRUE(Parse(
"term(name1=*arg1, name2=*^arg2);"));
807 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
817 ASSERT_TRUE(Parse(
"term(*(arg1), *^(arg2));"));
818 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
826 ASSERT_TRUE(Parse(
"term(name1=*(arg1), name2=*^(arg2));"));
827 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
828 ASSERT_STREQ(
"term", ast->m_text.c_str());
829 ASSERT_EQ(2, ast->size());
839 ASSERT_TRUE(Parse(
"term(&arg1, &&arg2, &*arg3);"));
840 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
841 ASSERT_STREQ(
"term", ast->m_text.c_str());
842 ASSERT_EQ(3, ast->size());
850 ASSERT_TRUE(Parse(
"term(name1=&arg1, name2=&&arg2, name3=&*arg3);"));
851 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
852 ASSERT_STREQ(
"term", ast->m_text.c_str());
853 ASSERT_EQ(3, ast->size());
864 ASSERT_TRUE(Parse(
"term(&^arg1, &&^arg2, &*^arg3);"));
865 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
866 ASSERT_STREQ(
"term", ast->m_text.c_str());
867 ASSERT_EQ(3, ast->size());
875 ASSERT_TRUE(Parse(
"term(name1=&^arg1, name2=&&^arg2, name3=&*^arg3);"));
876 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
877 ASSERT_STREQ(
"term", ast->m_text.c_str());
878 ASSERT_EQ(3, ast->size());
891TEST_F(ParserTest, TermArgMixed) {
892 ASSERT_TRUE(Parse(
"term(\narg1,\n arg2\n = \narg3 \n);"));
893 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
894 ASSERT_STREQ(
"term", ast->m_text.c_str());
896 ASSERT_EQ(2, ast->size());
897 ASSERT_STREQ(
"arg1", (*ast)[0].second->getText().c_str());
898 ASSERT_STREQ(
"arg2", (*ast)[1].second->getName().c_str());
899 ASSERT_STREQ(
"arg3", (*ast)[1].second->getText().c_str());
902TEST_F(ParserTest, ArgsType) {
903 ASSERT_TRUE(Parse(
"term(bool:Bool=term(100), int:Int32=100, long:Int64=@term()):Float64:={long;};"));
904 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
905 ASSERT_STREQ(
"term(bool:Bool=term(100), int:Int32=100, long:Int64=@term()):Float64 := {long;};", ast->toString().c_str());
907 ASSERT_TRUE(Parse(
"term(&bool:~Bool=term(100), &* int:~Int32=name::name, &? long:~~Int64=@term()):~~~Float64:={long;};"));
908 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
912TEST_F(ParserTest, ArgsType1) {
913 ASSERT_TRUE(Parse(
"term(long:Int64=@term());"));
914 ASSERT_STREQ(
"term(long:Int64=@term())", ast->toString().c_str());
917TEST_F(ParserTest, Any) {
918 ASSERT_TRUE(Parse(
"term((,));"));
919 ASSERT_TRUE(Parse(
"term([1,]);"));
920 ASSERT_TRUE(Parse(
"term((,):Class);"));
921 ASSERT_TRUE(Parse(
"term([1,]:Int8);"));
922 ASSERT_TRUE(Parse(
"term(1..2);"));
923 ASSERT_TRUE(Parse(
"term(1..2..1\\1);"));
925 ASSERT_TRUE(Parse(
"term(name=(,));"));
926 ASSERT_TRUE(Parse(
"term(name=[1,]);"));
927 ASSERT_TRUE(Parse(
"term(name=(,):Class);"));
928 ASSERT_TRUE(Parse(
"term(name=[1,]:Int8);"));
929 ASSERT_TRUE(Parse(
"term(name=1..2);"));
930 ASSERT_TRUE(Parse(
"term(name=1..2..1\\1);"));
932 ASSERT_TRUE(Parse(
"term(1, name=(,));"));
933 ASSERT_TRUE(Parse(
"term(1, name=[1,]);"));
934 ASSERT_TRUE(Parse(
"term(1, name=(,):Class);"));
935 ASSERT_TRUE(Parse(
"term(1, name=[1,]:Int8);"));
936 ASSERT_TRUE(Parse(
"term(1, name=1..2);"));
937 ASSERT_TRUE(Parse(
"term(1, name=1..2..1\\1);"));
941TEST_F(ParserTest, TermCall) {
942 ASSERT_TRUE(Parse(
"var2 := min(200, var, 400);"));
943 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
944 ASSERT_STREQ(
":=", ast->m_text.c_str());
949 ASSERT_EQ(3, right->size());
950 ASSERT_STREQ(
"200", (*right)[0].second->getText().c_str());
951 ASSERT_FALSE((*right)[0].second->m_left);
952 ASSERT_FALSE((*right)[0].second->m_right);
953 ASSERT_STREQ(
"var", (*right)[1].second->getText().c_str());
954 ASSERT_FALSE((*right)[1].second->m_left);
955 ASSERT_FALSE((*right)[1].second->m_right);
956 ASSERT_STREQ(
"400", (*right)[2].second->getText().c_str());
957 ASSERT_FALSE((*right)[2].second->m_left);
958 ASSERT_FALSE((*right)[2].second->m_right);
961TEST_F(ParserTest, TermCollection) {
962 ASSERT_TRUE(Parse(
"term([2,], [arg1,arg2,]);"));
963 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
964 ASSERT_STREQ(
"term", ast->m_text.c_str());
965 ASSERT_EQ(2, ast->size());
966 ASSERT_EQ(TermID::TENSOR, (*ast)[0].second->getTermID()) <<
newlang::toString(ast->getTermID());
967 ASSERT_EQ(TermID::TENSOR, (*ast)[1].second->getTermID()) <<
newlang::toString(ast->getTermID());
970TEST_F(ParserTest, TermCollection2) {
971 ASSERT_TRUE(Parse(
"term((,), name=[arg1,arg2,]);"));
972 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
973 ASSERT_STREQ(
"term", ast->m_text.c_str());
974 ASSERT_EQ(2, ast->size());
975 ASSERT_EQ(TermID::DICT, (*ast)[0].second->getTermID()) <<
newlang::toString((*ast)[0].second->getTermID());
976 ASSERT_EQ(TermID::TENSOR, (*ast)[1].second->getTermID()) <<
newlang::toString((*ast)[1].second->getTermID());
979TEST_F(ParserTest, OpsCall) {
980 ASSERT_TRUE(Parse(
"call(1+1)"));
981 ASSERT_TRUE(Parse(
"call(1-1)"));
982 ASSERT_TRUE(Parse(
"call(1\\1-1)"));
983 ASSERT_TRUE(Parse(
"call(term+1)"));
984 ASSERT_TRUE(Parse(
"call(term-1)"));
985 ASSERT_TRUE(Parse(
"call(term+term)"));
986 ASSERT_TRUE(Parse(
"call(term-term)"));
987 ASSERT_TRUE(Parse(
"call(term-term,term*2)"));
990TEST_F(ParserTest, ArgMixedFail) {
994 EXPECT_ANY_THROW(Parse(
"term(arg1,arg2=arg3,,);"));
995 EXPECT_ANY_THROW(Parse(
"term(,);"));
1000 ASSERT_TRUE(Parse(
"term!!;"));
1001 ASSERT_STREQ(
"!!", ast->m_text.c_str());
1005 ASSERT_STREQ(
"term", arg->getText().c_str());
1007 ASSERT_TRUE(Parse(
"term(arg)!!;"));
1008 ASSERT_STREQ(
"!!", ast->getText().c_str());
1012 ASSERT_STREQ(
"term", arg->getText().c_str());
1013 ASSERT_EQ(1, arg->size());
1014 ASSERT_STREQ(
"arg", (*arg)[0].second->getText().c_str());
1048 EXPECT_ANY_THROW(Parse(
"term2(arg=value)!;?"));
1051 ASSERT_TRUE(Parse(
"term2(arg=value?);"));
1052 ASSERT_EQ(1, ast->size());
1053 ASSERT_STREQ(
"term2", ast->getText().c_str());
1054 ASSERT_EQ(1, ast->size());
1055 ASSERT_STREQ(
"arg", ast->name(0).c_str());
1056 ASSERT_STREQ(
"?", (*ast)[0].second->getText().c_str());
1057 ASSERT_TRUE((*ast)[0].second->Left());
1058 ASSERT_STREQ(
"value", (*ast)[0].second->Left()->getText().c_str());
1077TEST_F(ParserTest, MathPlus) {
1078 ASSERT_TRUE(Parse(
"test := 123+456;"));
1079 ASSERT_STREQ(
":=", ast->m_text.c_str());
1080 ASSERT_TRUE(ast->Left());
1081 ASSERT_TRUE(ast->Right());
1082 ASSERT_STREQ(
"test", ast->Left()->m_text.c_str());
1085 ASSERT_STREQ(
"+", op->m_text.c_str());
1086 ASSERT_TRUE(op->Right());
1087 ASSERT_TRUE(op->Left());
1088 ASSERT_STREQ(
"123", op->Left()->m_text.c_str());
1089 ASSERT_STREQ(
"456", op->Right()->m_text.c_str());
1092TEST_F(ParserTest, MathMinus) {
1093 ASSERT_TRUE(Parse(
"test := 123-456;"));
1094 ASSERT_STREQ(
":=", ast->m_text.c_str());
1095 ASSERT_TRUE(ast->Left());
1096 ASSERT_TRUE(ast->Right());
1097 ASSERT_STREQ(
"test", ast->Left()->m_text.c_str());
1100 ASSERT_STREQ(
"-", op->m_text.c_str());
1101 ASSERT_TRUE(op->Right());
1102 ASSERT_TRUE(op->Left());
1103 ASSERT_STREQ(
"123", op->Left()->m_text.c_str());
1104 ASSERT_STREQ(
"456", op->Right()->m_text.c_str());
1107TEST_F(ParserTest, MathMul) {
1108 ASSERT_TRUE(Parse(
"test := 123*456;"));
1109 ASSERT_STREQ(
":=", ast->m_text.c_str());
1110 ASSERT_TRUE(ast->Left());
1111 ASSERT_TRUE(ast->Right());
1112 ASSERT_STREQ(
"test", ast->Left()->m_text.c_str());
1115 ASSERT_STREQ(
"*", op->m_text.c_str());
1116 ASSERT_TRUE(op->Right());
1117 ASSERT_TRUE(op->Left());
1118 ASSERT_STREQ(
"123", op->Left()->m_text.c_str());
1119 ASSERT_STREQ(
"456", op->Right()->m_text.c_str());
1122TEST_F(ParserTest, MathDiv) {
1123 ASSERT_TRUE(Parse(
"test := 123/456;"));
1124 ASSERT_STREQ(
":=", ast->m_text.c_str());
1125 ASSERT_TRUE(ast->Left());
1126 ASSERT_TRUE(ast->Right());
1127 ASSERT_STREQ(
"test", ast->Left()->m_text.c_str());
1130 ASSERT_STREQ(
"/", op->m_text.c_str());
1131 ASSERT_TRUE(op->Right());
1132 ASSERT_TRUE(op->Left());
1133 ASSERT_STREQ(
"123", op->Left()->m_text.c_str());
1134 ASSERT_STREQ(
"456", op->Right()->m_text.c_str());
1137TEST_F(ParserTest, MathNeg) {
1138 ASSERT_TRUE(Parse(
"test := -456;"));
1139 ASSERT_STREQ(
":=", ast->m_text.c_str());
1140 ASSERT_TRUE(ast->Left());
1141 ASSERT_TRUE(ast->Right());
1142 ASSERT_STREQ(
"test", ast->Left()->m_text.c_str());
1145 ASSERT_STREQ(
"-456", op->m_text.c_str());
1148 ASSERT_TRUE(Parse(
"1000-456"));
1149 ASSERT_STREQ(
"-", ast->m_text.c_str());
1150 ASSERT_TRUE(ast->Left());
1151 ASSERT_TRUE(ast->Right());
1152 ASSERT_STREQ(
"1000", ast->Left()->m_text.c_str());
1155 ASSERT_STREQ(
"456", op->m_text.c_str());
1157 ASSERT_TRUE(Parse(
"-(456)"));
1158 ASSERT_STREQ(
"-", ast->m_text.c_str());
1159 ASSERT_FALSE(ast->Left());
1160 ASSERT_TRUE(ast->Right());
1163 ASSERT_STREQ(
"456", op->m_text.c_str());
1165 ASSERT_ANY_THROW(Parse(
"1000 456"));
1168TEST_F(ParserTest, MathPrioritet) {
1169 ASSERT_TRUE(Parse(
"1+2*3"));
1170 ASSERT_STREQ(
"+", ast->m_text.c_str());
1171 ASSERT_TRUE(ast->Left());
1172 ASSERT_TRUE(ast->Right());
1173 ASSERT_STREQ(
"1", ast->Left()->m_text.c_str());
1176 ASSERT_STREQ(
"*", op->m_text.c_str());
1177 ASSERT_TRUE(op->Right());
1178 ASSERT_TRUE(op->Left());
1179 ASSERT_STREQ(
"2", op->Left()->m_text.c_str());
1180 ASSERT_STREQ(
"3", op->Right()->m_text.c_str());
1183 ASSERT_TRUE(Parse(
"1*2+3"));
1184 ASSERT_STREQ(
"+", ast->m_text.c_str());
1185 ASSERT_TRUE(ast->Left());
1186 ASSERT_TRUE(ast->Right());
1187 ASSERT_STREQ(
"3", ast->Right()->m_text.c_str());
1190 ASSERT_STREQ(
"*", op->m_text.c_str());
1191 ASSERT_TRUE(op->Right());
1192 ASSERT_TRUE(op->Left());
1193 ASSERT_STREQ(
"1", op->Left()->m_text.c_str());
1194 ASSERT_STREQ(
"2", op->Right()->m_text.c_str());
1197 ASSERT_TRUE(Parse(
"(1*2)+3"));
1198 ASSERT_STREQ(
"+", ast->m_text.c_str());
1199 ASSERT_TRUE(ast->Left());
1200 ASSERT_TRUE(ast->Right());
1201 ASSERT_STREQ(
"3", ast->Right()->m_text.c_str());
1204 ASSERT_STREQ(
"*", op->m_text.c_str());
1205 ASSERT_TRUE(op->Right());
1206 ASSERT_TRUE(op->Left());
1207 ASSERT_STREQ(
"1", op->Left()->m_text.c_str());
1208 ASSERT_STREQ(
"2", op->Right()->m_text.c_str());
1211 ASSERT_TRUE(Parse(
"1*(2+3)"));
1212 ASSERT_STREQ(
"*", ast->m_text.c_str());
1213 ASSERT_TRUE(ast->Left());
1214 ASSERT_TRUE(ast->Right());
1215 ASSERT_STREQ(
"1", ast->Left()->m_text.c_str());
1218 ASSERT_STREQ(
"+", op->m_text.c_str());
1219 ASSERT_TRUE(op->Right());
1220 ASSERT_TRUE(op->Left());
1221 ASSERT_STREQ(
"2", op->Left()->m_text.c_str());
1222 ASSERT_STREQ(
"3", op->Right()->m_text.c_str());
1225TEST_F(ParserTest, CodeSimple) {
1226 ASSERT_TRUE(Parse(
"{%code+code%};"));
1227 ASSERT_STREQ(
"code+code", ast->m_text.c_str());
1230TEST_F(ParserTest, CodeSimple2) {
1231 ASSERT_TRUE(Parse(
"{% code+code %};"));
1232 ASSERT_STREQ(
" code+code ", ast->m_text.c_str());
1235TEST_F(ParserTest, Brakets1) {
1236 ASSERT_TRUE(Parse(
"(1+2)"));
1237 ASSERT_STREQ(
"1 + 2", ast->toString().c_str());
1240TEST_F(ParserTest, Brakets2) {
1241 ASSERT_TRUE(Parse(
"(1==2)"));
1242 ASSERT_STREQ(
"1 == 2", ast->toString().c_str());
1245TEST_F(ParserTest, Brakets3) {
1246 ASSERT_TRUE(Parse(
"(call())"));
1247 ASSERT_STREQ(
"call()", ast->toString().c_str());
1250TEST_F(ParserTest, Brakets4) {
1251 ASSERT_TRUE(Parse(
"(:call())"));
1252 ASSERT_STREQ(
":call()", ast->toString().c_str());
1255TEST_F(ParserTest, Brakets5) {
1256 ASSERT_TRUE(Parse(
"(:call()==0)"));
1257 ASSERT_STREQ(
":call() == 0", ast->toString().c_str());
1260TEST_F(ParserTest, AssignSimple) {
1261 ASSERT_TRUE(Parse(
"term := term2;"));
1262 ASSERT_STREQ(
"term := term2;", ast->toString().c_str());
1265TEST_F(ParserTest, AssignSimple2) {
1266 ASSERT_TRUE(Parse(
"\t term := term2() ; \n"));
1267 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1268 ASSERT_TRUE(ast->Left());
1269 ASSERT_TRUE(ast->Right());
1270 ASSERT_STREQ(
"term", ast->Left()->m_text.c_str());
1271 ASSERT_EQ(0, ast->Left()->size());
1272 ASSERT_STREQ(
"term2", ast->Right()->m_text.c_str());
1273 ASSERT_EQ(0, ast->Right()->size());
1274 ASSERT_STREQ(
"term := term2();", ast->toString().c_str());
1277TEST_F(ParserTest, AssignFullName) {
1278 ASSERT_TRUE(Parse(
"term::name() := {term2;};"));
1279 ASSERT_STREQ(
"term::name() := {term2;};", ast->toString().c_str());
1282TEST_F(ParserTest, AssignClass0) {
1283 ASSERT_TRUE(Parse(
"term := :Class();"));
1284 ASSERT_STREQ(
"term := :Class();", ast->toString().c_str());
1287TEST_F(ParserTest, AssignClass1) {
1288 ASSERT_TRUE(Parse(
":class := :Class() {} ;"));
1289 ASSERT_STREQ(
":class := :Class(){};", ast->toString().c_str());
1292TEST_F(ParserTest, AssignClass2) {
1293 ASSERT_TRUE(Parse(
":class := ::ns::func(arg1, arg2=\"\") {};"));
1294 ASSERT_STREQ(
":class := ::ns::func(arg1, arg2=\"\"){};", ast->toString().c_str());
1297TEST_F(ParserTest, Namespace) {
1298 ASSERT_TRUE(Parse(
"name{ func() := {} };"));
1299 ASSERT_TRUE(Parse(
"name::space{ func() := {} };"));
1300 ASSERT_TRUE(Parse(
"::name::space{ func() := {} };"));
1301 ASSERT_TRUE(Parse(
"::{ func() := {} };"));
1304TEST_F(ParserTest, AssignFullName2) {
1305 ASSERT_TRUE(Parse(
"term::name::name2() := term2;"));
1306 ASSERT_STREQ(
"term::name::name2() := term2;", ast->toString().c_str());
1309TEST_F(ParserTest, AssignFullName3) {
1310 ASSERT_TRUE(Parse(
"::term::name::name3() := term2;"));
1311 ASSERT_STREQ(
"::term::name::name3() := term2;", ast->toString().c_str());
1353TEST_F(ParserTest, ArrayAssign) {
1354 ASSERT_TRUE(Parse(
"$0[0] = 123;"));
1355 ASSERT_EQ(TermID::ASSIGN, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1356 ASSERT_TRUE(ast->Left());
1357 ASSERT_TRUE(ast->Right());
1359 ASSERT_EQ(TermID::ARGUMENT, ast->Left()->getTermID());
1360 ASSERT_STREQ(
"$0", ast->Left()->m_text.c_str());
1361 ASSERT_TRUE(ast->Left()->m_name.empty());
1363 ASSERT_TRUE(ast->Left()->Right());
1364 ASSERT_EQ(TermID::INDEX, ast->Left()->Right()->getTermID());
1365 ASSERT_STREQ(
"[", ast->Left()->Right()->m_text.c_str());
1366 ASSERT_EQ(1, ast->Left()->Right()->size());
1367 ASSERT_STREQ(
"0", (*ast->Left()->Right())[0].second->m_text.c_str());
1372TEST_F(ParserTest, DISABLED_ArrayAssign2) {
1373 ASSERT_TRUE(Parse(
"term[1][1..3] = 123;"));
1374 ASSERT_EQ(TermID::ASSIGN, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1375 ASSERT_TRUE(ast->Left());
1376 ASSERT_TRUE(ast->Right());
1378 ASSERT_EQ(TermID::NAME, ast->Left()->getTermID());
1379 ASSERT_STREQ(
"term", ast->Left()->m_text.c_str());
1380 ASSERT_TRUE(ast->Left()->m_name.empty());
1382 ASSERT_TRUE(ast->Left()->Right());
1383 ASSERT_STREQ(
"[", ast->Left()->Right()->m_text.c_str());
1384 ASSERT_TRUE(ast->Left()->Right()->Right());
1385 ASSERT_STREQ(
"[", ast->Left()->Right()->Right()->m_text.c_str());
1386 ASSERT_FALSE(ast->Left()->Right()->Right()->Right());
1388 ASSERT_EQ(TermID::INTEGER, ast->Right()->getTermID());
1389 ASSERT_STREQ(
"123", ast->Right()->m_text.c_str());
1391 ASSERT_STREQ(
"term[1][1, 2, 3]=123;", ast->toString().c_str());
1394TEST_F(ParserTest, DISABLED_FieldArray) {
1395 ASSERT_TRUE(Parse(
"term.val[1].field := value[-1..@count()..5].field;"));
1396 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1397 ASSERT_STREQ(
"term.val[1].field := value[-1..@count()..5].field;", ast->toString().c_str());
1400TEST_F(ParserTest, AssignSimple3) {
1401 ASSERT_TRUE(Parse(
"\t term := term2( ) ; \n"));
1402 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1403 ASSERT_TRUE(ast->Left());
1404 ASSERT_TRUE(ast->Right());
1405 ASSERT_STREQ(
"term := term2();", ast->toString().c_str());
1408TEST_F(ParserTest, AssignSimpleArg) {
1409 ASSERT_TRUE(Parse(
"\t term ::= term2( arg ) ; \n"));
1410 ASSERT_EQ(TermID::CREATE_ONCE, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1411 ASSERT_TRUE(ast->Left());
1412 ASSERT_TRUE(ast->Right());
1413 ASSERT_STREQ(
"term ::= term2(arg);", ast->toString().c_str());
1416TEST_F(ParserTest, AssignSimpleNamedArg) {
1417 ASSERT_TRUE(Parse(
"\t term := $term2( arg = arg2 )\n;\n\n"));
1418 ASSERT_STREQ(
"term := $term2(arg=arg2);", ast->toString().c_str());
1421TEST_F(ParserTest, AssignNamedArgs0) {
1422 ASSERT_TRUE(Parse(
"\t term := \\term2( arg, arg1 = arg2 ) ; \n"));
1423 ASSERT_STREQ(
"term := \\term2(arg, arg1=arg2);", ast->toString().c_str());
1426TEST_F(ParserTest, AssignNamedArgs1) {
1427 ASSERT_TRUE(Parse(
"\t term := @term2( arg, arg1 = arg2 ) ; \n"));
1428 ASSERT_STREQ(
"term := @term2(arg, arg1=arg2);", ast->toString().c_str());
1431TEST_F(ParserTest, AssignNamedArgs2) {
1432 ASSERT_TRUE(Parse(
"\t term := $term2( arg, arg1 = arg2(arg3)) ; \n"));
1433 ASSERT_STREQ(
"term := $term2(arg, arg1=arg2(arg3));", ast->toString().c_str());
1436TEST_F(ParserTest, AssignNamedArgs3) {
1437 ASSERT_TRUE(Parse(
"\t $term := term2( \\arg, arg1 = 123 ) ; \n"));
1438 ASSERT_STREQ(
"$term := term2(\\arg, arg1=123);", ast->toString().c_str());
1441TEST_F(ParserTest, AssignNamedArgs4) {
1442 ASSERT_TRUE(Parse(
"\t %term := term2( arg, arg1 = \\arg2($arg3)) ; \n"));
1443 ASSERT_STREQ(
"%term := term2(arg, arg1=\\arg2($arg3));", ast->toString().c_str());
1446TEST_F(ParserTest, AssignNamedArgs5) {
1447 ASSERT_TRUE(Parse(
"\t %term := term2( arg, arg1 = \\\\arg2($arg3)) ; \n"));
1448 ASSERT_STREQ(
"%term := term2(arg, arg1=\\\\arg2($arg3));", ast->toString().c_str());
1451TEST_F(ParserTest, AssignNamedArgs6) {
1452 ASSERT_TRUE(Parse(
"\t %term := term2( arg, arg1 = @arg2($arg3)) ; \n"));
1453 ASSERT_STREQ(
"%term := term2(arg, arg1=@arg2($arg3));", ast->toString().c_str());
1456TEST_F(ParserTest, AssignString) {
1457 ASSERT_TRUE(Parse(
"term := \"строка\";"));
1458 ASSERT_STREQ(
"term := \"строка\";", ast->toString().c_str());
1461TEST_F(ParserTest, AssignString2) {
1462 ASSERT_TRUE(Parse(
"$2 := \"строка\" ; \n"));
1463 ASSERT_STREQ(
"$2 := \"строка\";", ast->toString().c_str());
1466TEST_F(ParserTest, AssignStringControlChar) {
1467 ASSERT_TRUE(Parse(
"$2 := \"стр\\\"\t\r\xffока\\s\" ; \n"));
1468 ASSERT_STREQ(
"$2 := \"стр\"\t\r\xffока\x20\";", ast->toString().c_str());
1471TEST_F(ParserTest, AssignStringMultiline) {
1472 ASSERT_TRUE(Parse(
"term := 'стр\\\n\t ока\\\n \\s' ; \n"));
1473 ASSERT_STREQ(
"term := 'стр\n\t ока\n \x20';", ast->toString().c_str());
1476TEST_F(ParserTest, AssignDictEmpty) {
1477 ASSERT_TRUE(Parse(
"term := ( , );"));
1478 ASSERT_STREQ(
"term := (,);", ast->toString().c_str());
1481TEST_F(ParserTest, AssignDict) {
1482 ASSERT_TRUE(Parse(
"term := (name,)"));
1484 ASSERT_TRUE(ast->m_left);
1485 ASSERT_TRUE(ast->m_right);
1486 ASSERT_TRUE(ast->m_right->m_id == TermID::DICT);
1487 ASSERT_STREQ(
"term := (name,);", ast->toString().c_str());
1489 ASSERT_TRUE(Parse(
"term := ( 123 , )"));
1490 ASSERT_STREQ(
"term := (123,);", ast->toString().c_str());
1492 ASSERT_TRUE(Parse(
"term := ( name = 123 , )"));
1493 ASSERT_STREQ(
"term := (name=123,);", ast->toString().c_str());
1496TEST_F(ParserTest, AssignArray) {
1497 ASSERT_TRUE(Parse(
"term := [ 123 , ]"));
1498 ASSERT_STREQ(
"term := [123,];", ast->toString().c_str());
1501TEST_F(ParserTest, ArgsArray1) {
1502 ASSERT_TRUE(Parse(
"term([1,]);"));
1503 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1504 ASSERT_STREQ(
"term", ast->m_text.c_str());
1505 ASSERT_EQ(1, ast->size());
1506 ASSERT_STREQ(
"[1,]", (*ast)[0].second->toString().c_str());
1509TEST_F(ParserTest, LogicEq) {
1510 ASSERT_TRUE(Parse(
"var := 1==2;"));
1511 ASSERT_STREQ(
"var := 1 == 2;", ast->toString().c_str());
1514TEST_F(ParserTest, LogicNe) {
1515 ASSERT_TRUE(Parse(
"var := 1!=2;"));
1516 ASSERT_STREQ(
"var := 1 != 2;", ast->toString().c_str());
1519TEST_F(ParserTest, InstanceName) {
1520 ASSERT_TRUE(Parse(
"var ~ Class"));
1521 ASSERT_TRUE(Parse(
"var ~ :Class"));
1522 ASSERT_TRUE(Parse(
"var ~ 'name'"));
1523 ASSERT_TRUE(Parse(
"var ~ $var"));
1524 ASSERT_TRUE(Parse(
"1 ~ $var"));
1525 ASSERT_TRUE(Parse(
"'строка' ~ 'тип'"));
1526 ASSERT_TRUE(Parse(
"1..20 ~ var_name"));
1528 ASSERT_TRUE(Parse(
"var ~~ Class"));
1529 ASSERT_TRUE(Parse(
"var ~~ :Class"));
1530 ASSERT_TRUE(Parse(
"var ~~ 'name'"));
1531 ASSERT_TRUE(Parse(
"var ~~ $var"));
1532 ASSERT_TRUE(Parse(
"1 ~~ $var"));
1533 ASSERT_TRUE(Parse(
"'строка' ~~ 'тип'"));
1534 ASSERT_TRUE(Parse(
"1..20 ~~ var_name"));
1537TEST_F(ParserTest, FunctionSimple) {
1538 ASSERT_TRUE(Parse(
"func() := {{%%}};"));
1539 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1540 ASSERT_STREQ(
"func() := {{%%};};", ast->toString().c_str());
1543TEST_F(ParserTest, FunctionSimpleTwo) {
1544 ASSERT_TRUE(Parse(
"func() := {{% %};{% %}};"));
1545 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1546 ASSERT_STREQ(
"func() := {{% %}; {% %};};", ast->toString().c_str());
1549TEST_F(ParserTest, FunctionSimple2) {
1550 ASSERT_TRUE(Parse(
"func(arg) := {$0:=0;};"));
1551 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1552 ASSERT_STREQ(
"func(arg) := {$0 := 0;};", ast->toString().c_str());
1555TEST_F(ParserTest, FunctionSimple3) {
1556 ASSERT_TRUE(Parse(
"func(arg) := {{% %};{% %};{% %}; $99:=0;};"));
1557 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1558 ASSERT_STREQ(
"func(arg) := {{% %}; {% %}; {% %}; $99 := 0;};", ast->toString().c_str());
1561TEST_F(ParserTest, FunctionSimple4) {
1562 ASSERT_TRUE(Parse(
"func(arg) := {$33:=0;};"));
1563 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1564 ASSERT_STREQ(
"func(arg) := {$33 := 0;};", ast->toString().c_str());
1567TEST_F(ParserTest, FunctionSimple5) {
1568 ASSERT_TRUE(Parse(
"print(str=\"\") :={% printf(\"%s\", static_cast<char *>($str)); %};"));
1569 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1570 ASSERT_STREQ(
"print(str=\"\") := {% printf(\"%s\", static_cast<char *>($str)); %};", ast->toString().c_str());
1573TEST_F(ParserTest, FunctionTrans2) {
1574 ASSERT_TRUE(Parse(
"func(arg1, arg2 = 5) :- {% return $arg1; %};"));
1575 ASSERT_STREQ(
"func(arg1, arg2=5) :- {% return $arg1; %};", ast->toString().c_str());
1578TEST_F(ParserTest, FunctionTrans3) {
1579 ASSERT_TRUE(Parse(
"func(arg1, arg2 = 5) ::- {% return $arg1; %};"));
1580 ASSERT_STREQ(
"func(arg1, arg2=5) ::- {% return $arg1; %};", ast->toString().c_str());
1583TEST_F(ParserTest, FunctionTrans4) {
1584 ASSERT_TRUE(Parse(
"func(arg1, arg2 = 5) :- { [$arg1 < $arg2] --> {% return $arg1; %}; };"));
1585 ASSERT_STREQ(
"func(arg1, arg2=5) :- {[$arg1 < $arg2]-->{% return $arg1; %};};", ast->toString().c_str());
1588TEST_F(ParserTest, FunctionTrans5) {
1589 ASSERT_TRUE(Parse(
"func(arg1, arg2 = 5) :- { [$arg1<$arg2] --> {% return $arg1; %}, [...] --> {% return $arg2; %}; };"));
1590 ASSERT_STREQ(
"func(arg1, arg2=5) :- {[$arg1 < $arg2]-->{% return $arg1; %},\n [...]-->{% return $arg2; %};;};", ast->toString().c_str());
1594TEST_F(ParserTest, FunctionRussian1) {
1595 ASSERT_TRUE(Parse(
"мин(arg) := {$00:=0;};"));
1596 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1597 ASSERT_STREQ(
"мин(arg) := {$00 := 0;};", ast->toString().c_str());
1600TEST_F(ParserTest, FunctionRussian2) {
1601 ASSERT_TRUE(Parse(
"мин(арг) := {$1:=0;};"));
1602 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1603 ASSERT_STREQ(
"мин(арг) := {$1 := 0;};", ast->toString().c_str());
1606TEST_F(ParserTest, FunctionRussian3) {
1607 ASSERT_TRUE(Parse(
"русс(10,20);"));
1608 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1609 ASSERT_STREQ(
"русс(10, 20)", ast->toString().c_str());
1612TEST_F(ParserTest, FunctionRussian4) {
1613 ASSERT_TRUE(Parse(
"мин(10,20);"));
1614 ASSERT_EQ(TermID::NAME, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1615 ASSERT_STREQ(
"мин(10, 20)", ast->toString().c_str());
1618TEST_F(ParserTest, FunctionArgs) {
1619 ASSERT_TRUE(Parse(
"мин(...) := {$1:=0;};"));
1620 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1621 ASSERT_STREQ(
"мин(...) := {$1 := 0;};", ast->toString().c_str());
1624TEST_F(ParserTest, FunctionArgs2) {
1625 ASSERT_TRUE(Parse(
"мин(arg, ...) := {$1:=0;};"));
1626 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1627 ASSERT_STREQ(
"мин(arg, ...) := {$1 := 0;};", ast->toString().c_str());
1630TEST_F(ParserTest, FunctionArgs3) {
1631 ASSERT_TRUE(Parse(
"мин(arg1, arg2, ...) := {$0:=0;};"));
1632 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1633 ASSERT_STREQ(
"мин(arg1, arg2, ...) := {$0 := 0;};", ast->toString().c_str());
1636TEST_F(ParserTest, FunctionKwArgs1) {
1637 ASSERT_TRUE(Parse(
"мин(...) := {$0:=0;func();var;};"));
1638 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1639 ASSERT_STREQ(
"мин(...) := {$0 := 0; func(); var;};", ast->toString().c_str());
1642TEST_F(ParserTest, FunctionKwArgs2) {
1643 ASSERT_TRUE(Parse(
"мин(arg=123 , ...) := {$0:=0;};"));
1644 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1645 ASSERT_STREQ(
"мин(arg=123, ...) := {$0 := 0;};", ast->toString().c_str());
1648TEST_F(ParserTest, FunctionKwArgs3) {
1649 ASSERT_TRUE(Parse(
"мин(arg1=1, arg2=2 ,...) := {$0:=0;};"));
1650 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1651 ASSERT_STREQ(
"мин(arg1=1, arg2=2, ...) := {$0 := 0;};", ast->toString().c_str());
1654TEST_F(ParserTest, FunctionArgsAll) {
1655 ASSERT_TRUE(Parse(
"мин(arg1=1, arg2=2 , ...) := {$0:=0;};"));
1656 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1657 ASSERT_STREQ(
"мин(arg1=1, arg2=2, ...) := {$0 := 0;};", ast->toString().c_str());
1660TEST_F(ParserTest, FunctionArgsAll2) {
1661 ASSERT_TRUE(Parse(
"мин(arg, arg1=1, arg2=2, ...) := {$0:=0;};"));
1662 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1663 ASSERT_STREQ(
"мин(arg, arg1=1, arg2=2, ...) := {$0 := 0;};", ast->toString().c_str());
1666TEST_F(ParserTest, FunctionEmpty) {
1667 ASSERT_TRUE(Parse(
"мин(arg, arg1=1, arg2=2, ...) := {};"));
1668 ASSERT_STREQ(
"мин(arg, arg1=1, arg2=2, ...) := {};", ast->toString().c_str());
1671TEST_F(ParserTest, FunctionEmpty2) {
1672 ASSERT_TRUE(Parse(
"мин(...) :- {};"));
1673 ASSERT_STREQ(
"мин(...) :- {};", ast->toString().c_str());
1676TEST_F(ParserTest, FunctionArgsFail) {
1677 ASSERT_ANY_THROW(Parse(
"мин(... ...) := {$0:=0;};"));
1678 ASSERT_ANY_THROW(Parse(
"мин(arg ...) := {$0:=0;};"));
1679 ASSERT_ANY_THROW(Parse(
"мин(arg=1 ..., arg) := {$0:=0;};"));
1680 ASSERT_ANY_THROW(Parse(
"мин(arg=1, arg ...) := {$0:=0;};"));
1681 ASSERT_ANY_THROW(Parse(
"мин(arg=1 ...) := {$0:=0;};"));
1684TEST_F(ParserTest, ArrayAdd7) {
1685 ASSERT_TRUE(Parse(
"name() := term2;"));
1686 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1687 ASSERT_STREQ(
"name() := term2;", ast->toString().c_str());
1690TEST_F(ParserTest, Ellipsis1) {
1691 ASSERT_TRUE(Parse(
"name := term2(arg1 , ... ... dict);"));
1692 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1693 ASSERT_STREQ(
"name := term2(arg1, ... ...dict);", ast->toString().c_str());
1738TEST_F(ParserTest, Ellipsis2) {
1739 ASSERT_TRUE(Parse(
"\\name := term2( ... arg);"));
1740 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1741 ASSERT_STREQ(
"\\name := term2(...arg);", ast->toString().c_str());
1744TEST_F(ParserTest, Func1) {
1745 ASSERT_TRUE(Parse(
"func_arg(arg1 :Int8, arg2) :Int8 := { $arg1+$arg2; };"));
1746 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1747 ASSERT_STREQ(
"func_arg(arg1:Int8, arg2):Int8 := {$arg1 + $arg2;};", ast->toString().c_str());
1750TEST_F(ParserTest, Func2) {
1751 ASSERT_TRUE(Parse(
"func_arg(arg1:&Int8, &arg2) :&Int8 := { $arg1+$arg2; };"));
1752 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1753 ASSERT_STREQ(
"func_arg(arg1:&Int8, &arg2):&Int8 := {$arg1 + $arg2;};", ast->toString().c_str());
1756TEST_F(ParserTest, Func3) {
1757 ASSERT_TRUE(Parse(
"$res:Int8 ::= func_arg(100, 100);"));
1758 ASSERT_EQ(TermID::CREATE_ONCE, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1759 ASSERT_STREQ(
"$res:Int8 ::= func_arg(100, 100);", ast->toString().c_str());
1762TEST_F(ParserTest, Func4) {
1763 ASSERT_TRUE(Parse(
"res() := func_arg(100, 100); res() := func_arg(100, 100); res() := func_arg(100, 100);"));
1766TEST_F(ParserTest, Comment) {
1767 ASSERT_TRUE(Parse(
"#!line1"));
1768 ASSERT_TRUE(Parse(
"#!line1\n"));
1769 ASSERT_TRUE(Parse(
"#!line1\n#!line2"));
1770 ASSERT_TRUE(Parse(
"#!line1\n#!line2\n\n#!line4"));
1774TEST_F(ParserTest, Comment2) {
1775 ASSERT_TRUE(Parse(
"#!line1\n#line2\n \n\n/* \n \n */ \n"));
1783TEST_F(ParserTest, Comment3) {
1784 const char *str =
"print(str=\"\") := { {% %} };\n"
1788 "# @print(\"Привет, мир!\\n\");\n";
1789 ASSERT_TRUE(Parse(str));
1790 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1797TEST_F(ParserTest, Comment4) {
1798 const char *str =
"#!/bin/nlc;\n"
1799 "print1(str=\"\") := {% %};\n"
1800 "print2(str=\"\") := {% %};\n"
1801 "# @print(\"Привет, мир!\\n\");\n";
1802 ASSERT_TRUE(Parse(str));
1803 ASSERT_EQ(TermID::BLOCK, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1804 ASSERT_EQ(2, ast->m_block.size());
1806 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->m_block[0]->getTermID()) <<
newlang::toString(ast->getTermID());
1807 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->m_block[1]->getTermID()) <<
newlang::toString(ast->getTermID());
1811TEST_F(ParserTest, Comment5) {
1812 const char *str =
"term();\n"
1813 "print1(str=\"\") := {% %};\n"
1814 "print2(str=\"\") := { {% %} };\n\n"
1815 "print3(str=\"\") := {% %};\n\n\n"
1816 "# @print(\"Привет, мир!\\n\");\n";
1817 ASSERT_TRUE(Parse(str));
1818 ASSERT_EQ(TermID::BLOCK, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1819 ASSERT_EQ(4, ast->m_block.size());
1820 ASSERT_EQ(TermID::NAME, ast->m_block[0]->getTermID()) <<
newlang::toString(ast->getTermID());
1822 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->m_block[1]->getTermID()) <<
newlang::toString(ast->getTermID());
1823 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->m_block[2]->getTermID()) <<
newlang::toString(ast->getTermID());
1824 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->m_block[3]->getTermID()) <<
newlang::toString(ast->getTermID());
1827TEST_F(ParserTest, Comment6) {
1828 ASSERT_TRUE(Parse(
"# @@macro @@@"));
1829 ASSERT_FALSE(ast->size());
1830 ASSERT_TRUE(Parse(
"# @@macro @@@\n"));
1831 ASSERT_FALSE(ast->size());
1832 ASSERT_TRUE(Parse(
"/* @@macro @@@ */"));
1833 ASSERT_FALSE(ast->size());
1834 ASSERT_TRUE(Parse(
"/* @@macro @@@\n*/"));
1835 ASSERT_FALSE(ast->size());
1836 ASSERT_TRUE(Parse(
"/* @@macro @@@\n\n*/"));
1837 ASSERT_FALSE(ast->size());
1838 ASSERT_TRUE(Parse(
"/*/* @@macro @@@\n\n*/*/"));
1839 ASSERT_FALSE(ast->size());
1842TEST_F(ParserTest, CommentIncluded) {
1848 const char *str2 =
"/* /* /* /* term();\n"
1849 "print1(str=\"\") ::= term();\n"
1850 "print2(str=\"\") ::= term();\n\n */ "
1851 "print3( */ str=\"\") ::= term();\n\n\n"
1853 "# @print(\"Привет, мир!\\n\");\n";
1854 ASSERT_TRUE(Parse(str2));
1857TEST_F(ParserTest, Types) {
1858 EXPECT_TRUE(Parse(
":type1 := :type;"));
1859 EXPECT_TRUE(Parse(
":type2 := :type;"));
1860 EXPECT_TRUE(Parse(
":type3 := type();"));
1861 EXPECT_TRUE(Parse(
":type4 := type();;"));
1865 EXPECT_TRUE(Parse(
":type7 ::= :Type;"));
1866 EXPECT_TRUE(Parse(
":type8 ::= :Type();;"));
1868 EXPECT_TRUE(Parse(
":type9 := (1234,);"));
1869 EXPECT_TRUE(Parse(
":type10 := (1234, name=1234,);"));
1870 EXPECT_TRUE(Parse(
":type11 := class1(1234);"));
1871 EXPECT_TRUE(Parse(
":type12 := :class1(1234, name=1234);;"));
1878 EXPECT_TRUE(Parse(
":type17 := class(1234);"));
1881 EXPECT_TRUE(Parse(
":type20 := (1234, name=1234,);"));
1884TEST_F(ParserTest, Const2) {
1885 ASSERT_TRUE(Parse(
"const^ ::= \"CONST\";"));
1886 ASSERT_EQ(TermID::CREATE_ONCE, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1887 ASSERT_STREQ(
"const^ ::= \"CONST\";", ast->toString().c_str());
1890TEST_F(ParserTest, Const3) {
1891 ASSERT_TRUE(Parse(
"const^ := 123;"));
1892 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1893 ASSERT_STREQ(
"const^ := 123;", ast->toString().c_str());
1896TEST_F(ParserTest, Sequence) {
1897 ASSERT_NO_THROW(Parse(
";"));
1898 ASSERT_NO_THROW(Parse(
";;"));
1899 ASSERT_NO_THROW(Parse(
";;;"));
1900 ASSERT_NO_THROW(Parse(
"val;"));
1901 ASSERT_NO_THROW(Parse(
"val;val;"));
1903 ASSERT_NO_THROW(Parse(
"val;;"));
1904 ASSERT_NO_THROW(Parse(
"val;;;"));
1905 ASSERT_NO_THROW(Parse(
"val;;;;val;;;;"));
1907 ASSERT_NO_THROW(Parse(
"val();"));
1908 ASSERT_NO_THROW(Parse(
"val();val();"));
1910 ASSERT_NO_THROW(Parse(
"val();"));
1911 ASSERT_NO_THROW(Parse(
"val();;;"));
1912 ASSERT_NO_THROW(Parse(
"val();;;val();;;"));
1915 ASSERT_NO_THROW(Parse(
"_()::={val;};"));
1916 ASSERT_NO_THROW(Parse(
"_()::={val;val;};"));
1918 ASSERT_NO_THROW(Parse(
"_( ):-{val;;}; _()::={*fff;*};"));
1919 ASSERT_NO_THROW(Parse(
"_( ):-{val;;;}; _()::={*fff;*};;"));
1920 ASSERT_NO_THROW(Parse(
"_()::={val;;;;val;_()::={_()::={fff;};};};;;;"));
1921 ASSERT_NO_THROW(Parse(
"_()::={*val;;;;val;;;_(123, 333)::-{_()::={*fff;*};};_( ):-{fff;};*};;;;"));
1923 ASSERT_NO_THROW(Parse(
"_()::={val();};"));
1924 ASSERT_NO_THROW(Parse(
"_()::={val();val();};"));
1925 ASSERT_NO_THROW(Parse(
"_()::={val();val();;};"));
1927 ASSERT_NO_THROW(Parse(
"_()::={val();};"));
1928 ASSERT_NO_THROW(Parse(
"_()::={val();;;};;;"));
1929 ASSERT_NO_THROW(Parse(
"_()::= {val();;;val();;;};;;"));
1930 ASSERT_NO_THROW(Parse(
"_()::= {val();;;_()::={val();};;;;};;;"));
1933TEST_F(ParserTest, BlockTry) {
1934 ASSERT_TRUE(Parse(
"_()::={*1; 2; 3;*}; 4;"));
1935 ASSERT_EQ(2, ast->m_block.size());
1936 ASSERT_EQ(TermID::BLOCK, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1937 ASSERT_EQ(TermID::CREATE_ONCE, ast->m_block[0]->getTermID()) <<
newlang::toString(ast->m_block[0]->getTermID());
1938 ASSERT_EQ(TermID::INTEGER, ast->m_block[1]->getTermID()) <<
newlang::toString(ast->m_block[1]->getTermID());
1940 ASSERT_TRUE(Parse(
"_():={- 1; 2; 3; --4--; 5; 6;-}; 100;"));
1941 ASSERT_EQ(2, ast->m_block.size());
1942 ASSERT_EQ(TermID::CREATE_OVERLAP, ast->m_block[0]->getTermID()) <<
newlang::toString(ast->m_block[0]->getTermID());
1943 ASSERT_EQ(TermID::INTEGER, ast->m_block[1]->getTermID()) <<
newlang::toString(ast->m_block[1]->getTermID());
1945 ASSERT_TRUE(Parse(
"_()::-{+ 1; 2; 3; ++4++; 5; 6;+}; 100;"));
1946 ASSERT_EQ(2, ast->m_block.size());
1947 ASSERT_EQ(TermID::BLOCK, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1948 ASSERT_EQ(TermID::PURE_OVERLAP, ast->m_block[0]->getTermID()) <<
newlang::toString(ast->m_block[0]->getTermID());
1950 ASSERT_TRUE(Parse(
"_():- {1; 2; 3; ++4++; 5; 6;};"));
1951 ASSERT_EQ(0, ast->m_block.size());
1952 ASSERT_EQ(TermID::PURE_ONCE, ast->getTermID()) <<
newlang::toString(ast->getTermID());
1955TEST_F(ParserTest, Repeat) {
1956 ASSERT_TRUE(Parse(
"[val] <-> val;"));
1957 ASSERT_TRUE(Parse(
"val <-> [val];;"));
1958 ASSERT_TRUE(Parse(
"[val] <-> {val;};"));
1959 ASSERT_TRUE(Parse(
"[val] <-> {val;};;"));
1960 ASSERT_TRUE(Parse(
"[val] <-> {val;};"));
1961 ASSERT_TRUE(Parse(
"[val] <-> {val;};;"));
1963 ASSERT_TRUE(Parse(
"val <-> [val()];"));
1964 ASSERT_TRUE(Parse(
"val <-> [val()];;"));
1965 ASSERT_TRUE(Parse(
"[val()] <-> {val();};"));
1966 ASSERT_TRUE(Parse(
"[val()] <-> {val();};;"));
1967 ASSERT_TRUE(Parse(
"[val()] <-> {val();};"));
1968 ASSERT_TRUE(Parse(
"[val()] <-> {val();};;"));
1970 ASSERT_TRUE(Parse(
"[val()] <-> {val()};val();"));
1971 ASSERT_TRUE(Parse(
"val <-> [val()];val();"));
1972 ASSERT_TRUE(Parse(
"[val()] <-> {val();val();};"));
1973 ASSERT_TRUE(Parse(
"[val()] <-> {val();val();};;"));
1974 ASSERT_TRUE(Parse(
"[val()] <-> {val();val();};"));
1975 ASSERT_TRUE(Parse(
"[val()] <-> {val();val();};;"));
1978TEST_F(ParserTest, Else) {
1979 ASSERT_TRUE(Parse(
"[val] <-> val, [...]-->else;"));
1980 ASSERT_TRUE(Parse(
"[val] <->{val}, [...]-->{else}"));
1983TEST_F(ParserTest, CheckResult) {
1985 ASSERT_TRUE(Parse(
"{ expr }; "));
1986 ASSERT_TRUE(Parse(
"{- expr -}"));
1987 ASSERT_TRUE(Parse(
"{+ expr +}"));
1988 ASSERT_TRUE(Parse(
"{* expr *}"));
1990 ASSERT_TRUE(Parse(
"{ expr }; "));
1991 ASSERT_TRUE(Parse(
"** {- expr -}"));
1992 ASSERT_TRUE(Parse(
"** {+ expr +}"));
1993 ASSERT_TRUE(Parse(
"** {* expr *}"));
1995 ASSERT_TRUE(Parse(
"{ ++expr++ }; "));
1996 ASSERT_TRUE(Parse(
"{- +-expr-+ -}"));
1997 ASSERT_TRUE(Parse(
"{+ --expr-- +}"));
1998 ASSERT_TRUE(Parse(
"{* --expr-- *}"));
2000 ASSERT_TRUE(Parse(
"{ ++100++ }; "));
2001 ASSERT_TRUE(Parse(
"{- --100-- -}"));
2002 ASSERT_TRUE(Parse(
"{+ --100-- +}"));
2003 ASSERT_TRUE(Parse(
"{* --100-- *}"));
2005 ASSERT_TRUE(Parse(
"{ expr } :Type; "));
2006 ASSERT_TRUE(Parse(
"{- expr -} :Type "));
2007 ASSERT_TRUE(Parse(
"{+ expr +} :Type "));
2008 ASSERT_TRUE(Parse(
"{* expr *} :Type "));
2016 ASSERT_TRUE(Parse(
"{ expr }:<:Type, :Type> "));
2017 ASSERT_TRUE(Parse(
"{- expr -}:<:Type, :Type> "));
2018 ASSERT_TRUE(Parse(
"{+ expr +}:<:Type, :Type>; "));
2019 ASSERT_TRUE(Parse(
"{* expr *}:<:Type, :Type>;; "));
2021 ASSERT_TRUE(Parse(
"{ expr }:<...> "));
2022 ASSERT_TRUE(Parse(
"{- expr -}:<...> "));
2023 ASSERT_TRUE(Parse(
"{+ expr +}:<...>; "));
2024 ASSERT_TRUE(Parse(
"{* expr *} : < ... >;; "));
2054TEST_F(ParserTest, OperInt) {
2055 ASSERT_TRUE(Parse(
"_()::={val * val}"));
2056 ASSERT_TRUE(Parse(
"_()::={+val * val+}"));
2057 ASSERT_TRUE(Parse(
"_():None::={- val * val -}"));
2058 ASSERT_TRUE(Parse(
"_():None ::= {*val * val*}"));
2059 ASSERT_TRUE(Parse(
"_()::= {val * val}"));
2060 ASSERT_TRUE(Parse(
"_()::= {+val * val+}"));
2061 ASSERT_TRUE(Parse(
"_()::= {-val * val-}"));
2062 ASSERT_TRUE(Parse(
"_()::= {*val * val*}"));
2065TEST_F(ParserTest, Operators) {
2066 ASSERT_TRUE(Parse(
"val + val;"));
2067 ASSERT_TRUE(Parse(
"val - val;"));
2068 ASSERT_TRUE(Parse(
"_()::={val * val;};"));
2069 ASSERT_TRUE(Parse(
"_()::={val / val;};"));
2071 ASSERT_TRUE(Parse(
"val + val();"));
2072 ASSERT_TRUE(Parse(
"val - val();;"));
2073 ASSERT_TRUE(Parse(
"val * val();;"));
2074 ASSERT_TRUE(Parse(
"_()::={val / val();};"));
2076 ASSERT_TRUE(Parse(
"val + val();"));
2077 ASSERT_TRUE(Parse(
"val - val();; val - val();"));
2078 ASSERT_TRUE(Parse(
"val * val();; val - val();;"));
2079 ASSERT_TRUE(Parse(
"_()::={val / val(); val - val()};;"));
2081 ASSERT_TRUE(Parse(
"(val + val());"));
2082 ASSERT_TRUE(Parse(
"(val - val()) + (val - val());"));
2083 ASSERT_TRUE(Parse(
"(val * val()) - (val - val());"));
2084 ASSERT_TRUE(Parse(
"_()::={val / val() + (val - val())};"));
2085 ASSERT_TRUE(Parse(
"_()::= {* val * val() / (val - val()); *} :None;"));
2087 ASSERT_TRUE(Parse(
"val + [1,2,];"));
2088 ASSERT_TRUE(Parse(
"val * [1,]:Int8;"));
2089 ASSERT_TRUE(Parse(
"val ~ (,)"));
2090 ASSERT_TRUE(Parse(
"val ~ (,):Class"));
2094TEST_F(ParserTest, Repeat0) {
2095 ASSERT_TRUE(Parse(
"[human || $ttttt && 123 != test[0].field ] <-> if_1;"));
2096 ASSERT_STREQ(
"[human || $ttttt && 123 != test[0].field]<->if_1;", ast->toString().c_str());
2099TEST_F(ParserTest, Repeat1) {
2100 ASSERT_TRUE(Parse(
"[test == human] <-> if_1;"));
2101 ASSERT_STREQ(
"[test == human]<->if_1;", ast->toString().c_str());
2104TEST_F(ParserTest, Repeat2) {
2105 ASSERT_TRUE(Parse(
"[test != human] <-> {if_1;};"));
2106 ASSERT_STREQ(
"[test != human]<->{if_1;};", ast->toString().c_str());
2108 ASSERT_TRUE(Parse(
"{if_1;} <-> [test!=human];"));
2109 ASSERT_STREQ(
"{if_1;}<->[test != human];", ast->toString().c_str());
2112TEST_F(ParserTest, Repeat3) {
2113 ASSERT_TRUE(Parse(
"[test != human] <-> {if_1;if_2;then3;};"));
2114 ASSERT_STREQ(
"[test != human]<->{if_1; if_2; then3;};", ast->toString().c_str());
2116 ASSERT_TRUE(Parse(
"{if_1;if_2;then3;} <-> [test != human];"));
2117 ASSERT_STREQ(
"{if_1; if_2; then3;}<->[test != human];", ast->toString().c_str());
2120TEST_F(ParserTest, Repeat4) {
2121 ASSERT_TRUE(Parse(
"[test()] <-> {if_1;if_2;then3;};"));
2122 ASSERT_STREQ(
"[test()]<->{if_1; if_2; then3;};", ast->toString().c_str());
2124 ASSERT_TRUE(Parse(
"[test()] <-> {if_1;if_2;then3;};"));
2125 ASSERT_STREQ(
"[test()]<->{if_1; if_2; then3;};", ast->toString().c_str());
2127 ASSERT_TRUE(Parse(
"{if_1;if_2;then3;} <-> [test()];"));
2128 ASSERT_STREQ(
"{if_1; if_2; then3;}<->[test()];", ast->toString().c_str());
2130 ASSERT_TRUE(Parse(
"{if_1;if_2;then3;} <-> [test()];"));
2131 ASSERT_STREQ(
"{if_1; if_2; then3;}<->[test()];", ast->toString().c_str());
2134TEST_F(ParserTest, Repeat5) {
2135 ASSERT_TRUE(Parse(
" [ test! ]<-> {if_1;if_2;then3;};"));
2136 ASSERT_STREQ(
"[test!]<->{if_1; if_2; then3;};", ast->toString().c_str());
2138 ASSERT_TRUE(Parse(
" [test!] <-> {if_1;if_2;then3;};"));
2139 ASSERT_STREQ(
"[test!]<->{if_1; if_2; then3;};", ast->toString().c_str());
2141 ASSERT_TRUE(Parse(
"{if_1;if_2;then3;}<->[test!];"));
2142 ASSERT_STREQ(
"{if_1; if_2; then3;}<->[test!];", ast->toString().c_str());
2144 ASSERT_TRUE(Parse(
"{if_1;if_2;then3;}<->[test!];"));
2145 ASSERT_STREQ(
"{if_1; if_2; then3;}<->[test!];", ast->toString().c_str());
2148TEST_F(ParserTest, Repeat6) {
2149 ASSERT_TRUE(Parse(
"[test!] <-> {if_1;if_2;then3;};"));
2150 ASSERT_STREQ(
"[test!]<->{if_1; if_2; then3;};", ast->toString().c_str());
2153TEST_F(ParserTest, Repeat7) {
2154 ASSERT_TRUE(Parse(
"[test[0].field != $test!] <-> if_1;"));
2155 ASSERT_STREQ(
"[test[0].field != $test!]<->if_1;", ast->toString().c_str());
2158TEST_F(ParserTest, Range) {
2159 ASSERT_TRUE(Parse(
"0.1..0.9..0.1;"));
2160 ASSERT_STREQ(
"0.1..0.9..0.1", ast->toString().c_str());
2163TEST_F(ParserTest, Range1) {
2164 ASSERT_TRUE(Parse(
"[i!] <-> call();"));
2165 ASSERT_STREQ(
"[i!]<->call();", ast->toString().c_str());
2167 ASSERT_TRUE(Parse(
"call() <-> [i!];"));
2168 ASSERT_STREQ(
"call()<->[i!];", ast->toString().c_str());
2171TEST_F(ParserTest, Range2) {
2172 ASSERT_TRUE(Parse(
"[i()] <-> @error(\"Error\");"));
2173 ASSERT_STREQ(
"[i()]<->@error(\"Error\");", ast->toString().c_str());
2176TEST_F(ParserTest, RangeCall) {
2177 ASSERT_TRUE(Parse(
"0.1..$sss"));
2178 ASSERT_TRUE(Parse(
"0.1..1*2"));
2179 ASSERT_TRUE(Parse(
"0.1..term()"));
2180 ASSERT_TRUE(Parse(
"0.1..term()..1*2+2-term"));
2181 ASSERT_TRUE(Parse(
"$term..term()+$term..-1*2+2-@term()"));
2184TEST_F(ParserTest, Follow) {
2186 ASSERT_TRUE(Parse(
"[test == human || ttttt&&123!=test.field ] --> if_1;"));
2187 ASSERT_STREQ(
"[test == human || ttttt && 123 != test.field]-->if_1;", ast->toString().c_str());
2190TEST_F(ParserTest, Follow0) {
2191 ASSERT_TRUE(Parse(
"[test] --> follow;"));
2192 ASSERT_STREQ(
"[test]-->follow;", ast->toString().c_str());
2194 ASSERT_TRUE(Parse(
"[test] --> follow;"));
2195 ASSERT_STREQ(
"[test]-->follow;", ast->toString().c_str());
2197 ASSERT_TRUE(Parse(
"[test] --> {follow;};"));
2198 ASSERT_STREQ(
"[test]-->{follow;};", ast->toString().c_str());
2200 ASSERT_TRUE(Parse(
"[test] --> {follow};"));
2201 ASSERT_STREQ(
"[test]-->{follow;};", ast->toString().c_str());
2203 ASSERT_TRUE(Parse(
"[test] --> {follow;};"));
2204 ASSERT_STREQ(
"[test]-->{follow;};", ast->toString().c_str());
2206 ASSERT_TRUE(Parse(
"[test] --> {follow;};"));
2207 ASSERT_STREQ(
"[test]-->{follow;};", ast->toString().c_str());
2210TEST_F(ParserTest, Follow1) {
2212 ASSERT_TRUE(Parse(
"[test == human] --> if_1;"));
2213 ASSERT_STREQ(
"[test == human]-->if_1;", ast->toString().c_str());
2216TEST_F(ParserTest, Follow2) {
2217 ASSERT_TRUE(Parse(
"[test != human] --> {if_1;};"));
2218 ASSERT_STREQ(
"[test != human]-->{if_1;};", ast->toString().c_str());
2221TEST_F(ParserTest, Follow3) {
2222 ASSERT_TRUE(Parse(
"[test!=human] --> {if_1;if_2;then3;};"));
2223 ASSERT_STREQ(
"[test != human]-->{if_1; if_2; then3;};", ast->toString().c_str());
2226TEST_F(ParserTest, Follow4) {
2227 ASSERT_TRUE(Parse(
"[test != human] --> {if_1;if_2;then3;}, [...] --> {else;};"));
2231TEST_F(ParserTest, Follow5) {
2232 ASSERT_TRUE(Parse(
"[@test1('')] --> {then1;}, [$test2] --> {then2;then2;}, [@test3+$test3] --> {then3;};"));
2236TEST_F(ParserTest, Follow6) {
2237 ASSERT_TRUE(Parse(
"[@test1()] --> {then1;}, [$test2] --> {then2;}, [@test3+$test3] --> {then3;}, [...] --> {else;else();};"));
2241TEST_F(ParserTest, DISABLED_Follow7) {
2242 ASSERT_TRUE(Parse(
"[test.field[0] > iter!!] --> if_1;"));
2276TEST_F(ParserTest, Match1) {
2277 ASSERT_TRUE(Parse(
"[1]==>{[1]-->first;}"));
2280TEST_F(ParserTest, Match1_0) {
2281 ASSERT_TRUE(Parse(
"[1]==>{[1]-->{first};}"));
2284TEST_F(ParserTest, Match2) {
2285 ASSERT_TRUE(Parse(
"[1]==>{[1]-->first;[2]-->second();}"));
2288TEST_F(ParserTest, Match2_0) {
2290 Parse(
"[1]==>{[1]-->first;[...]-->end();[2]-->second();}");
2294TEST_F(ParserTest, Match3) {
2295 ASSERT_TRUE(Parse(
"[1]==>{[1]-->first;[2]-->second();[...]-->end();}"));
2298TEST_F(ParserTest, Match3_0) {
2299 ASSERT_TRUE(Parse(
"[1]==>{[1]-->first;[2]-->{second();second()};[...]-->{end()};}"));
2302TEST_F(ParserTest, Error) {
2303 ASSERT_TRUE(Parse(
"--;"));
2304 ASSERT_TRUE(Parse(
"--;;"));
2305 ASSERT_TRUE(Parse(
"ns:: --;"));
2306 ASSERT_TRUE(Parse(
"ns:: --;;"));
2307 ASSERT_TRUE(Parse(
"ns::ns:: --;"));
2308 ASSERT_TRUE(Parse(
"ns::ns:: --;;"));
2309 ASSERT_TRUE(Parse(
":: --;"));
2310 ASSERT_TRUE(Parse(
":: --;;"));
2311 ASSERT_TRUE(Parse(
"::ns --;"));
2312 ASSERT_TRUE(Parse(
"::ns --;;"));
2313 ASSERT_TRUE(Parse(
"::ns:: --;"));
2314 ASSERT_TRUE(Parse(
"::ns:: --;;"));
2315 ASSERT_TRUE(Parse(
"--_--;"));
2316 ASSERT_TRUE(Parse(
"--_--;;"));
2317 ASSERT_TRUE(Parse(
"-- eval --;"));
2318 ASSERT_TRUE(Parse(
"--eval--;;"));
2319 ASSERT_TRUE(Parse(
"--eval()--;"));
2320 ASSERT_TRUE(Parse(
"-- eval() --;;"));
2321 ASSERT_TRUE(Parse(
"--0--;"));
2322 ASSERT_TRUE(Parse(
"--0--;;"));
2323 ASSERT_TRUE(Parse(
"ns:: --0--;"));
2324 ASSERT_TRUE(Parse(
"ns:: --0--;;"));
2325 ASSERT_TRUE(Parse(
"++ 0.1 ++;"));
2326 ASSERT_TRUE(Parse(
"-- 0.1 --;;"));
2327 ASSERT_TRUE(Parse(
"name ++ 0.1 ++;"));
2328 ASSERT_TRUE(Parse(
"name -- 0.1 --;;"));
2329 ASSERT_TRUE(Parse(
"--[0,]--;"));
2330 ASSERT_TRUE(Parse(
"++(0,)++;;"));
2331 ASSERT_TRUE(Parse(
"--(0,1,2,3,):Class--;;"));
2332 ASSERT_TRUE(Parse(
"--(0,2,3,) :Class --;;"));
2333 ASSERT_TRUE(Parse(
"--(0,)--;;"));
2334 ASSERT_TRUE(Parse(
"--:Class(var)--;"));
2335 ASSERT_TRUE(Parse(
"--:Class[0](1)--;"));
2336 ASSERT_TRUE(Parse(
"--call()--;"));
2337 ASSERT_TRUE(Parse(
"--call()--;;"));
2338 ASSERT_TRUE(Parse(
"--call(arg)--;"));
2339 ASSERT_TRUE(Parse(
"--call(arg)--;;"));
2340 ASSERT_TRUE(Parse(
"--:class--;"));
2341 ASSERT_TRUE(Parse(
"--:class--;;"));
2342 ASSERT_TRUE(Parse(
"--:class()--;"));
2343 ASSERT_TRUE(Parse(
"--:class()--;;"));
2344 ASSERT_TRUE(Parse(
"--:class(arg)--;"));
2345 ASSERT_TRUE(Parse(
"++:class(arg)++;;"));
2346 ASSERT_TRUE(Parse(
"ns:: --:class--;"));
2347 ASSERT_TRUE(Parse(
"ns:: --:class--;;"));
2348 ASSERT_TRUE(Parse(
"ns::ns:: --:class--;"));
2349 ASSERT_TRUE(Parse(
"ns::ns:: --:class--;;"));
2350 ASSERT_TRUE(Parse(
":: --:class--;"));
2351 ASSERT_TRUE(Parse(
":: --:class--;;"));
2352 ASSERT_TRUE(Parse(
"::ns --:class--;"));
2353 ASSERT_TRUE(Parse(
"::ns --:class--;;"));
2354 ASSERT_TRUE(Parse(
"::ns:: --:class--;"));
2355 ASSERT_TRUE(Parse(
"::ns:: --:class--;;"));
2357 ASSERT_TRUE(Parse(
"++;"));
2358 ASSERT_TRUE(Parse(
"++;;"));
2359 ASSERT_TRUE(Parse(
"ns:: ++;"));
2360 ASSERT_TRUE(Parse(
"ns:: ++;;"));
2361 ASSERT_TRUE(Parse(
"ns::ns:: ++;"));
2362 ASSERT_TRUE(Parse(
"ns::ns:: ++;;"));
2363 ASSERT_TRUE(Parse(
":: ++;"));
2364 ASSERT_TRUE(Parse(
":: ++;;"));
2365 ASSERT_TRUE(Parse(
"::ns ++;"));
2366 ASSERT_TRUE(Parse(
"::ns ++;;"));
2367 ASSERT_TRUE(Parse(
"::ns:: ++;"));
2368 ASSERT_TRUE(Parse(
"::ns:: ++;;"));
2369 ASSERT_TRUE(Parse(
"++_++;"));
2370 ASSERT_TRUE(Parse(
"++_++;;"));
2371 ASSERT_TRUE(Parse(
"++ eval ++;"));
2372 ASSERT_TRUE(Parse(
"++eval++;;"));
2373 ASSERT_TRUE(Parse(
"++eval()++;"));
2374 ASSERT_TRUE(Parse(
"++ eval() ++;;"));
2375 ASSERT_TRUE(Parse(
"++0++;"));
2376 ASSERT_TRUE(Parse(
"++0++;;"));
2377 ASSERT_TRUE(Parse(
"++ 0.1 ++;"));
2378 ASSERT_TRUE(Parse(
"++ 0.1 ++;;"));
2379 ASSERT_TRUE(Parse(
"++[0,]++;"));
2380 ASSERT_TRUE(Parse(
"++(0,)++;;"));
2381 ASSERT_TRUE(Parse(
"++(0,1,2,3,):Class++;;"));
2382 ASSERT_TRUE(Parse(
"++(0,2,3,) :Class ++;;"));
2383 ASSERT_TRUE(Parse(
"++(0,)++;;"));
2384 ASSERT_TRUE(Parse(
"++:Class(var)++;"));
2385 ASSERT_TRUE(Parse(
"++:Class[0](1)++;"));
2386 ASSERT_TRUE(Parse(
"++call()++;"));
2387 ASSERT_TRUE(Parse(
"++call()++;;"));
2388 ASSERT_TRUE(Parse(
"++call(arg)++;"));
2389 ASSERT_TRUE(Parse(
"++call(arg)++;;"));
2390 ASSERT_TRUE(Parse(
"++:class++;"));
2391 ASSERT_TRUE(Parse(
"++:class++;;"));
2392 ASSERT_TRUE(Parse(
"++:class()++;"));
2393 ASSERT_TRUE(Parse(
"++:class()++;;"));
2394 ASSERT_TRUE(Parse(
"++:class(arg)++;"));
2395 ASSERT_TRUE(Parse(
"++:class(arg)++;;"));
2396 ASSERT_TRUE(Parse(
"ns:: ++:class++;"));
2397 ASSERT_TRUE(Parse(
"ns:: ++:class++;;"));
2398 ASSERT_TRUE(Parse(
"ns::ns:: ++:class++;"));
2399 ASSERT_TRUE(Parse(
"ns::ns:: ++:class++;;"));
2400 ASSERT_TRUE(Parse(
":: ++:class++;"));
2401 ASSERT_TRUE(Parse(
":: ++:class++;;"));
2402 ASSERT_TRUE(Parse(
"::ns ++:class++;"));
2403 ASSERT_TRUE(Parse(
"::ns ++:class++;;"));
2404 ASSERT_TRUE(Parse(
"::ns:: ++:class++;"));
2405 ASSERT_TRUE(Parse(
"::ns:: ++:class++;;"));
2407 ASSERT_TRUE(Parse(
"+-;"));
2408 ASSERT_TRUE(Parse(
"+-;;"));
2409 ASSERT_TRUE(Parse(
"ns:: +-;"));
2410 ASSERT_TRUE(Parse(
"ns:: +-;;"));
2411 ASSERT_TRUE(Parse(
"ns::ns:: +-;"));
2412 ASSERT_TRUE(Parse(
"ns::ns:: +-;;"));
2413 ASSERT_TRUE(Parse(
":: +-;"));
2414 ASSERT_TRUE(Parse(
":: +-;;"));
2415 ASSERT_TRUE(Parse(
"::ns +-;"));
2416 ASSERT_TRUE(Parse(
"::ns +-;;"));
2417 ASSERT_TRUE(Parse(
"::ns:: +-;"));
2418 ASSERT_TRUE(Parse(
"::ns:: +-;;"));
2419 ASSERT_TRUE(Parse(
"ns:: +-:class+-;"));
2420 ASSERT_TRUE(Parse(
"ns:: +-:class+-;;"));
2421 ASSERT_TRUE(Parse(
"ns::ns:: +-:class+-;"));
2422 ASSERT_TRUE(Parse(
"ns::ns:: +-:class+-;;"));
2423 ASSERT_TRUE(Parse(
":: +-:class+-;"));
2424 ASSERT_TRUE(Parse(
":: +-:class+-;;"));
2425 ASSERT_TRUE(Parse(
"::ns +-:class+-;"));
2426 ASSERT_TRUE(Parse(
"::ns +-:class+-;;"));
2427 ASSERT_TRUE(Parse(
"::ns:: +-:class+-;"));
2428 ASSERT_TRUE(Parse(
"::ns:: +-:class+-;;"));
2430 ASSERT_TRUE(Parse(
"-+;"));
2431 ASSERT_TRUE(Parse(
"-+;;"));
2432 ASSERT_TRUE(Parse(
"ns:: -+;"));
2433 ASSERT_TRUE(Parse(
"ns:: -+;;"));
2434 ASSERT_TRUE(Parse(
"ns::ns:: -+;"));
2435 ASSERT_TRUE(Parse(
"ns::ns:: -+;;"));
2436 ASSERT_TRUE(Parse(
":: -+;"));
2437 ASSERT_TRUE(Parse(
":: -+;;"));
2438 ASSERT_TRUE(Parse(
"::ns -+;"));
2439 ASSERT_TRUE(Parse(
"::ns -+;;"));
2440 ASSERT_TRUE(Parse(
"::ns:: -+;"));
2441 ASSERT_TRUE(Parse(
"::ns:: -+;;"));
2442 ASSERT_TRUE(Parse(
"ns:: -+:class-+;"));
2443 ASSERT_TRUE(Parse(
"ns:: -+:class-+;;"));
2444 ASSERT_TRUE(Parse(
"ns::ns:: -+:class-+;"));
2445 ASSERT_TRUE(Parse(
"ns::ns:: -+:class-+;;"));
2446 ASSERT_TRUE(Parse(
":: -+:class-+;"));
2447 ASSERT_TRUE(Parse(
":: -+:class-+;;"));
2448 ASSERT_TRUE(Parse(
"::ns -+:class-+;"));
2449 ASSERT_TRUE(Parse(
"::ns -+:class-+;;"));
2450 ASSERT_TRUE(Parse(
"::ns:: -+:class-+;"));
2451 ASSERT_TRUE(Parse(
"::ns:: -+:class-+;;"));
2456TEST_F(ParserTest, Docs) {
2457 ASSERT_TRUE(Parse(
"/** doc */ { }"));
2458 ASSERT_TRUE(Parse(
"/// \n{ }"));
2459 ASSERT_TRUE(Parse(
"{ ///< doc\n }"));
2461 ASSERT_TRUE(Parse(
"/** doc\n\n */\n value := { };"));
2462 ASSERT_TRUE(Parse(
"/// doc1 \n/// doc2\n value := { };"));
2463 ASSERT_TRUE(Parse(
"value := 100; ///< doc"));
2464 ASSERT_TRUE(Parse(
"value := 100; ///< doc\n"));
2467TEST_F(ParserTest, HelloWorld) {
2468 ASSERT_TRUE(Parse(
"hello(str=\"\") := { printf(format:FmtChar, ...):Int32 := Pointer('printf'); printf('%s', $1); $str;};"));
2472TEST_F(ParserTest, Class) {
2473 EXPECT_TRUE(Parse(
":Name := :Class(){};"));
2474 EXPECT_TRUE(Parse(
":Name := :_(){ filed1 = 1; };"));
2475 EXPECT_TRUE(Parse(
":Name := ns::Class(){ filed1 := 1; filed1 ::= 2; };"));
2476 EXPECT_TRUE(Parse(
":Name := ::(){ func = {};};"));
2477 EXPECT_TRUE(Parse(
":Name := :Class(){ func1 := {}; func2 ::= {};};"));
2478 EXPECT_TRUE(Parse(
"Name := Class(){ func() = {};};"));
2479 EXPECT_TRUE(Parse(
"::Name() := ::Func(){ func1() := {}; func2(arg) ::= {};};"));
2480 EXPECT_TRUE(Parse(
":Name := ::Class(){ func() = {};};"));
2481 EXPECT_TRUE(Parse(
":Name := :Class(args) { func1() := {}; func2(arg) ::= {};};"));
2484 EXPECT_TRUE(Parse(
"Name := :Class(){};"));
2485 EXPECT_TRUE(Parse(
"Name := :_(){ filed1 = 1; };"));
2486 EXPECT_TRUE(Parse(
"::ns::Name := ns::Class(){ filed1 := 1; filed1 ::= 2; };"));
2487 EXPECT_TRUE(Parse(
"Name::ns := ::(){ func = {};};"));
2488 EXPECT_TRUE(Parse(
"Name::ns := :Class(){ func1 := {}; func2 ::= {};};"));
2489 EXPECT_TRUE(Parse(
"::Name := Class(){ func() = {};};"));
2490 EXPECT_TRUE(Parse(
"::Name() := ::Func(){ func1() := {}; .func2(arg) ::= {};};"));
2491 EXPECT_TRUE(Parse(
"::Name := ::Class(){ func() = {};};"));
2492 EXPECT_TRUE(Parse(
"::Name := :Class(args) { func1() := {}; func2(arg) ::= {};};"));
2494 EXPECT_TRUE(Parse(
"Name() := :Class(), Class(){};"));
2495 EXPECT_TRUE(Parse(
"Name() := :_(), Class(), Class(){ .filed1 = 1; };"));
2496 EXPECT_TRUE(Parse(
"::ns::Name() := ns::Class(), Class(), Class(){ filed1 := 1; filed1 ::= 2; };"));
2497 EXPECT_TRUE(Parse(
"Name::ns() := ::(), Class(){ func = {};};"));
2498 EXPECT_TRUE(Parse(
"Name::ns() := :Class(), Class(), Class(), Class(){ func1 := {}; func2 ::= {};};"));
2499 EXPECT_TRUE(Parse(
"::Name() := Class(), Class(), Class(), Class(){ func() = {};};"));
2500 EXPECT_TRUE(Parse(
"{ ::Name() := ::Func(), ns::ns::Class(){ func1() := {}; func2(arg) ::= {};}; }"));
2501 EXPECT_TRUE(Parse(
"ns { ::Name() := ::Class(), Class(){ func() = {};}; }"));
2502 EXPECT_TRUE(Parse(
"ns::ns{ ::Name() := Class(args), ns::Class(), ::ns::Class() { :func1() := {}; func2(arg) ::= {};};}"));
2504 EXPECT_TRUE(Parse(
"ns::ns::Name:: :func1()"));
2505 EXPECT_TRUE(Parse(
":: :func1"));
2506 EXPECT_TRUE(Parse(
"::ns::ns::Name:: :func1 := {}"));
2509TEST_F(ParserTest,
Module) {
2510 ASSERT_TRUE(Parse(
"\\module(func)"));
2511 ASSERT_TRUE(Parse(
"\\\\dir\\module(func)"));
2512 ASSERT_TRUE(Parse(
"\\dir\\dir\\module(func)"));
2526 ASSERT_TRUE(Parse(
"\\module (name=func, name=func2, name=::func3)"));
2527 ASSERT_TRUE(Parse(
"\\\\dir\\module (name=ns::func, name='')"));
2528 ASSERT_TRUE(Parse(
"\\dir\\dir\\module (name=::ns::func, name=_)"));
2530 ASSERT_TRUE(Parse(
"\\module::var"));
2531 ASSERT_TRUE(Parse(
"\\module::ns::var"));
2532 ASSERT_TRUE(Parse(
"\\\\module::ns::func()"));
2534 ASSERT_TRUE(Parse(
"\\\\dir\\module::var"));
2535 ASSERT_TRUE(Parse(
"\\dir\\dir\\module::ns::var"));
2536 ASSERT_TRUE(Parse(
"\\dir\\dir\\dir\\module::ns::func()"));
2542TEST_F(ParserTest, SkipBrackets) {
2548 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 0));
2549 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 1));
2551 buffer.push_back(Term::Create(parser::token_type::NAME, TermID::NAME,
"name"));
2553 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 0));
2554 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 1));
2556 buffer.push_back(Term::Create(parser::token_type::SYMBOL, TermID::SYMBOL,
"("));
2557 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 0));
2558 ASSERT_ANY_THROW(Parser::SkipBrackets(buffer, 1));
2560 buffer.push_back(Term::Create(parser::token_type::SYMBOL, TermID::SYMBOL,
")"));
2561 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 0));
2562 ASSERT_EQ(2, Parser::SkipBrackets(buffer, 1));
2563 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 2));
2566 buffer.insert(buffer.begin(), Term::Create(parser::token_type::NAME, TermID::NAME,
"first"));
2568 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 0));
2569 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 1));
2571 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 0));
2572 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 1));
2573 ASSERT_EQ(2, Parser::SkipBrackets(buffer, 2));
2574 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 3));
2577 buffer.insert(buffer.end() - 1, Term::Create(parser::token_type::SYMBOL, TermID::SYMBOL,
"..."));
2578 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 0));
2579 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 1));
2580 ASSERT_EQ(3, Parser::SkipBrackets(buffer, 2));
2581 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 3));
2582 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 4));
2583 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 5));
2585 buffer.insert(buffer.end() - 1, Term::Create(parser::token_type::NAME, TermID::NAME,
"name"));
2586 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 0));
2587 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 1));
2588 ASSERT_EQ(4, Parser::SkipBrackets(buffer, 2));
2589 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 3));
2590 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 4));
2591 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 5));
2592 ASSERT_EQ(0, Parser::SkipBrackets(buffer, 6));
2596TEST_F(ParserTest, MacroCreate) {
2597 MacroPtr macro = std::make_shared<Macro>();
2600 term = Parse(
"@@ name @@ := macro", macro)
2603 ASSERT_TRUE(term->Left()) << term->toString();
2604 ASSERT_TRUE(term->Right()) << term->toString();
2607 term = Parse(
"{ @@ name @@ := macro }", macro)
2610 term = Parse(
"{+ @@ name @@ := macro +}", macro)
2614TEST_F(ParserTest, DISABLED_Convert) {
2615 std::vector<const char *> list = {
2616 "brother(human!, human!)?;",
2617 "func(arg1, arg2 = 5) :- { ($arg1 < $2) -> {% return $arg1; %}, [...] --> {% return *$1 * *$2; %}; };",
2618 "func_sum(arg1, arg2) :- {$arg1 + $arg2;};",
2621 for (
size_t i = 0; i < list.size(); i++) {
2623 parser.
Parse(list[i]);
2624 ) <<
"FROM: " << list[i];
2625 std::string to_str = parser.
GetAst()->toString() +
";";
2627 parser.
Parse(to_str);
2628 ) <<
"CONVERT: " << to_str;
TermPtr Parse(const std::string str, bool expand_module=false)
std::shared_ptr< Term > TermPtr
std::shared_ptr< Macro > MacroPtr
std::vector< TermPtr > BlockType
std::shared_ptr< Diag > DiagPtr
const char * toString(TermID type)
bool isDefaultType(const TermPtr &term)
std::string & trim(std::string &s, const char *t=ws)