4#include <gtest/gtest.h>
163 ASSERT_STREQ(
"name",
ExtractName(
"::name").c_str());
164 ASSERT_STREQ(
"name",
ExtractName(
"ns::name").c_str());
166 ASSERT_STREQ(
"",
ExtractName(
"\\\\dir.file").c_str());
167 ASSERT_STREQ(
"var",
ExtractName(
"\\dir.file::var").c_str());
168 ASSERT_STREQ(
"var.field",
ExtractName(
"\\\\dir.file::var.field").c_str());
174 ASSERT_STREQ(
"\\\\dir.file",
ExtractModuleName(
"\\\\dir.file::var.field").c_str());
185TEST(Ast, ScopeStack) {
188 ScopeStack ns_stack(storage);
189 ASSERT_EQ(ns_stack.m_static, storage);
191 ASSERT_STREQ(
"::name1::", ns_stack.CreateVarName(
"::name1").c_str());
192 ASSERT_STREQ(
"name1$", ns_stack.CreateVarName(
"name1").c_str());
193 ASSERT_STREQ(
"name1$", ns_stack.CreateVarName(
"$name1").c_str());
194 ASSERT_STREQ(
"name1:::", ns_stack.CreateVarName(
":name1").c_str());
196 ASSERT_STREQ(
"Storage: \n", ns_stack.Dump().c_str());
197 ns_stack.PushScope(
nullptr);
199 ASSERT_STREQ(
"::name1::", ns_stack.CreateVarName(
"::name1").c_str());
200 ASSERT_STREQ(
"1::name1$", ns_stack.CreateVarName(
"name1").c_str());
201 ASSERT_STREQ(
"1::name1$", ns_stack.CreateVarName(
"$name1").c_str());
202 ASSERT_STREQ(
"name1:::", ns_stack.CreateVarName(
":name1").c_str());
204 ns_stack.back().vars.insert({
"name1", Term::Create(parser::token_type::NAME, TermID::NAME,
"term_name1")});
205 ns_stack.back().vars.insert({
"name2", Term::Create(parser::token_type::NAME, TermID::NAME,
"term_name2")});
207 ns_stack.PushScope(Term::Create(parser::token_type::NAME, TermID::NAME,
"ns"));
208 ns_stack.back().vars.insert({
"name3", Term::Create(parser::token_type::NAME, TermID::NAME,
"term_name3")});
210 ASSERT_STREQ(
"::name1::", ns_stack.CreateVarName(
"::name1").c_str());
211 ASSERT_STREQ(
"1::ns::name1$", ns_stack.CreateVarName(
"name1").c_str());
212 ASSERT_STREQ(
"1::ns::name1$", ns_stack.CreateVarName(
"$name1").c_str());
213 ASSERT_STREQ(
"ns::name1:::", ns_stack.CreateVarName(
":name1").c_str());
216 storage.insert({
"name4", Term::Create(parser::token_type::NAME, TermID::NAME,
"term_name4")});
217 storage.insert({
"name5", Term::Create(parser::token_type::NAME, TermID::NAME,
"term_name5")});
219 ASSERT_STREQ(
"Storage: name4, name5\nStack [1::]: name1, name2\nStack [ns::]: name3\n", ns_stack.Dump().c_str());
224 ASSERT_EQ(0, ns_stack.size());
225 ASSERT_STREQ(
"", ns_stack.GetNamespace().c_str());
227 ASSERT_FALSE(ns_stack.LookupName(
"name1"));
228 ASSERT_FALSE(ns_stack.LookupName(
"$name1"));
229 ASSERT_FALSE(ns_stack.LookupName(
"::name1"));
231 TermPtr name1 = Term::Create(parser::token_type::NAME, TermID::NAME,
"name1");
232 ASSERT_EQ(0, storage.size()) << ns_stack.Dump();
233 ASSERT_TRUE(storage.find(
"$name1") == storage.end()) << ns_stack.Dump();
235 name1->m_int_name = ns_stack.CreateVarName(name1->m_text);
236 ASSERT_TRUE(ns_stack.AddName(name1)) << ns_stack.Dump();
238 ASSERT_EQ(0, ns_stack.size());
239 ASSERT_EQ(1, storage.size()) << ns_stack.Dump();
240 ASSERT_TRUE(storage.find(
"name1$") != storage.end()) << ns_stack.Dump();
242 ASSERT_STREQ(
"name1$", name1->m_int_name.c_str());
244 ASSERT_TRUE(temp1 = ns_stack.LookupName(
"name1")) << ns_stack.Dump();
245 ASSERT_EQ(temp1.get(), name1.get());
246 ASSERT_TRUE(temp1 = ns_stack.LookupName(
"$name1")) << ns_stack.Dump();
247 ASSERT_EQ(temp1.get(), name1.get());
248 ASSERT_FALSE(ns_stack.LookupName(
"::name1")) << ns_stack.Dump();
251 ns_stack.PushScope(Term::Create(parser::token_type::NAMESPACE, TermID::NAMESPACE,
"name"));
252 ASSERT_EQ(1, ns_stack.size());
253 ASSERT_STREQ(
"name::", ns_stack.GetNamespace().c_str());
256 ASSERT_STREQ(
"::name1::", ns_stack.CreateVarName(
"::name1").c_str());
257 ASSERT_STREQ(
"name::name1$", ns_stack.CreateVarName(
"name1").c_str());
258 ASSERT_STREQ(
"name::name1$", ns_stack.CreateVarName(
"$name1").c_str());
259 ASSERT_STREQ(
"name::name1:::", ns_stack.CreateVarName(
":name1").c_str());
262 TermPtr name2 = Term::Create(parser::token_type::NAME, TermID::NAME,
"name2");
263 ASSERT_EQ(1, ns_stack.size()) << ns_stack.Dump();
264 ASSERT_EQ(1, storage.size()) << ns_stack.Dump();
265 ASSERT_TRUE(storage.find(
"$name2") == storage.end()) << ns_stack.Dump();
266 ASSERT_TRUE(ns_stack[0].vars.find(
"$name2") == ns_stack[0].vars.end()) << ns_stack.Dump();
268 name2->m_int_name = ns_stack.CreateVarName(name2->m_text);
269 ASSERT_TRUE(ns_stack.AddName(name2)) << ns_stack.Dump();
271 ASSERT_STREQ(
"name2", name2->m_text.c_str());
273 ASSERT_TRUE(temp2 = ns_stack.LookupName(
"name2")) << ns_stack.Dump();
274 ASSERT_EQ(temp2.get(), name2.get());
275 ASSERT_TRUE(temp2 = ns_stack.LookupName(
"$name2")) << ns_stack.Dump();
276 ASSERT_EQ(temp2.get(), name2.get());
277 ASSERT_FALSE(ns_stack.LookupName(
"::name2")) << ns_stack.Dump();
280 ASSERT_TRUE(temp = ns_stack.LookupName(
"name1")) << ns_stack.Dump();
281 ASSERT_EQ(temp.get(), name1.get());
282 ASSERT_TRUE(temp = ns_stack.LookupName(
"$name1")) << ns_stack.Dump();
283 ASSERT_EQ(temp.get(), name1.get());
287 ns_stack.PushScope(
nullptr);
288 ASSERT_EQ(2, ns_stack.size());
290 ASSERT_STREQ(
"::name1::", ns_stack.CreateVarName(
"::name1").c_str());
291 ASSERT_STREQ(
"name::2::name1$", ns_stack.CreateVarName(
"name1").c_str());
292 ASSERT_STREQ(
"name::2::name1$", ns_stack.CreateVarName(
"$name1").c_str());
293 ASSERT_STREQ(
"name::name1:::", ns_stack.CreateVarName(
":name1").c_str());
296 TermPtr name3 = Term::Create(parser::token_type::NAME, TermID::NAME,
"$name3");
297 ASSERT_EQ(2, ns_stack.size()) << ns_stack.Dump();
298 ASSERT_EQ(2, storage.size()) << ns_stack.Dump();
299 ASSERT_TRUE(ns_stack[1].vars.find(
"$name3") == ns_stack[1].vars.end()) << ns_stack.Dump();
301 name3->m_int_name = ns_stack.CreateVarName(name3->m_text);
302 ASSERT_TRUE(ns_stack.AddName(name3)) << ns_stack.Dump();
304 ASSERT_STREQ(
"$name3", name3->m_text.c_str());
306 ASSERT_TRUE(temp3 = ns_stack.LookupName(
"name3")) << ns_stack.Dump();
307 ASSERT_EQ(temp3.get(), name3.get());
308 ASSERT_TRUE(temp3 = ns_stack.LookupName(
"$name3")) << ns_stack.Dump();
309 ASSERT_EQ(temp3.get(), name3.get());
310 ASSERT_FALSE(ns_stack.LookupName(
"::name3")) << ns_stack.Dump();
312 ASSERT_TRUE(temp = ns_stack.LookupName(
"name1")) << ns_stack.Dump();
313 ASSERT_EQ(temp.get(), name1.get());
314 ASSERT_TRUE(temp = ns_stack.LookupName(
"$name1")) << ns_stack.Dump();
315 ASSERT_EQ(temp.get(), name1.get());
317 ASSERT_TRUE(temp = ns_stack.LookupName(
"name2")) << ns_stack.Dump();
318 ASSERT_EQ(temp.get(), name2.get());
319 ASSERT_TRUE(temp = ns_stack.LookupName(
"$name2")) << ns_stack.Dump();
320 ASSERT_EQ(temp.get(), name2.get());
324 ns_stack.PushScope(Term::Create(parser::token_type::NAMESPACE, TermID::NAMESPACE,
"name2"));
325 ASSERT_EQ(3, ns_stack.size());
326 ASSERT_STREQ(
"name::2::name2::", ns_stack.GetNamespace(
false).c_str());
327 ASSERT_STREQ(
"name::name2::", ns_stack.GetNamespace(
true).c_str());
329 ASSERT_STREQ(
"::name1::", ns_stack.CreateVarName(
"::name1").c_str());
330 ASSERT_STREQ(
"name::2::name2::name1$", ns_stack.CreateVarName(
"name1").c_str());
331 ASSERT_STREQ(
"name::2::name2::name1$", ns_stack.CreateVarName(
"$name1").c_str());
332 ASSERT_STREQ(
"name::name2::name1:::", ns_stack.CreateVarName(
":name1").c_str());
334 TermPtr name4 = Term::Create(parser::token_type::NAME, TermID::NAME,
"name4");
335 ASSERT_EQ(3, ns_stack.size()) << ns_stack.Dump();
336 ASSERT_EQ(3, storage.size()) << ns_stack.Dump();
337 ASSERT_TRUE(ns_stack[2].vars.find(
"$name4") == ns_stack[2].vars.end()) << ns_stack.Dump();
339 name4->m_int_name = ns_stack.CreateVarName(name4->m_text);
340 ASSERT_TRUE(ns_stack.AddName(name4)) << ns_stack.Dump();
342 ASSERT_TRUE(temp = ns_stack.LookupName(
"name4")) << ns_stack.Dump();
343 ASSERT_EQ(temp.get(), name4.get()) << ns_stack.Dump();
344 ASSERT_TRUE(temp = ns_stack.LookupName(
"$name4")) << ns_stack.Dump();
345 ASSERT_EQ(temp.get(), name4.get()) << ns_stack.Dump();
347 ASSERT_TRUE(temp = ns_stack.LookupName(
"name1")) << ns_stack.Dump();
348 ASSERT_EQ(temp.get(), name1.get()) << ns_stack.Dump();
349 ASSERT_TRUE(temp = ns_stack.LookupName(
"$name1")) << ns_stack.Dump();
350 ASSERT_EQ(temp.get(), name1.get()) << ns_stack.Dump();
352 ASSERT_TRUE(temp = ns_stack.LookupName(
"name2")) << ns_stack.Dump();
353 ASSERT_EQ(temp.get(), name2.get()) << temp->toString() <<
" " << name2->toString() <<
" " << ns_stack.Dump();
354 ASSERT_TRUE(temp = ns_stack.LookupName(
"$name2")) << ns_stack.Dump();
355 ASSERT_EQ(temp.get(), name2.get()) << ns_stack.Dump();
357 ASSERT_TRUE(temp = ns_stack.LookupName(
"name3")) << ns_stack.Dump();
358 ASSERT_EQ(temp.get(), name3.get()) << ns_stack.Dump();
359 ASSERT_TRUE(temp = ns_stack.LookupName(
"$name3")) << ns_stack.Dump();
360 ASSERT_EQ(temp.get(), name3.get()) << ns_stack.Dump();
365 ns_stack.PushScope(Term::Create(parser::token_type::NAMESPACE, TermID::NAMESPACE,
"name3::name4"));
366 ASSERT_EQ(4, ns_stack.size());
367 ASSERT_STREQ(
"name::2::name2::name3::name4::", ns_stack.GetNamespace().c_str());
369 ASSERT_STREQ(
"::name1::", ns_stack.CreateVarName(
"::name1").c_str());
370 ASSERT_STREQ(
"name::2::name2::name3::name4::name1$", ns_stack.CreateVarName(
"name1").c_str());
371 ASSERT_STREQ(
"name::2::name2::name3::name4::name1$", ns_stack.CreateVarName(
"$name1").c_str());
372 ASSERT_STREQ(
"name::name2::name3::name4::name1:::", ns_stack.CreateVarName(
":name1").c_str());
375 ns_stack.PushScope(Term::Create(parser::token_type::NAMESPACE, TermID::NAMESPACE,
"::"));
376 ASSERT_EQ(5, ns_stack.size());
377 ASSERT_STREQ(
"::", ns_stack.GetNamespace(
false).c_str());
378 ASSERT_STREQ(
"::", ns_stack.GetNamespace(
true).c_str());
381 ASSERT_STREQ(
"::name1::", ns_stack.CreateVarName(
"::name1").c_str());
382 ASSERT_STREQ(
"::name1$", ns_stack.CreateVarName(
"name1").c_str());
383 ASSERT_STREQ(
"::name1$", ns_stack.CreateVarName(
"$name1").c_str());
384 ASSERT_STREQ(
"::name1:::", ns_stack.CreateVarName(
":name1").c_str());
387 ns_stack.PushScope(
nullptr);
388 ASSERT_EQ(6, ns_stack.size());
390 ASSERT_STREQ(
"::3::", ns_stack.GetNamespace(
false).c_str());
391 ASSERT_STREQ(
"::", ns_stack.GetNamespace(
true).c_str());
393 ASSERT_STREQ(
"::name1::", ns_stack.CreateVarName(
"::name1").c_str());
394 ASSERT_STREQ(
"::3::name1$", ns_stack.CreateVarName(
"name1").c_str());
395 ASSERT_STREQ(
"::3::name1$", ns_stack.CreateVarName(
"$name1").c_str());
396 ASSERT_STREQ(
"::name1:::", ns_stack.CreateVarName(
":name1").c_str());
399 TermPtr name_g = Term::Create(parser::token_type::NAME, TermID::NAME,
"@::name_g");
400 ASSERT_EQ(6, ns_stack.size()) << ns_stack.Dump();
401 ASSERT_EQ(4, storage.size()) << ns_stack.Dump();
402 ASSERT_TRUE(storage.find(
"::name_g") == storage.end()) << ns_stack.Dump();
403 ASSERT_TRUE(ns_stack[5].vars.find(
"$name4") == ns_stack[5].vars.end()) << ns_stack.Dump();
405 name_g->m_int_name = ns_stack.CreateVarName(name_g->m_text);
406 ASSERT_TRUE(ns_stack.AddName(name_g)) << ns_stack.Dump();
408 ASSERT_EQ(5, storage.size()) << ns_stack.Dump();
409 ASSERT_TRUE(storage.find(
"::3::name_g::") != storage.end()) << ns_stack.Dump();
410 ASSERT_TRUE(ns_stack[5].vars.find(
"::3::name_g::") != ns_stack[5].vars.end()) << ns_stack.Dump();
412 ASSERT_STREQ(
"::3::name_g::", name_g->m_int_name.c_str());
414 ASSERT_TRUE(temp = ns_stack.LookupName(
"name_g")) << ns_stack.Dump();
415 ASSERT_EQ(temp.get(), name_g.get());
416 ASSERT_FALSE(temp = ns_stack.LookupName(
"$name_g")) << ns_stack.Dump();
417 ASSERT_FALSE(ns_stack.LookupName(
"::name_g")) << ns_stack.Dump();
418 ASSERT_TRUE(temp = ns_stack.LookupName(
"@::name_g")) << ns_stack.Dump();
419 ASSERT_EQ(temp.get(), name_g.get());
421 ASSERT_TRUE(temp = ns_stack.LookupName(
"name1")) << ns_stack.Dump();
422 ASSERT_EQ(temp.get(), name1.get());
423 ASSERT_TRUE(temp = ns_stack.LookupName(
"$name1")) << ns_stack.Dump();
424 ASSERT_EQ(temp.get(), name1.get());
426 ASSERT_TRUE(temp = ns_stack.LookupName(
"name2")) << ns_stack.Dump();
427 ASSERT_EQ(temp.get(), name2.get());
428 ASSERT_TRUE(temp = ns_stack.LookupName(
"$name2")) << ns_stack.Dump();
429 ASSERT_EQ(temp.get(), name2.get());
431 ASSERT_TRUE(temp = ns_stack.LookupName(
"name3")) << ns_stack.Dump();
432 ASSERT_EQ(temp.get(), name3.get());
433 ASSERT_TRUE(temp = ns_stack.LookupName(
"$name3")) << ns_stack.Dump();
434 ASSERT_EQ(temp.get(), name3.get());
436 ASSERT_TRUE(temp = ns_stack.LookupName(
"name_g")) << ns_stack.Dump();
437 ASSERT_EQ(temp.get(), name_g.get());
438 ASSERT_FALSE(temp = ns_stack.LookupName(
"$name_g")) << ns_stack.Dump();
439 ASSERT_FALSE(temp = ns_stack.LookupName(
"::name_g")) << ns_stack.Dump();
440 ASSERT_TRUE(temp = ns_stack.LookupName(
"@::name_g")) << ns_stack.Dump();
441 ASSERT_EQ(temp.get(), name_g.get());
448 ns_stack.PushScope(Term::Create(parser::token_type::NAMESPACE, TermID::NAMESPACE,
"::name5::name6"));
449 ASSERT_EQ(7, ns_stack.size());
450 ASSERT_STREQ(
"::name5::name6::", ns_stack.GetNamespace().c_str());
453 ns_stack.PushScope(Term::Create(parser::token_type::NAMESPACE, TermID::NAMESPACE,
"::"));
454 ASSERT_STREQ(
"::", ns_stack.GetNamespace().c_str());
457 ns_stack.PushScope(Term::Create(parser::token_type::NAMESPACE, TermID::NAMESPACE,
"name7"));
458 ASSERT_EQ(9, ns_stack.size());
459 ASSERT_STREQ(
"::name7::", ns_stack.GetNamespace().c_str());
464 ASSERT_EQ(7, ns_stack.size());
465 ASSERT_STREQ(
"::name5::name6::", ns_stack.GetNamespace().c_str());
469 ASSERT_EQ(6, ns_stack.size());
470 ASSERT_STREQ(
"::", ns_stack.GetNamespace(
true).c_str()) << ns_stack.Dump();
471 ASSERT_STREQ(
"::3::", ns_stack.GetNamespace(
false).c_str()) << ns_stack.Dump();
475 ASSERT_EQ(5, ns_stack.size());
476 ASSERT_STREQ(
"::", ns_stack.GetNamespace(
true).c_str()) << ns_stack.Dump();
477 ASSERT_STREQ(
"::", ns_stack.GetNamespace(
false).c_str()) << ns_stack.Dump();
481 ASSERT_EQ(4, ns_stack.size());
482 ASSERT_STREQ(
"name::name2::name3::name4::", ns_stack.GetNamespace(
true).c_str());
483 ASSERT_STREQ(
"name::2::name2::name3::name4::", ns_stack.GetNamespace(
false).c_str());
487 ASSERT_EQ(3, ns_stack.size());
488 ASSERT_STREQ(
"name::name2::", ns_stack.GetNamespace(
true).c_str());
489 ASSERT_STREQ(
"name::2::name2::", ns_stack.GetNamespace(
false).c_str());
493 ASSERT_EQ(2, ns_stack.size());
494 ASSERT_STREQ(
"name::", ns_stack.GetNamespace(
true).c_str());
495 ASSERT_STREQ(
"name::2::", ns_stack.GetNamespace(
false).c_str());
500 ASSERT_EQ(1, ns_stack.size());
501 ASSERT_STREQ(
"name::", ns_stack.GetNamespace(
true).c_str());
502 ASSERT_STREQ(
"name::", ns_stack.GetNamespace(
false).c_str());
506 ASSERT_EQ(0, ns_stack.size());
507 ASSERT_STREQ(
"", ns_stack.GetNamespace(
true).c_str());
508 ASSERT_STREQ(
"", ns_stack.GetNamespace(
false).c_str());
511 ns_stack.PushScope(Term::Create(parser::token_type::NAMESPACE, TermID::NAMESPACE,
"ns::name"));
512 ASSERT_EQ(1, ns_stack.size());
513 ASSERT_STREQ(
"ns::name::", ns_stack.GetNamespace().c_str());
517 ns_stack.PushScope(Term::Create(parser::token_type::NAMESPACE, TermID::NAMESPACE,
"::"));
518 ASSERT_EQ(2, ns_stack.size());
519 ASSERT_STREQ(
"::", ns_stack.GetNamespace().c_str());
525 ASSERT_EQ(0, ns_stack.size());
529TEST(Ast, AstAnalyze) {
533 JitPtr jit = JIT::Init(*rt);
537 TermPtr ast = jit->GetParser()->Parse(
"var1 ::= '1';");
540 ASSERT_TRUE(analysis.Analyze(ast, ast)) << ast->m_int_vars.Dump();
541 ASSERT_EQ(1, ast->m_int_vars.size());
542 ASSERT_TRUE(ast->m_int_vars.find(
"var1$") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
543 ASSERT_STREQ(
"var1", ast->m_int_vars.find(
"var1$")->second->m_text.c_str());
544 ASSERT_STREQ(
"var1$", ast->m_int_vars.find(
"var1$")->second->m_int_name.c_str());
546 ast = jit->GetParser()->Parse(
"$var2 ::= '1';$var3 ::= '1';");
549 ASSERT_TRUE(analysis.Analyze(ast, ast));
550 ASSERT_EQ(2, ast->m_int_vars.size());
551 ASSERT_TRUE(ast->m_int_vars.find(
"1::var2$") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
552 ASSERT_TRUE(ast->m_int_vars.find(
"1::var3$") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
553 ASSERT_STREQ(
"$var2", ast->m_int_vars.find(
"1::var2$")->second->m_text.c_str());
554 ASSERT_STREQ(
"$var3", ast->m_int_vars.find(
"1::var3$")->second->m_text.c_str());
555 ASSERT_STREQ(
"1::var2$", ast->m_int_vars.find(
"1::var2$")->second->m_int_name.c_str());
556 ASSERT_STREQ(
"1::var3$", ast->m_int_vars.find(
"1::var3$")->second->m_int_name.c_str());
558 ast = jit->GetParser()->Parse(
"$var ::= '1'; $var := '2';");
561 ASSERT_TRUE(analysis.Analyze(ast, ast));
562 ASSERT_EQ(1, ast->m_int_vars.size());
563 ASSERT_TRUE(ast->m_int_vars.find(
"1::var$") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
564 ASSERT_STREQ(
"$var", ast->m_int_vars.find(
"1::var$")->second->m_text.c_str());
565 ASSERT_STREQ(
"1::var$", ast->m_int_vars.find(
"1::var$")->second->m_int_name.c_str());
567 ast = jit->GetParser()->Parse(
"$var := '1'; $var = '2';");
570 ASSERT_TRUE(analysis.Analyze(ast, ast));
571 ASSERT_EQ(1, ast->m_int_vars.size());
572 ASSERT_TRUE(ast->m_int_vars.find(
"1::var$") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
573 ASSERT_STREQ(
"$var", ast->m_int_vars.find(
"1::var$")->second->m_text.c_str());
574 ASSERT_STREQ(
"1::var$", ast->m_int_vars.find(
"1::var$")->second->m_int_name.c_str());
577 ast = jit->GetParser()->Parse(
"$var = '1'; $var := '2';");
579 ASSERT_FALSE(analysis.Analyze(ast, ast));
581 ast = jit->GetParser()->Parse(
"$var ::= '1'; $var ::= '2';");
583 ASSERT_FALSE(analysis.Analyze(ast, ast));
585 ast = jit->GetParser()->Parse(
"$var := 'строка'; $var = 2;");
587 ASSERT_EQ(2, ast->m_block.size());
588 ASSERT_STREQ(
":=", ast->m_block[0]->m_text.c_str());
589 ASSERT_TRUE(ast->m_block[0]->m_left);
590 ASSERT_STREQ(
"$var", ast->m_block[0]->m_left->m_text.c_str());
591 ASSERT_FALSE(ast->m_block[0]->m_left->m_type);
592 ASSERT_TRUE(ast->m_block[0]->m_right);
593 ASSERT_STREQ(
"строка", ast->m_block[0]->m_right->m_text.c_str());
594 ASSERT_TRUE(ast->m_block[0]->m_right->m_type);
595 ASSERT_STREQ(
":StrChar", ast->m_block[0]->m_right->m_type->asTypeString().c_str());
597 ASSERT_STREQ(
"=", ast->m_block[1]->m_text.c_str());
598 ASSERT_TRUE(ast->m_block[1]->m_left);
599 ASSERT_STREQ(
"$var", ast->m_block[1]->m_left->m_text.c_str());
600 ASSERT_FALSE(ast->m_block[1]->m_left->m_type);
601 ASSERT_TRUE(ast->m_block[1]->m_right);
602 ASSERT_STREQ(
"2", ast->m_block[1]->m_right->m_text.c_str());
603 ASSERT_TRUE(ast->m_block[1]->m_right->m_type);
604 ASSERT_STREQ(
":Int8", ast->m_block[1]->m_right->m_type->asTypeString().c_str());
606 ASSERT_FALSE(analysis.Analyze(ast, ast));
608 ast = jit->GetParser()->Parse(
"$var := 2; $var = '';");
610 ASSERT_FALSE(analysis.Analyze(ast, ast));
617 ast = jit->GetParser()->Parse(
"$var := 2; $var = 2222;");
619 ASSERT_TRUE(analysis.Analyze(ast, ast));
620 ASSERT_TRUE(ast->m_int_vars.find(
"1::var$") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
621 ASSERT_STREQ(
":Int16", ast->m_int_vars.find(
"1::var$")->second->GetType()->asTypeString().c_str());
623 ast = jit->GetParser()->Parse(
"$var:Int8 := 2; $var = 2222;");
625 ASSERT_FALSE(analysis.Analyze(ast, ast));
628 ast = jit->GetParser()->Parse(
"$var := 2; $var = 22222222;");
630 ASSERT_TRUE(analysis.Analyze(ast, ast));
631 ASSERT_TRUE(ast->m_int_vars.find(
"1::var$") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
632 ASSERT_STREQ(
":Int32", ast->m_int_vars.find(
"1::var$")->second->GetType()->asTypeString().c_str());
634 ast = jit->GetParser()->Parse(
"$var := 2; $var = 2222222222222;");
636 ASSERT_TRUE(analysis.Analyze(ast, ast));
637 ASSERT_TRUE(ast->m_int_vars.find(
"1::var$") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
638 ASSERT_STREQ(
":Int64", ast->m_int_vars.find(
"1::var$")->second->GetType()->asTypeString().c_str());
640 ast = jit->GetParser()->Parse(
"$var := 2; $var = 2.0;");
642 ASSERT_TRUE(analysis.Analyze(ast, ast));
643 ASSERT_TRUE(ast->m_int_vars.find(
"1::var$") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
644 ASSERT_STREQ(
":Float32", ast->m_int_vars.find(
"1::var$")->second->GetType()->asTypeString().c_str());
652TEST(Ast, Namespace) {
656 JitPtr jit = JIT::Init(*rt);
659 TermPtr ast = jit->GetParser()->Parse(
"$var := 1;");
661 ASSERT_EQ(0, ast->m_int_vars.size());
662 ASSERT_TRUE(analysis.Analyze(ast, ast));
663 ASSERT_EQ(1, ast->m_int_vars.size());
664 ASSERT_TRUE(ast->m_int_vars.find(
"var$") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
665 ASSERT_STREQ(
"$var", ast->m_int_vars.find(
"var$")->second->m_text.c_str());
666 ASSERT_STREQ(
"var$", ast->m_int_vars.find(
"var$")->second->m_int_name.c_str());
668 ast = jit->GetParser()->Parse(
"var := 1;");
670 ASSERT_EQ(0, ast->m_int_vars.size());
671 ASSERT_TRUE(analysis.Analyze(ast, ast));
672 ASSERT_TRUE(ast->m_int_vars.find(
"var$") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
673 ASSERT_STREQ(
"var", ast->m_int_vars.find(
"var$")->second->m_text.c_str());
674 ASSERT_STREQ(
"var$", ast->m_int_vars.find(
"var$")->second->m_int_name.c_str());
677 ast = jit->GetParser()->Parse(
"::ns::var := 1;");
679 ASSERT_EQ(0, ast->m_int_vars.size());
680 ASSERT_TRUE(analysis.Analyze(ast, ast));
681 ASSERT_TRUE(ast->m_int_vars.find(
"::ns::var::") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
682 ASSERT_STREQ(
"::ns::var", ast->m_int_vars.find(
"::ns::var::")->second->m_text.c_str());
683 ASSERT_STREQ(
"::ns::var::", ast->m_int_vars.find(
"::ns::var::")->second->m_int_name.c_str());
685 ast = jit->GetParser()->Parse(
"ns::var := 1;");
687 ASSERT_EQ(0, ast->m_int_vars.size());
688 ASSERT_TRUE(analysis.Analyze(ast, ast));
689 ASSERT_TRUE(ast->m_int_vars.find(
"ns::var::") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
690 ASSERT_STREQ(
"ns::var", ast->m_int_vars.find(
"ns::var::")->second->m_text.c_str());
691 ASSERT_STREQ(
"ns::var::", ast->m_int_vars.find(
"ns::var::")->second->m_int_name.c_str());
694 ast = jit->GetParser()->Parse(
"name { var := 1; }");
696 ASSERT_EQ(0, ast->m_int_vars.size());
697 ASSERT_TRUE(analysis.Analyze(ast, ast));
698 ASSERT_TRUE(ast->m_int_vars.find(
"1::name::var$") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
699 ASSERT_STREQ(
"var", ast->m_int_vars.find(
"1::name::var$")->second->m_text.c_str());
700 ASSERT_STREQ(
"1::name::var$", ast->m_int_vars.find(
"1::name::var$")->second->m_int_name.c_str());
703 ASSERT_EQ(1, ast->m_block.size());
704 ASSERT_STREQ(
":=", ast->m_block[0]->m_text.c_str());
705 ASSERT_TRUE(ast->m_block[0]->m_left);
706 ASSERT_STREQ(
"1::name::var$", ast->m_block[0]->m_left->m_int_name.c_str());
707 ASSERT_TRUE(ast->m_block[0]->m_right);
708 ASSERT_STREQ(
"1", ast->m_block[0]->m_right->m_text.c_str());
710 ast = jit->GetParser()->Parse(
"name:: { var := 1; }");
712 ASSERT_EQ(0, ast->m_int_vars.size());
713 ASSERT_TRUE(analysis.Analyze(ast, ast));
714 ASSERT_TRUE(ast->m_int_vars.find(
"1::name::var$") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
715 ASSERT_STREQ(
"var", ast->m_int_vars.find(
"1::name::var$")->second->m_text.c_str());
716 ASSERT_STREQ(
"1::name::var$", ast->m_int_vars.find(
"1::name::var$")->second->m_int_name.c_str());
718 ast = jit->GetParser()->Parse(
"ns::name:: { var := 1; }");
720 ASSERT_EQ(0, ast->m_int_vars.size());
721 ASSERT_TRUE(analysis.Analyze(ast, ast));
722 ASSERT_TRUE(ast->m_int_vars.find(
"1::ns::name::var$") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
723 ASSERT_STREQ(
"var", ast->m_int_vars.find(
"1::ns::name::var$")->second->m_text.c_str());
724 ASSERT_STREQ(
"1::ns::name::var$", ast->m_int_vars.find(
"1::ns::name::var$")->second->m_int_name.c_str());
726 ast = jit->GetParser()->Parse(
"name:: { ::var := 1; }");
728 ASSERT_EQ(0, ast->m_int_vars.size());
729 ASSERT_TRUE(analysis.Analyze(ast, ast));
730 ASSERT_TRUE(ast->m_int_vars.find(
"::var::") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
731 ASSERT_STREQ(
"::var", ast->m_int_vars.find(
"::var::")->second->m_text.c_str());
732 ASSERT_STREQ(
"::var::", ast->m_int_vars.find(
"::var::")->second->m_int_name.c_str());
734 ast = jit->GetParser()->Parse(
"::name:: { ::ns2::var := 1; }");
736 ASSERT_EQ(0, ast->m_int_vars.size());
737 ASSERT_TRUE(analysis.Analyze(ast, ast));
738 ASSERT_TRUE(ast->m_int_vars.find(
"::ns2::var::") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
739 ASSERT_STREQ(
"::ns2::var", ast->m_int_vars.find(
"::ns2::var::")->second->m_text.c_str());
740 ASSERT_STREQ(
"::ns2::var::", ast->m_int_vars.find(
"::ns2::var::")->second->m_int_name.c_str());
742 ast = jit->GetParser()->Parse(
"name { $var := 1; }");
744 ASSERT_EQ(0, ast->m_int_vars.size());
745 ASSERT_TRUE(analysis.Analyze(ast, ast));
746 ASSERT_TRUE(ast->m_int_vars.find(
"1::name::var$") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
747 ASSERT_STREQ(
"$var", ast->m_int_vars.find(
"1::name::var$")->second->m_text.c_str());
748 ASSERT_STREQ(
"1::name::var$", ast->m_int_vars.find(
"1::name::var$")->second->m_int_name.c_str());
750 ast = jit->GetParser()->Parse(
"name { { $var := 1; } }");
752 ASSERT_EQ(0, ast->m_int_vars.size());
753 ASSERT_TRUE(analysis.Analyze(ast, ast));
754 ASSERT_TRUE(ast->m_int_vars.find(
"1::name::2::var$") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
755 ASSERT_STREQ(
"$var", ast->m_int_vars.find(
"1::name::2::var$")->second->m_text.c_str());
756 ASSERT_STREQ(
"1::name::2::var$", ast->m_int_vars.find(
"1::name::2::var$")->second->m_int_name.c_str());
758 ast = jit->GetParser()->Parse(
"ns{ name { { $var := 1; } } }");
760 ASSERT_EQ(0, ast->m_int_vars.size());
761 ASSERT_TRUE(analysis.Analyze(ast, ast));
762 ASSERT_TRUE(ast->m_int_vars.find(
"1::ns::name::2::var$") != ast->m_int_vars.end()) << ast->m_int_vars.Dump();
763 ASSERT_STREQ(
"$var", ast->m_int_vars.find(
"1::ns::name::2::var$")->second->m_text.c_str());
764 ASSERT_STREQ(
"1::ns::name::2::var$", ast->m_int_vars.find(
"1::ns::name::2::var$")->second->m_int_name.c_str());
768TEST(Ast, Interruption) {
772 JitPtr jit = JIT::Init(*rt);
776 TermPtr ast = jit->GetParser()->Parse(
":: --;");
778 ASSERT_STREQ(
"::", ast->m_namespace->m_text.c_str());
779 ASSERT_TRUE(analysis.Analyze(ast, ast));
780 ASSERT_TRUE(ast->m_namespace);
781 ASSERT_STREQ(
"::", ast->m_namespace->m_text.c_str());
783 ASSERT_NO_THROW(ast = jit->GetParser()->Parse(
"name { name -- };"));
785 ASSERT_EQ(1, ast->m_block.size());
786 ASSERT_STREQ(
"--", ast->m_block[0]->m_text.c_str());
787 ASSERT_TRUE(ast->m_block[0]->isBlock());
788 ASSERT_TRUE(ast->m_block[0]->m_block[0]->isInterrupt());
789 ASSERT_TRUE(ast->m_block[0]->m_block[0]->m_namespace);
790 ASSERT_STREQ(
"name", ast->m_block[0]->m_block[0]->m_namespace->m_text.c_str());
791 ASSERT_TRUE(analysis.Analyze(ast, ast));
792 ASSERT_STREQ(
"name", ast->m_block[0]->m_block[0]->m_namespace->m_text.c_str());
794 ASSERT_NO_THROW(ast = jit->GetParser()->Parse(
"ns::name { ns::name -+ };"));
795 ASSERT_TRUE(analysis.Analyze(ast, ast));
798 ASSERT_NO_THROW(ast = jit->GetParser()->Parse(
"ns { name { ns::name +- } };"));
799 ASSERT_TRUE(analysis.Analyze(ast, ast));
802 ASSERT_NO_THROW(ast = jit->GetParser()->Parse(
"ns { { name { { ns::name ++ } } } };"));
803 ASSERT_TRUE(analysis.Analyze(ast, ast));
806 ASSERT_NO_THROW(ast = jit->GetParser()->Parse(
"{ ns { name { ns::name +- } } };"));
807 ASSERT_TRUE(analysis.Analyze(ast, ast));
810 ASSERT_NO_THROW(ast = jit->GetParser()->Parse(
"ns { { name { local:: { ns::name ++ } } } };"));
811 ASSERT_TRUE(analysis.Analyze(ast, ast));
814 ASSERT_NO_THROW(ast = jit->GetParser()->Parse(
"ns { { name { local:: { local:: ++ } } } };"));
815 ASSERT_TRUE(analysis.Analyze(ast, ast));
818 ASSERT_NO_THROW(ast = jit->GetParser()->Parse(
"ns { { name { local:: { ns ++ } } } };"));
819 ASSERT_TRUE(analysis.Analyze(ast, ast));
823 ASSERT_NO_THROW(ast = jit->GetParser()->Parse(
"ns { { name { local:: { bad_name ++ } } } };"));
824 ASSERT_FALSE(analysis.Analyze(ast, ast));
1085 JitPtr jit = JIT::Init(*rt);
1089 ast = jit->GetParser()->Parse(
":Bool(1)");
1090 ASSERT_TRUE(analysis.Analyze(ast, ast));
1092 ASSERT_ANY_THROW(ast = jit->GetParser()->Parse(
":Bool[](1)"));
1095 ast = jit->GetParser()->Parse(
":Bool[...](1)");
1096 ASSERT_TRUE(analysis2.Analyze(ast, ast));
1099 ast = jit->GetParser()->Parse(
":Bool[ ..., ...](1)");
1100 ASSERT_FALSE(analysis3.Analyze(ast, ast));
1103 ast = jit->GetParser()->Parse(
":Bool[0](1)");
1104 ASSERT_TRUE(analysis4.Analyze(ast, ast));
1107 ast = jit->GetParser()->Parse(
":Bool[_](1)");
1108 ASSERT_TRUE(analysis5.Analyze(ast, ast));
1111 ast = jit->GetParser()->Parse(
":Bool[0..1..2](1)");
1112 ASSERT_TRUE(analysis6.Analyze(ast, ast));
1115 ast = jit->GetParser()->Parse(
"0.._..2");
1116 ASSERT_TRUE(analysis7.Analyze(ast, ast));
1574TEST(Ast, CheckStrPrintf) {
1576 TermPtr args = Term::CreateDict();
1578 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"", args, 0));
1579 args->push_back(Term::CreateName(
""));
1580 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"", args, 0));
1581 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"", args, 1));
1583 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s", args, 0));
1584 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s", args, 1));
1585 args->push_back(Term::CreateName(
""));
1586 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s", args, 1));
1587 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s", args, 2));
1589 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d", args, 0));
1590 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d", args, 1));
1591 args->push_back(Term::CreateName(
"1"));
1593 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d", args, 1));
1594 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d", args, 2));
1596 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d%d", args, 0));
1597 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d%d", args, 1));
1598 args->push_back(Term::CreateName(
"1"));
1600 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d%d", args, 1));
1601 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d%ld", args, 1));
1603 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d%ld", args, 1));
1604 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d%ld", args, 2));
1606 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d%ld%f", args, 0));
1607 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d%ld%f", args, 1));
1608 args->push_back(Term::CreateName(
"0"));
1609 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d%ld%f", args, 1));
1610 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d%ld%f", args, 2));
1612 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d%ld%f%s", args, 0));
1613 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d%ld%f%s", args, 1));
1614 args->push_back(Term::CreateName(
""));
1615 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d%ld%f%s", args, 1));
1616 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d%ld%f%s", args, 2));
1620 JitPtr jit = JIT::Init(*rt);
1623 ASSERT_ANY_THROW(rt->MakeAst(
"print()"));
1624 ASSERT_ANY_THROW(rt->MakeAst(
"print(123)"));
1625 ASSERT_ANY_THROW(rt->MakeAst(
"print('%s - %s', 1, 'test')"));
1626 ASSERT_ANY_THROW(rt->MakeAst(
"print('%d - %d', 1, 'test')"));
1628 ASSERT_NO_THROW(rt->MakeAst(
"print(format='')"));
1629 ASSERT_NO_THROW(rt->MakeAst(
"print(format='%d', 1)"));
1631 ASSERT_ANY_THROW(rt->MakeAst(
"print(format='', 1)"));
1632 ASSERT_ANY_THROW(rt->MakeAst(
"print(format='%d', named=1)"));
1633 ASSERT_ANY_THROW(rt->MakeAst(
"print(format='%d', __sys__=1)"));
1636 ASSERT_NO_THROW(print = jit->Run(
"print(format='\\n')"));
1637 ASSERT_NO_THROW(print = jit->Run(
"print('%d - %s\\n', 1, 'test')"));
1640TEST(Ast, CheckStrFormat) {
1642 TermPtr args = Term::CreateDict();
1644 ASSERT_ANY_THROW(AstAnalysis::ConvertToVFormat_(
"",
nullptr));
1645 ASSERT_ANY_THROW(AstAnalysis::ConvertToVFormat_(
"{", args));
1647 ASSERT_STREQ(
"", AstAnalysis::ConvertToVFormat_(
"", args).c_str());
1648 ASSERT_STREQ(
"{{", AstAnalysis::ConvertToVFormat_(
"{{", args).c_str());
1649 ASSERT_STREQ(
"format", AstAnalysis::ConvertToVFormat_(
"format", args).c_str());
1650 ASSERT_STREQ(
"{}", AstAnalysis::ConvertToVFormat_(
"{}", args).c_str());
1651 ASSERT_STREQ(
"{1}", AstAnalysis::ConvertToVFormat_(
"{1}", args).c_str());
1652 ASSERT_STREQ(
"{1:}", AstAnalysis::ConvertToVFormat_(
"{1:}", args).c_str());
1653 ASSERT_STREQ(
"{:0}", AstAnalysis::ConvertToVFormat_(
"{:0}", args).c_str());
1654 ASSERT_STREQ(
"{:0}{:0}", AstAnalysis::ConvertToVFormat_(
"{:0}{:0}", args).c_str());
1655 ASSERT_STREQ(
"{1:1}{1:1}", AstAnalysis::ConvertToVFormat_(
"{1:1}{1:1}", args).c_str());
1657 ASSERT_ANY_THROW(AstAnalysis::ConvertToVFormat_(
"{{{1:1}{1:1", args));
1658 ASSERT_STREQ(
"{{{1:1}{1:1}", AstAnalysis::ConvertToVFormat_(
"{{{1:1}{1:1}", args).c_str());
1659 ASSERT_STREQ(
"{{{1:1}{1:1}}}", AstAnalysis::ConvertToVFormat_(
"{{{1:1}{1:1}}}", args).c_str());
1661 args->push_back(Term::CreateNone(),
"name");
1662 ASSERT_STREQ(
"{0}", AstAnalysis::ConvertToVFormat_(
"{name}", args).c_str());
1663 ASSERT_STREQ(
"{0}{0}", AstAnalysis::ConvertToVFormat_(
"{name}{name}", args).c_str());
1664 ASSERT_STREQ(
"{0:0}{0:123}{0:0.0}", AstAnalysis::ConvertToVFormat_(
"{name:0}{0:123}{name:0.0}", args).c_str());
1665 ASSERT_STREQ(
"{0}{0}", AstAnalysis::ConvertToVFormat_(
"{0}{name}", args).c_str());
1667 ASSERT_STREQ(
"{{{0}}}", AstAnalysis::ConvertToVFormat_(
"{{{0}}}", args).c_str());
1668 ASSERT_STREQ(
"{{{0}}}", AstAnalysis::ConvertToVFormat_(
"{{{name}}}", args).c_str());
1670 ASSERT_STREQ(
"{{0}{0}}", AstAnalysis::ConvertToVFormat_(
"{{0}{name}}", args).c_str());
1671 ASSERT_STREQ(
"{{{0}{0}}", AstAnalysis::ConvertToVFormat_(
"{{{0}{name}}", args).c_str());
1674 args->push_back(Term::CreateNone(),
"name2");
1675 ASSERT_STREQ(
"{0}{1}", AstAnalysis::ConvertToVFormat_(
"{name}{name2}", args).c_str());
1676 ASSERT_STREQ(
"{1}", AstAnalysis::ConvertToVFormat_(
"{name2}", args).c_str());
1677 ASSERT_STREQ(
"{1:0}{1:.0}{0:0.0}", AstAnalysis::ConvertToVFormat_(
"{name2:0}{1:.0}{name:0.0}", args).c_str());
1678 ASSERT_STREQ(
"{1}{0}", AstAnalysis::ConvertToVFormat_(
"{name2}{name}", args).c_str());
1680 ASSERT_STREQ(
"{{name2}{0}}", AstAnalysis::ConvertToVFormat_(
"{{name2}{name}}", args).c_str());
1681 ASSERT_STREQ(
"{{{1}{0}}", AstAnalysis::ConvertToVFormat_(
"{{{name2}{name}}", args).c_str());
1682 ASSERT_STREQ(
"{{{1}}}", AstAnalysis::ConvertToVFormat_(
"{{{name2}}}", args).c_str());
1684 ASSERT_STREQ(
"{{{0}}}", AstAnalysis::ConvertToVFormat_(
"{{{name}}}", args).c_str());
1687 ASSERT_TRUE(!args->size());
1689 ASSERT_STREQ(
"", AstAnalysis::MakeFormat(
"", args,
nullptr). c_str());
1690 ASSERT_ANY_THROW(AstAnalysis::MakeFormat(
"{", args,
nullptr));
1691 ASSERT_STREQ(
"{", AstAnalysis::MakeFormat(
"{{", args,
nullptr). c_str());
1693 ASSERT_NO_THROW(ASSERT_STREQ(
"{}", AstAnalysis::MakeFormat(
"{{}}", args,
nullptr). c_str()));
1694 ASSERT_ANY_THROW(ASSERT_STREQ(
"{}", AstAnalysis::MakeFormat(
"{{{}}}", args,
nullptr). c_str()));
1696 args->push_back(Term::CreateNone(),
"none");
1697 ASSERT_NO_THROW(ASSERT_STREQ(
"{}", AstAnalysis::MakeFormat(
"{{{}}}", args,
nullptr). c_str()));
1698 ASSERT_NO_THROW(ASSERT_STREQ(
"{}", AstAnalysis::MakeFormat(
"{{{none}}}", args,
nullptr). c_str()));
1701 ASSERT_NO_THROW(ASSERT_STREQ(
"", AstAnalysis::MakeFormat(
"{none}", args,
nullptr). c_str()));
1703 args->push_back(Term::CreateName(
"string", TermID::STRCHAR),
"str");
1704 ASSERT_NO_THROW(ASSERT_STREQ(
"'string'", AstAnalysis::MakeFormat(
"{str}", args,
nullptr). c_str()));
1706 args->push_back(Term::CreateName(
"123", TermID::STRCHAR),
"int");
1707 ASSERT_NO_THROW(ASSERT_STREQ(
"'123'", AstAnalysis::MakeFormat(
"{int}", args,
nullptr). c_str()));
1709 ASSERT_NO_THROW(ASSERT_STREQ(
"", AstAnalysis::MakeFormat(
"{}", args,
nullptr). c_str()));
1710 ASSERT_NO_THROW(ASSERT_STREQ(
"'string'", AstAnalysis::MakeFormat(
"{}{}", args,
nullptr). c_str()));
1711 ASSERT_NO_THROW(ASSERT_STREQ(
"'string''123'", AstAnalysis::MakeFormat(
"{}{}{}", args,
nullptr). c_str()));
1713 ASSERT_NO_THROW(ASSERT_STREQ(
"'string'", AstAnalysis::MakeFormat(
"{1}", args,
nullptr). c_str()));
1714 ASSERT_NO_THROW(ASSERT_STREQ(
"'string'", AstAnalysis::MakeFormat(
"{0}{1}{0}", args,
nullptr). c_str()));
1715 ASSERT_NO_THROW(ASSERT_STREQ(
"'string''123'", AstAnalysis::MakeFormat(
"{1}{2}{none}", args,
nullptr). c_str()));
1717 ASSERT_NO_THROW(ASSERT_STREQ(
"'string''123'", AstAnalysis::MakeFormat(
"{none}{str}{int}{none}", args,
nullptr). c_str()));
1720TEST(Ast, MakeInclude) {
1723 str = AstAnalysis::MakeInclude(Term::CreateName(
"name"));
1724 ASSERT_STREQ(
"", str.c_str());
1726 str = AstAnalysis::MakeInclude(Parser::ParseString(
"::val := 1;"));
1727 ASSERT_STREQ(
"::val := ...;\n", str.c_str());
1729 str = AstAnalysis::MakeInclude(Parser::ParseString(
"::val := 1; val2 := 1; @::val3 := 1"));
1730 ASSERT_STREQ(
"::val := ...;\n@::val3 := ...;\n", str.c_str());
1732 str = AstAnalysis::MakeInclude(Parser::ParseString(
"::val, val2, @::val3 := 1"));
1733 ASSERT_STREQ(
"::val := ...;\n@::val3 := ...;\n", str.c_str());
1735 str = AstAnalysis::MakeInclude(Parser::ParseString(
"@@ macro @@ := 1; @@ macro2 @@ := @@ 2 @@; @@@@ macro @@@@;"));
1736 ASSERT_STREQ(
"@@ macro @@ := 1;\n@@ macro2 @@ := @@ 2 @@;\n@@@@ macro @@@@;\n", str.c_str());
const TermPtr getDefaultType(const std::string_view text)
std::string ExtractName(std::string name)
std::shared_ptr< Term > TermPtr
std::shared_ptr< Obj > ObjPtr
std::shared_ptr< RunTime > RuntimePtr
std::string ExtractModuleName(const std::string_view name)