4#include <gtest/gtest.h>
162 Parser p(macro, postlex, diag,
true, rt.get());
168 ASSERT_STREQ(
"name",
ExtractName(
"::name").c_str());
169 ASSERT_STREQ(
"name",
ExtractName(
"ns::name").c_str());
171 ASSERT_STREQ(
"",
ExtractName(
"\\\\dir.file").c_str());
172 ASSERT_STREQ(
"var",
ExtractName(
"\\dir.file::var").c_str());
173 ASSERT_STREQ(
"var.field",
ExtractName(
"\\\\dir.file::var.field").c_str());
179 ASSERT_STREQ(
"\\\\dir.file",
ExtractModuleName(
"\\\\dir.file::var.field").c_str());
189 ASSERT_STREQ(
"\\\\file_name\\dir",
ExtractModuleName(
"_$file_name$dir$_").c_str());
190 ASSERT_STREQ(
"\\\\file_name\\dir",
ExtractModuleName(
"_$file_name$dir$_var$").c_str());
191 ASSERT_STREQ(
"\\\\file_name\\dir",
ExtractModuleName(
"_$file_name$dir$_var$$").c_str());
192 ASSERT_STREQ(
"\\\\file_name\\dir",
ExtractModuleName(
"_$file_name$dir$_var$$$").c_str());
201 ASSERT_EQ(0, stack.m_modules.size());
202 size_t glob_count = stack.m_glob.size();
203 ASSERT_TRUE(glob_count);
205 ASSERT_STREQ(
"::name::", stack.MakeInternalName(
"::name",
false).c_str());
206 ASSERT_STREQ(
"::name::", stack.MakeInternalName(
"::name",
true).c_str());
207 ASSERT_STREQ(
"name$", stack.MakeInternalName(
"name",
false).c_str());
208 ASSERT_STREQ(
"name::", stack.MakeInternalName(
"name",
true).c_str());
209 ASSERT_STREQ(
"name$", stack.MakeInternalName(
"$name",
false).c_str());
210 ASSERT_STREQ(
"name$", stack.MakeInternalName(
"$name",
true).c_str());
211 ASSERT_STREQ(
"name:::", stack.MakeInternalName(
":name",
false).c_str());
212 ASSERT_STREQ(
"name:::", stack.MakeInternalName(
":name",
true).c_str());
213 ASSERT_STREQ(
"::name:::", stack.MakeInternalName(
":::name",
false).c_str());
214 ASSERT_STREQ(
"::name:::", stack.MakeInternalName(
":::name",
true).c_str());
215 ASSERT_STREQ(
"name:::", stack.MakeInternalName(
"@:::name",
false).c_str());
216 ASSERT_STREQ(
"name:::", stack.MakeInternalName(
"@:::name",
true).c_str());
218 ASSERT_STREQ(
"Stack []: \n", stack.Dump().c_str());
219 stack.PushScope(
nullptr);
221 ASSERT_STREQ(
"::name::", stack.MakeInternalName(
"::name",
false).c_str());
222 ASSERT_STREQ(
"::name::", stack.MakeInternalName(
"::name",
true).c_str());
223 ASSERT_STREQ(
"name$", stack.MakeInternalName(
"name",
false).c_str());
224 ASSERT_STREQ(
"name::", stack.MakeInternalName(
"name",
true).c_str());
225 ASSERT_STREQ(
"name$", stack.MakeInternalName(
"$name",
false).c_str());
226 ASSERT_STREQ(
"name$", stack.MakeInternalName(
"$name",
true).c_str());
227 ASSERT_STREQ(
"name:::", stack.MakeInternalName(
":name",
false).c_str());
228 ASSERT_STREQ(
"name:::", stack.MakeInternalName(
":name",
true).c_str());
229 ASSERT_STREQ(
"::name:::", stack.MakeInternalName(
":::name",
false).c_str());
230 ASSERT_STREQ(
"::name:::", stack.MakeInternalName(
":::name",
true).c_str());
231 ASSERT_STREQ(
"name:::", stack.MakeInternalName(
"@:::name",
false).c_str());
232 ASSERT_STREQ(
"name:::", stack.MakeInternalName(
"@:::name",
true).c_str());
234 stack.back().vars.insert({
"name1", Term::Create(TermID::NAME,
"term_name1", parser::token_type::NAME)});
235 stack.back().vars.insert({
"name2", Term::Create(TermID::NAME,
"term_name2", parser::token_type::NAME)});
237 stack.PushScope(Term::Create(TermID::NAME,
"ns", parser::token_type::NAME));
238 stack.back().vars.insert({
"name3", Term::Create(TermID::NAME,
"term_name3", parser::token_type::NAME)});
240 ASSERT_STREQ(
"::name::", stack.MakeInternalName(
"::name",
false).c_str());
241 ASSERT_STREQ(
"::name::", stack.MakeInternalName(
"::name",
true).c_str());
242 ASSERT_STREQ(
"name$", stack.MakeInternalName(
"name",
false).c_str());
243 ASSERT_STREQ(
"ns::name::", stack.MakeInternalName(
"name",
true).c_str());
244 ASSERT_STREQ(
"name$", stack.MakeInternalName(
"$name",
false).c_str());
245 ASSERT_STREQ(
"ns::name$", stack.MakeInternalName(
"$name",
true).c_str());
246 ASSERT_STREQ(
"ns::name:::", stack.MakeInternalName(
":name",
false).c_str());
247 ASSERT_STREQ(
"ns::name:::", stack.MakeInternalName(
":name",
true).c_str());
248 ASSERT_STREQ(
"::name:::", stack.MakeInternalName(
":::name",
false).c_str());
249 ASSERT_STREQ(
"::name:::", stack.MakeInternalName(
":::name",
true).c_str());
250 ASSERT_STREQ(
"ns::name:::", stack.MakeInternalName(
"@:::name",
false).c_str());
251 ASSERT_STREQ(
"ns::name:::", stack.MakeInternalName(
"@:::name",
true).c_str());
257 ASSERT_STREQ(
"Stack []: \nStack [1::]: name1, name2\nStack [ns::]: name3\n", stack.Dump().c_str());
262 ASSERT_EQ(1, stack.size());
263 ASSERT_STREQ(
"", stack.GetNamespace().c_str());
265 ASSERT_FALSE(stack.LookupName(
"name1"));
266 ASSERT_FALSE(stack.LookupName(
"$name1"));
267 ASSERT_FALSE(stack.LookupName(
"::name1"));
269 TermPtr name1 = Term::Create(TermID::NAME,
"name1", parser::token_type::NAME);
271 ASSERT_EQ(0, stack.front().vars.size()) << stack.Dump();
274 name1->m_normalized = stack.MakeInternalName(name1->m_text,
false);
275 ASSERT_STREQ(
"name1$", name1->m_normalized.c_str());
277 ASSERT_TRUE(stack.size()) << stack.Dump();
278 ASSERT_TRUE(!stack.empty()) << stack.Dump();
279 ASSERT_TRUE(stack.AddName(name1)) << stack.Dump();
281 ASSERT_EQ(1, stack.size()) << stack.Dump();
282 ASSERT_EQ(1, stack.front().vars.size()) << stack.Dump();
285 ASSERT_STREQ(
"name1$", name1->m_normalized.c_str());
287 ASSERT_TRUE(temp1 = stack.LookupName(
"name1")) << stack.Dump();
288 ASSERT_EQ(temp1.get(), name1.get());
289 ASSERT_TRUE(temp1 = stack.LookupName(
"$name1")) << stack.Dump();
290 ASSERT_EQ(temp1.get(), name1.get());
291 ASSERT_FALSE(stack.LookupName(
"::name1")) << stack.Dump();
294 stack.PushScope(Term::Create(TermID::NAMESPACE,
"name", parser::token_type::NAMESPACE));
295 ASSERT_EQ(2, stack.size());
296 ASSERT_STREQ(
"name::", stack.GetNamespace().c_str());
299 ASSERT_STREQ(
"::name1::", stack.MakeInternalName(
"::name1",
false).c_str());
300 ASSERT_STREQ(
"name1$", stack.MakeInternalName(
"name1",
false).c_str());
301 ASSERT_STREQ(
"name1$", stack.MakeInternalName(
"$name1",
false).c_str());
302 ASSERT_STREQ(
"name::name1:::", stack.MakeInternalName(
":name1",
false).c_str());
305 TermPtr name2 = Term::Create(TermID::NAME,
"name2", parser::token_type::NAME);
306 ASSERT_EQ(2, stack.size()) << stack.Dump();
307 ASSERT_EQ(0, ext_storage.size()) << stack.Dump();
308 ASSERT_EQ(0, stack[1].vars.size()) << stack.Dump();
310 name2->m_normalized = stack.MakeInternalName(name2->m_text,
false);
311 ASSERT_FALSE(stack.LookupName(
"name2")) << stack.Dump();
312 ASSERT_TRUE(stack.AddName(name2)) << stack.Dump();
314 ASSERT_EQ(1, stack[1].vars.size()) << stack.Dump();
315 ASSERT_TRUE(stack.LookupName(
"name2")) << stack.Dump();
317 ASSERT_STREQ(
"name2", name2->m_text.c_str());
319 ASSERT_TRUE(temp2 = stack.LookupName(
"name2")) << stack.Dump();
320 ASSERT_EQ(temp2.get(), name2.get());
321 ASSERT_TRUE(temp2 = stack.LookupName(
"$name2")) << stack.Dump();
322 ASSERT_EQ(temp2.get(), name2.get());
323 ASSERT_FALSE(stack.LookupName(
"::name2")) << stack.Dump();
326 ASSERT_TRUE(temp = stack.LookupName(
"name1")) << stack.Dump();
327 ASSERT_EQ(temp.get(), name1.get());
328 ASSERT_TRUE(temp = stack.LookupName(
"$name1")) << stack.Dump();
329 ASSERT_EQ(temp.get(), name1.get());
333 stack.PushScope(
nullptr);
334 ASSERT_EQ(3, stack.size());
336 ASSERT_STREQ(
"::name1::", stack.MakeInternalName(
"::name1",
false).c_str());
337 ASSERT_STREQ(
"name1$", stack.MakeInternalName(
"name1",
false).c_str());
338 ASSERT_STREQ(
"name1$", stack.MakeInternalName(
"$name1",
false).c_str());
339 ASSERT_STREQ(
"name::name1:::", stack.MakeInternalName(
":name1",
false).c_str());
341 ASSERT_STREQ(
"::name1::", stack.MakeInternalName(
"::name1",
true).c_str());
342 ASSERT_STREQ(
"name::name1::", stack.MakeInternalName(
"name1",
true).c_str());
343 ASSERT_STREQ(
"name::name1$", stack.MakeInternalName(
"$name1",
true).c_str());
344 ASSERT_STREQ(
"name::name1:::", stack.MakeInternalName(
":name1",
true).c_str());
346 TermPtr name3 = Term::Create(TermID::NAME,
"$name3", parser::token_type::NAME);
347 ASSERT_EQ(3, stack.size()) << stack.Dump();
348 ASSERT_EQ(0, ext_storage.size()) << stack.Dump();
349 ASSERT_EQ(0, stack[2].vars.size()) << stack.Dump();
351 name3->m_normalized = stack.MakeInternalName(name3->m_text,
false);
352 ASSERT_TRUE(stack.AddName(name3)) << stack.Dump();
354 ASSERT_EQ(1, stack[2].vars.size()) << stack.Dump();
355 ASSERT_STREQ(
"$name3", name3->m_text.c_str());
358 ASSERT_TRUE(temp3 = stack.LookupName(
"name3")) << stack.Dump();
359 ASSERT_EQ(temp3.get(), name3.get());
360 ASSERT_TRUE(temp3 = stack.LookupName(
"$name3")) << stack.Dump();
361 ASSERT_EQ(temp3.get(), name3.get());
362 ASSERT_FALSE(stack.LookupName(
"::name3")) << stack.Dump();
364 ASSERT_EQ(name1.get(), name1_orig.get());
365 ASSERT_TRUE(temp = stack.LookupName(
"name1")) << stack.Dump();
366 ASSERT_EQ(temp.get(), name1.get());
367 ASSERT_TRUE(temp = stack.LookupName(
"$name1")) << stack.Dump();
368 ASSERT_EQ(temp.get(), name1.get());
370 ASSERT_TRUE(temp = stack.LookupName(
"name2")) << stack.Dump();
371 ASSERT_EQ(temp.get(), name2.get());
372 ASSERT_TRUE(temp = stack.LookupName(
"$name2")) << stack.Dump();
373 ASSERT_EQ(temp.get(), name2.get());
377 stack.PushScope(Term::Create(TermID::NAMESPACE,
"name2", parser::token_type::NAMESPACE));
378 ASSERT_EQ(4, stack.size());
379 ASSERT_STREQ(
"name::name2::", stack.GetNamespace().c_str());
381 ASSERT_STREQ(
"::name1::", stack.MakeInternalName(
"::name1",
false).c_str());
382 ASSERT_STREQ(
"name1$", stack.MakeInternalName(
"name1",
false).c_str());
383 ASSERT_STREQ(
"name1$", stack.MakeInternalName(
"$name1",
false).c_str());
384 ASSERT_STREQ(
"name::name2::name1:::", stack.MakeInternalName(
":name1",
false).c_str());
386 ASSERT_STREQ(
"::name1::", stack.MakeInternalName(
"::name1",
true).c_str());
387 ASSERT_STREQ(
"name::name2::name1::", stack.MakeInternalName(
"name1",
true).c_str());
388 ASSERT_STREQ(
"name::name2::name1$", stack.MakeInternalName(
"$name1",
true).c_str());
389 ASSERT_STREQ(
"name::name2::name1:::", stack.MakeInternalName(
":name1",
true).c_str());
392 TermPtr name4 = Term::Create(TermID::NAME,
"name4", parser::token_type::NAME);
393 ASSERT_EQ(4, stack.size()) << stack.Dump();
394 ASSERT_EQ(0, stack[3].vars.size()) << stack.Dump();
395 ASSERT_TRUE(stack[3].vars.find(
"$name4") == stack[3].vars.end()) << stack.Dump();
396 ASSERT_EQ(0, ext_storage.size()) << stack.Dump();
398 name4->m_normalized = stack.MakeInternalName(name4->m_text,
false);
399 ASSERT_STREQ(
"name4$", name4->m_normalized.c_str());
400 ASSERT_TRUE(stack.AddName(name4)) << stack.Dump();
402 ASSERT_EQ(1, stack[3].vars.size()) << stack.Dump();
404 ASSERT_TRUE(temp = stack.LookupName(
"name4")) << stack.Dump();
405 ASSERT_EQ(temp.get(), name4.get()) << stack.Dump();
406 ASSERT_TRUE(temp = stack.LookupName(
"$name4")) << stack.Dump();
407 ASSERT_EQ(temp.get(), name4.get()) << stack.Dump();
409 ASSERT_EQ(name1.get(), name1_orig.get());
410 ASSERT_TRUE(temp = stack.LookupName(
"name1")) << stack.Dump();
411 ASSERT_EQ(temp.get(), name1.get()) << stack.Dump();
412 ASSERT_TRUE(temp = stack.LookupName(
"$name1")) << stack.Dump();
413 ASSERT_EQ(temp.get(), name1.get()) << stack.Dump();
415 ASSERT_TRUE(temp = stack.LookupName(
"name2")) << stack.Dump();
416 ASSERT_EQ(temp.get(), name2.get()) << temp->toString() <<
" " << name2->toString() <<
" " << stack.Dump();
417 ASSERT_TRUE(temp = stack.LookupName(
"$name2")) << stack.Dump();
418 ASSERT_EQ(temp.get(), name2.get()) << stack.Dump();
420 ASSERT_TRUE(temp = stack.LookupName(
"name3")) << stack.Dump();
421 ASSERT_EQ(temp.get(), name3.get()) << stack.Dump();
422 ASSERT_TRUE(temp = stack.LookupName(
"$name3")) << stack.Dump();
423 ASSERT_EQ(temp.get(), name3.get()) << stack.Dump();
425 ASSERT_EQ(name1.get(), name1_orig.get());
426 ASSERT_TRUE(temp = stack.LookupName(
"name1")) << stack.Dump();
427 ASSERT_EQ(temp.get(), name1.get()) << temp->toString();
428 ASSERT_TRUE(temp = stack.LookupName(
"$name1")) << stack.Dump();
429 ASSERT_EQ(temp.get(), name1.get()) << temp->toString();
433 stack.PushScope(Term::Create(TermID::NAMESPACE,
"name3::name4", parser::token_type::NAMESPACE));
434 ASSERT_EQ(5, stack.size());
435 ASSERT_STREQ(
"name::name2::name3::name4::", stack.GetNamespace().c_str());
437 ASSERT_STREQ(
"::name1::", stack.MakeInternalName(
"::name1",
false).c_str());
438 ASSERT_STREQ(
"name1$", stack.MakeInternalName(
"name1",
false).c_str());
439 ASSERT_STREQ(
"name1$", stack.MakeInternalName(
"$name1",
false).c_str());
440 ASSERT_STREQ(
"name::name2::name3::name4::name1:::", stack.MakeInternalName(
":name1",
false).c_str());
442 ASSERT_STREQ(
"::name1::", stack.MakeInternalName(
"::name1",
true).c_str());
443 ASSERT_STREQ(
"name::name2::name3::name4::name1::", stack.MakeInternalName(
"name1",
true).c_str());
444 ASSERT_STREQ(
"name::name2::name3::name4::name1$", stack.MakeInternalName(
"$name1",
true).c_str());
445 ASSERT_STREQ(
"name::name2::name3::name4::name1:::", stack.MakeInternalName(
":name1",
true).c_str());
448 stack.PushScope(Term::Create(TermID::NAMESPACE,
"::", parser::token_type::NAMESPACE));
449 ASSERT_EQ(6, stack.size());
450 ASSERT_STREQ(
"::", stack.GetNamespace().c_str());
453 ASSERT_STREQ(
"::name1::", stack.MakeInternalName(
"::name1",
false).c_str());
454 ASSERT_STREQ(
"name1$", stack.MakeInternalName(
"name1",
false).c_str());
455 ASSERT_STREQ(
"name1$", stack.MakeInternalName(
"$name1",
false).c_str());
456 ASSERT_STREQ(
"::name1:::", stack.MakeInternalName(
":name1",
false).c_str());
458 ASSERT_STREQ(
"::name1::", stack.MakeInternalName(
"::name1",
true).c_str());
459 ASSERT_STREQ(
"::name1::", stack.MakeInternalName(
"name1",
true).c_str());
460 ASSERT_STREQ(
"::name1$", stack.MakeInternalName(
"$name1",
true).c_str());
461 ASSERT_STREQ(
"::name1:::", stack.MakeInternalName(
":name1",
true).c_str());
464 stack.PushScope(
nullptr);
465 ASSERT_EQ(7, stack.size());
467 ASSERT_STREQ(
"::", stack.GetNamespace().c_str());
469 ASSERT_STREQ(
"::name1::", stack.MakeInternalName(
"::name1",
false).c_str());
470 ASSERT_STREQ(
"name1$", stack.MakeInternalName(
"name1",
false).c_str());
471 ASSERT_STREQ(
"name1$", stack.MakeInternalName(
"$name1",
false).c_str());
472 ASSERT_STREQ(
"::name1:::", stack.MakeInternalName(
":name1",
false).c_str());
474 ASSERT_STREQ(
"::name1::", stack.MakeInternalName(
"::name1",
true).c_str());
475 ASSERT_STREQ(
"::name1::", stack.MakeInternalName(
"name1",
true).c_str());
476 ASSERT_STREQ(
"::name1$", stack.MakeInternalName(
"$name1",
true).c_str());
477 ASSERT_STREQ(
"::name1:::", stack.MakeInternalName(
":name1",
true).c_str());
479 ASSERT_EQ(name1.get(), name1_orig.get());
480 ASSERT_TRUE((temp = stack.LookupName(
"name1"))) << stack.Dump();
481 ASSERT_EQ(name1.get(), name1_orig.get()) << name1->toString() <<
" " << name1_orig->toString();
482 EXPECT_EQ(temp.get(), name1.get()) << temp->toString() <<
" " << name1->toString();
483 ASSERT_TRUE(temp = stack.LookupName(
"$name1")) << stack.Dump();
484 EXPECT_EQ(temp.get(), name1.get()) << temp->toString() <<
" " << name1->toString();
487 TermPtr name_g = Term::Create(TermID::NAME,
"@::name_g", parser::token_type::NAME);
488 ASSERT_EQ(7, stack.size()) << stack.Dump();
489 ASSERT_EQ(0, ext_storage.size()) << stack.Dump();
491 name_g->m_normalized = stack.MakeInternalName(name_g->m_text,
false);
492 ASSERT_TRUE(stack.AddName(name_g)) << stack.Dump();
494 ASSERT_TRUE(temp = stack.LookupName(
"name_g")) << stack.Dump();
495 ASSERT_EQ(temp.get(), name_g.get()) << temp->toString();
496 ASSERT_FALSE(temp = stack.LookupName(
"$name_g")) << stack.Dump();
497 ASSERT_TRUE(stack.LookupName(
"::name_g")) << stack.Dump();
498 ASSERT_TRUE(temp = stack.LookupName(
"@::name_g")) << stack.Dump();
499 ASSERT_EQ(temp.get(), name_g.get()) << temp->toString();
501 ASSERT_EQ(name1.get(), name1_orig.get());
502 ASSERT_TRUE(temp = stack.LookupName(
"name1")) << stack.Dump();
503 EXPECT_EQ(temp.get(), name1.get()) << temp->toString() <<
" " << name1->toString();
504 ASSERT_TRUE(temp = stack.LookupName(
"$name1")) << stack.Dump();
505 EXPECT_EQ(temp.get(), name1.get()) << temp->toString() <<
" " << name1->toString();
507 ASSERT_TRUE(temp = stack.LookupName(
"name2")) << stack.Dump();
508 EXPECT_EQ(temp.get(), name2.get()) << temp->toString() <<
" " << name2->toString();
509 ASSERT_TRUE(temp = stack.LookupName(
"$name2")) << stack.Dump();
510 EXPECT_EQ(temp.get(), name2.get()) << temp->toString() <<
" " << name2->toString();
512 ASSERT_TRUE(temp = stack.LookupName(
"name3")) << stack.Dump();
513 EXPECT_EQ(temp.get(), name3.get()) << temp->toString() <<
" " << name3->toString();
514 ASSERT_TRUE(temp = stack.LookupName(
"$name3")) << stack.Dump();
515 EXPECT_EQ(temp.get(), name3.get()) << temp->toString() <<
" " << name3->toString();
517 ASSERT_TRUE(temp = stack.LookupName(
"name_g")) << stack.Dump();
518 ASSERT_EQ(temp.get(), name_g.get()) << temp->toString();
519 ASSERT_FALSE(temp = stack.LookupName(
"$name_g")) << stack.Dump();
520 ASSERT_TRUE(temp = stack.LookupName(
"::name_g")) << stack.Dump();
521 ASSERT_TRUE(temp = stack.LookupName(
"@::name_g")) << stack.Dump();
522 ASSERT_EQ(temp.get(), name_g.get()) << temp->toString();
529 stack.PushScope(Term::Create(TermID::NAMESPACE,
"::name5::name6", parser::token_type::NAMESPACE));
530 ASSERT_EQ(8, stack.size()) << stack.Dump();
531 ASSERT_STREQ(
"::name5::name6::", stack.GetNamespace().c_str());
534 stack.PushScope(Term::Create(TermID::NAMESPACE,
"::", parser::token_type::NAMESPACE));
535 ASSERT_STREQ(
"::", stack.GetNamespace().c_str());
538 stack.PushScope(Term::Create(TermID::NAMESPACE,
"name7", parser::token_type::NAMESPACE));
539 ASSERT_EQ(10, stack.size()) << stack.Dump();
540 ASSERT_STREQ(
"::name7::", stack.GetNamespace().c_str());
545 ASSERT_EQ(8, stack.size()) << stack.Dump();
546 ASSERT_STREQ(
"::name5::name6::", stack.GetNamespace().c_str());
550 ASSERT_EQ(7, stack.size()) << stack.Dump();
551 ASSERT_STREQ(
"::", stack.GetNamespace().c_str()) << stack.Dump();
555 ASSERT_EQ(6, stack.size()) << stack.Dump();
556 ASSERT_STREQ(
"::", stack.GetNamespace().c_str()) << stack.Dump();
560 ASSERT_EQ(5, stack.size()) << stack.Dump();
561 ASSERT_STREQ(
"name::name2::name3::name4::", stack.GetNamespace().c_str());
565 ASSERT_EQ(4, stack.size()) << stack.Dump();
566 ASSERT_STREQ(
"name::name2::", stack.GetNamespace().c_str());
570 ASSERT_EQ(3, stack.size()) << stack.Dump();
571 ASSERT_STREQ(
"name::", stack.GetNamespace().c_str());
576 ASSERT_EQ(2, stack.size()) << stack.Dump();
577 ASSERT_STREQ(
"name::", stack.GetNamespace().c_str());
581 ASSERT_EQ(1, stack.size()) << stack.Dump();
582 ASSERT_STREQ(
"", stack.GetNamespace().c_str());
585 stack.PushScope(Term::Create(TermID::NAMESPACE,
"ns::name", parser::token_type::NAMESPACE));
586 ASSERT_EQ(2, stack.size()) << stack.Dump();
587 ASSERT_STREQ(
"ns::name::", stack.GetNamespace().c_str());
591 stack.PushScope(Term::Create(TermID::NAMESPACE,
"::", parser::token_type::NAMESPACE));
592 ASSERT_EQ(3, stack.size()) << stack.Dump();
593 ASSERT_STREQ(
"::", stack.GetNamespace().c_str());
599 ASSERT_EQ(1, stack.size()) << stack.Dump();
603TEST(Ast, AstAnalyze) {
605 JIT * jit = JIT::ReCreate();
614 ASSERT_EQ(1, stack.size());
615 ASSERT_EQ(0, stack[0].vars.size());
617 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
618 ASSERT_EQ(1, stack.size());
619 ASSERT_EQ(1, stack[0].vars.size()) << stack.Dump();
620 ASSERT_TRUE(stack.LookupName(
"var1$")) << stack.Dump();
621 ASSERT_STREQ(
"var1", stack.LookupName(
"var1$")->m_text.c_str());
622 ASSERT_STREQ(
"var1$", stack.LookupName(
"var1$")->m_normalized.c_str());
624 ast = jit->
GetParser()->Parse(
"$var2 ::= '1';$var3 ::= '1';");
627 ASSERT_TRUE(analysis.Analyze(ast, &stack));
628 ASSERT_EQ(1, stack.size());
629 ASSERT_EQ(3, stack[0].vars.size()) << stack.Dump();
630 ASSERT_TRUE(stack.LookupName(
"var2$")) << stack.Dump();
631 ASSERT_TRUE(stack.LookupName(
"var3$")) << stack.Dump();
632 ASSERT_STREQ(
"$var2", stack.LookupName(
"var2$")->m_text.c_str());
633 ASSERT_STREQ(
"$var3", stack.LookupName(
"var3$")->m_text.c_str());
634 ASSERT_STREQ(
"var2$", stack.LookupName(
"var2$")->m_normalized.c_str());
635 ASSERT_STREQ(
"var3$", stack.LookupName(
"var3$")->m_normalized.c_str());
637 ast = jit->
GetParser()->Parse(
"$var ::= '1'; $var = '2';");
640 ASSERT_TRUE(analysis.Analyze(ast, &stack));
641 ASSERT_EQ(1, stack.size());
642 ASSERT_EQ(4, stack[0].vars.size()) << stack.Dump();
643 ASSERT_TRUE(stack.LookupName(
"var$")) << stack.Dump();
644 ASSERT_STREQ(
"$var", stack.LookupName(
"var$")->m_text.c_str());
645 ASSERT_STREQ(
"var$", stack.LookupName(
"var$")->m_normalized.c_str());
648 ast = jit->
GetParser()->Parse(
"$fail = '1'");
650 ASSERT_FALSE(analysis.Analyze(ast, &stack));
652 ast = jit->
GetParser()->Parse(
"$var ::= '1'");
654 ASSERT_FALSE(analysis.Analyze(ast, &stack));
656 ast = jit->
GetParser()->Parse(
"$var := '1'");
658 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << jit->
Dump(
"*var*");
661 ast = jit->
GetParser()->Parse(
"$var = 'строка'; $var = 2;");
663 ASSERT_EQ(2, ast->m_block.size());
664 ASSERT_STREQ(
"=", ast->m_block[0]->m_text.c_str());
665 ASSERT_TRUE(ast->m_block[0]->m_left);
666 ASSERT_STREQ(
"$var", ast->m_block[0]->m_left->m_text.c_str());
667 ASSERT_FALSE(ast->m_block[0]->m_left->m_type);
668 ASSERT_TRUE(ast->m_block[0]->m_right);
669 ASSERT_STREQ(
"строка", ast->m_block[0]->m_right->m_text.c_str());
670 ASSERT_TRUE(ast->m_block[0]->m_right->m_type);
671 ASSERT_STREQ(
":StrChar", ast->m_block[0]->m_right->m_type->asTypeString().c_str());
673 ASSERT_STREQ(
"=", ast->m_block[1]->m_text.c_str());
674 ASSERT_TRUE(ast->m_block[1]->m_left);
675 ASSERT_STREQ(
"$var", ast->m_block[1]->m_left->m_text.c_str());
676 ASSERT_FALSE(ast->m_block[1]->m_left->m_type);
677 ASSERT_TRUE(ast->m_block[1]->m_right);
678 ASSERT_STREQ(
"2", ast->m_block[1]->m_right->m_text.c_str());
679 ASSERT_TRUE(ast->m_block[1]->m_right->m_type);
680 ASSERT_STREQ(
":Int8", ast->m_block[1]->m_right->m_type->asTypeString().c_str());
682 ASSERT_FALSE(analysis.Analyze(ast, &stack));
684 ast = jit->
GetParser()->Parse(
"$int ::= 2; $int = '';");
686 ASSERT_FALSE(analysis.Analyze(ast, &stack));
688 ast = jit->
GetParser()->Parse(
"$var4 ::= 2; $var4 = 2222;");
690 ASSERT_TRUE(analysis.Analyze(ast, &stack));
691 ASSERT_TRUE(stack.LookupName(
"var4$")) << stack.Dump();
692 ASSERT_STREQ(
":Int16", stack.LookupName(
"var4$")->GetType()->asTypeString().c_str());
694 ast = jit->
GetParser()->Parse(
"$var5:Int8 := 2; $var5 = 2222;");
696 ASSERT_FALSE(analysis.Analyze(ast, &stack));
699 ast = jit->
GetParser()->Parse(
"$var32 := 2; $var32 = 22222222;");
701 ASSERT_TRUE(analysis.Analyze(ast, &stack));
702 ASSERT_TRUE(stack.LookupName(
"var32$")) << stack.Dump();
703 ASSERT_STREQ(
":Int32", stack.LookupName(
"var32$")->GetType()->asTypeString().c_str());
705 ast = jit->
GetParser()->Parse(
"$var64 := 2; $var64 = 2222222222222;");
707 ASSERT_TRUE(analysis.Analyze(ast, &stack));
708 ASSERT_TRUE(stack.LookupName(
"var64$")) << stack.Dump();
709 ASSERT_STREQ(
":Int64", stack.LookupName(
"var64$")->GetType()->asTypeString().c_str());
711 ast = jit->
GetParser()->Parse(
"varf := 2; varf = 2.0;");
713 ASSERT_TRUE(analysis.Analyze(ast, &stack));
714 ASSERT_TRUE(stack.LookupName(
"varf$")) << stack.Dump();
715 ASSERT_STREQ(
":Float32", stack.LookupName(
"varf$")->GetType()->asTypeString().c_str());
721 JIT * jit = JIT::ReCreate();
731 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
732 ASSERT_EQ(1, stack.size());
733 ASSERT_TRUE(stack.LookupName(
"dict$")) << stack.Dump();
734 ASSERT_STREQ(
"dict", stack.LookupName(
"dict$")->m_text.c_str());
735 ASSERT_STREQ(
"dict$", stack.LookupName(
"dict$")->m_normalized.c_str());
737 ast = jit->
GetParser()->Parse(
"dict = (1,2,); (dict[1], dict[2],);");
740 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
741 ASSERT_EQ(1, stack.size());
742 ASSERT_TRUE(stack.LookupName(
"dict$")) << stack.Dump();
743 ASSERT_STREQ(
"dict", stack.LookupName(
"dict$")->m_text.c_str());
744 ASSERT_STREQ(
"dict$", stack.LookupName(
"dict$")->m_normalized.c_str());
747 ast = jit->
GetParser()->Parse(
"recursive(arg^) ::= { recursive(arg) };");
750 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
751 ASSERT_EQ(1, stack.size());
752 ASSERT_TRUE(stack.LookupName(
"recursive::")) << stack.Dump();
753 ASSERT_STREQ(
"recursive::", stack.LookupName(
"recursive")->m_text.c_str());
754 ASSERT_STREQ(
"recursive::", stack.LookupName(
"recursive")->m_normalized.c_str());
757 ast = jit->
GetParser()->Parse(
"recursive2(&arg) ::= { recursive2(arg) };");
760 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
761 ASSERT_EQ(1, stack.size());
762 ASSERT_TRUE(stack.LookupName(
"recursive2::")) << stack.Dump();
763 ASSERT_STREQ(
"recursive2::", stack.LookupName(
"recursive2")->m_text.c_str());
764 ASSERT_STREQ(
"recursive2::", stack.LookupName(
"recursive2::")->m_normalized.c_str());
769TEST(Ast, Reference) {
771 JIT * jit = JIT::ReCreate();
781 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
785 ast = jit->
GetParser()->Parse(
"{noref ::= 1; ref := &noref;}");
787 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
789 ast = jit->
GetParser()->Parse(
"{noref ::= 1; ref := &&noref;}");
791 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
793 ast = jit->
GetParser()->Parse(
"{noref ::= 1; ref := &*noref;}");
795 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
799 ast = jit->
GetParser()->Parse(
" { val ::= 1; $local := val; } ");
801 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
805 ast = jit->
GetParser()->Parse(
"{ val ::= 1; { $local := val; } }");
807 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
809 ast = jit->
GetParser()->Parse(
"{ $val ::= 1; { $local := val; } }");
811 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
814 ast = jit->
GetParser()->Parse(
"{val ::= 1; { ::local := val; } }");
816 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
819 ast = jit->
GetParser()->Parse(
"{val ::= 1; ::val2 := *val;}");
821 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
825 ast = jit->
GetParser()->Parse(
"{&ref ::= 1; test := &ref;}");
827 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
829 ast = jit->
GetParser()->Parse(
"{&^ref ::= 1; test := &^ref;}");
831 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
833 ast = jit->
GetParser()->Parse(
"{&^ref ::= 1; test := &ref;}");
835 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
837 ast = jit->
GetParser()->Parse(
"{&?ref ::= 1; test := &?ref;}");
839 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
840 ast = jit->
GetParser()->Parse(
"{&&ref ::= 1; test := &&ref;}");
842 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
843 ast = jit->
GetParser()->Parse(
"{&*ref ::= 1; test := &*ref;}");
845 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
849 ast = jit->
GetParser()->Parse(
"{&ref ::= 1; test := &ref; test := 1}");
851 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
853 ast = jit->
GetParser()->Parse(
"{&ref ::= 1; test := &ref; *test = 1}");
855 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
857 ast = jit->
GetParser()->Parse(
"{&^ref ::= 1; test := &^ref; test = 1}");
859 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
862 ast = jit->
GetParser()->Parse(
"{&^ref ::= 1; test := &^ref; *test = 1}");
864 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
867 ast = jit->
GetParser()->Parse(
"{&?ref ::= 1; test := &?ref; test = 1}");
869 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
872 ast = jit->
GetParser()->Parse(
"{&?ref ::= 1; test := &?ref; *test = 1}");
874 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
876 ast = jit->
GetParser()->Parse(
"{&&ref ::= 1; test := &&ref; test = 1}");
878 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
881 ast = jit->
GetParser()->Parse(
"{&^ref ::= 1; test := &^ref; *test = 1}");
883 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
885 ast = jit->
GetParser()->Parse(
"{&*ref ::= 1; test := &*ref; test = 1}");
887 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
889 ast = jit->
GetParser()->Parse(
"{&*ref ::= 1; test := &*ref; *test = 1}");
891 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
896 ast = jit->
GetParser()->Parse(
"{&ref ::= 1; test := &ref; test = ref}");
898 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
900 ast = jit->
GetParser()->Parse(
"{&ref ::= 1; test := &ref; *test = ref}");
902 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
904 ast = jit->
GetParser()->Parse(
"{&^ref ::= 1; test := &^ref; test = ref}");
906 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
908 ast = jit->
GetParser()->Parse(
"{&^ref ::= 1; test := &^ref; *test = ref}");
910 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
913 ast = jit->
GetParser()->Parse(
"{&?ref ::= 1; test := &?ref; test = ref}");
915 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
917 ast = jit->
GetParser()->Parse(
"{&?ref ::= 1; test := &?ref; *test = ref}");
919 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
921 ast = jit->
GetParser()->Parse(
"{&&ref ::= 1; test := &&ref; test = ref}");
923 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
925 ast = jit->
GetParser()->Parse(
"{&&ref ::= 1; test := &&ref; *test = ref}");
927 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
930 ast = jit->
GetParser()->Parse(
"{&*ref ::= 1; test := &*ref; test = ref}");
932 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
934 ast = jit->
GetParser()->Parse(
"{&*ref ::= 1; test := &*ref; *test = ref}");
936 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
940 ast = jit->
GetParser()->Parse(
"{&val ::= 1; ref := &val; ref = *val}");
942 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
944 ast = jit->
GetParser()->Parse(
"{&val ::= 1; ref := &val; *ref = *val}");
946 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
948 ast = jit->
GetParser()->Parse(
"{&^val ::= 1; ref := &^val; ref = *val}");
950 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
953 ast = jit->
GetParser()->Parse(
"{&^val ::= 1; ref := &^val; *ref = *val}");
955 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
958 ast = jit->
GetParser()->Parse(
"{&?val ::= 1; ref := &?val; ref = *val}");
960 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
963 ast = jit->
GetParser()->Parse(
"{&?val ::= 1; ref := &?val; *ref = *val}");
965 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
967 ast = jit->
GetParser()->Parse(
"{&&val ::= 1; ref := &&val; ref = *val}");
969 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
971 ast = jit->
GetParser()->Parse(
"{&&val ::= 1; ref := &&val; *ref = *val}");
973 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
976 ast = jit->
GetParser()->Parse(
"{&*val ::= 1; ref := &*val; ref = *val}");
978 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << stack.Dump();
980 ast = jit->
GetParser()->Parse(
"{&*val ::= 1; ref := &*val; *ref = *val}");
982 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
985 ast = jit->
GetParser()->Parse(
"{& lite ::= 2; &^ lite_ro ::= 22;}");
987 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
990 ast = jit->
GetParser()->Parse(
"{&? thread ::= 3; &?^ thread_ro ::= 33;}");
992 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
995 ast = jit->
GetParser()->Parse(
"{&& mono ::= 4; &&^ mono_ro ::= 44; &?(mono) thread := 123; &?^(mono_ro, __timeout__=1000) thread2 := 123;}");
997 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
1000 ast = jit->
GetParser()->Parse(
"{&* multi ::= 5; &*^ multi_ro ::= 55; &?(multi) other := 123; &?^(multi_ro, __timeout__=1000) other2 := 123;}");
1002 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << stack.Dump();
1010TEST(Ast, Namespace) {
1012 JIT * jit = JIT::ReCreate();
1017 ASSERT_TRUE(stack.LookupName(
"Bool"));
1018 ASSERT_TRUE(stack.LookupName(
":Bool"));
1023 ast = jit->
GetParser()->Parse(
"Bool(1)");
1024 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << jit->
Dump();
1026 ast = jit->
GetParser()->Parse(
":Bool(1)");
1027 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << jit->
Dump();
1033 ASSERT_EQ(0, external[StorageTerm::MODULE_MAIN].size());
1034 ast = jit->
GetParser()->Parse(
"ns_test::func() ::= {};");
1035 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << jit->
Dump();
1036 ASSERT_EQ(1, external[StorageTerm::MODULE_MAIN].size()) << external[StorageTerm::MODULE_MAIN].Dump();
1038 ast = jit->
GetParser()->Parse(
"test { ns_test::func() }");
1039 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << jit->
Dump() <<
"Static:\n" << external[StorageTerm::MODULE_MAIN].Dump();
1041 ast = jit->
GetParser()->Parse(
"test { func() }");
1042 ASSERT_FALSE(analysis.Analyze(ast, &stack)) << jit->
Dump();
1044 ast = jit->
GetParser()->Parse(
"test { ... = ns_test; func() }");
1045 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << jit->
Dump();
1050 ast = jit->
GetParser()->Parse(
"$var := 1;");
1052 ASSERT_EQ(1, stack.size()) << stack.Dump();
1053 ASSERT_EQ(0, stack[0].vars.size()) << stack.Dump();
1054 ASSERT_TRUE(analysis.Analyze(ast, &stack));
1055 ASSERT_EQ(1, stack.size());
1056 ASSERT_EQ(1, stack[0].vars.size());
1057 ASSERT_TRUE(stack.LookupName(
"var$")) << stack.Dump();
1058 ASSERT_STREQ(
"$var", stack.LookupName(
"var$")->m_text.c_str());
1059 ASSERT_STREQ(
"var$", stack.LookupName(
"var$")->m_normalized.c_str());
1061 ast = jit->
GetParser()->Parse(
"var = 1;");
1063 ASSERT_EQ(1, stack.size()) << stack.Dump();
1064 ASSERT_EQ(1, stack[0].vars.size()) << stack.Dump();
1065 ASSERT_TRUE(analysis.Analyze(ast, &stack));
1066 ASSERT_TRUE(stack.LookupName(
"var$")) << stack.Dump();
1067 ASSERT_STREQ(
"$var", stack.LookupName(
"var$")->m_text.c_str());
1068 ASSERT_STREQ(
"var$", stack.LookupName(
"var$")->m_normalized.c_str());
1071 ASSERT_EQ(0, external[StorageTerm::MODULE_MAIN].size()) << external[StorageTerm::MODULE_MAIN].Dump();
1073 ast = jit->
GetParser()->Parse(
"::ns::var := 1;");
1075 ASSERT_EQ(1, stack.size()) << stack.Dump();
1076 ASSERT_EQ(1, stack[0].vars.size()) << stack.Dump();
1077 ASSERT_TRUE(analysis.Analyze(ast, &stack));
1078 ASSERT_TRUE(stack.LookupName(
"::ns::var::")) << stack.Dump();
1079 ASSERT_STREQ(
"::ns::var", stack.LookupName(
"::ns::var::")->m_text.c_str());
1080 ASSERT_STREQ(
"::ns::var::", stack.LookupName(
"::ns::var::")->m_normalized.c_str());
1082 ASSERT_EQ(1, external[StorageTerm::MODULE_MAIN].size()) << external[StorageTerm::MODULE_MAIN].Dump();
1084 ast = jit->
GetParser()->Parse(
"ns::var = 1;");
1086 ASSERT_EQ(1, stack.size()) << stack.Dump();
1087 ASSERT_EQ(1, stack[0].vars.size()) << stack.Dump();
1088 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << jit->
Dump(
"*ns::var*") <<
"Static:\n" << external[StorageTerm::MODULE_MAIN].Dump();
1089 ASSERT_TRUE(stack.LookupName(
"ns::var::")) << stack.Dump();
1090 ASSERT_STREQ(
"::ns::var", stack.LookupName(
"ns::var::")->m_text.c_str());
1091 ASSERT_STREQ(
"::ns::var::", stack.LookupName(
"ns::var::")->m_normalized.c_str());
1094 ast = jit->
GetParser()->Parse(
"name { var = 1; }");
1096 ASSERT_EQ(1, stack.size());
1097 ASSERT_TRUE(analysis.Analyze(ast, &stack));
1126 ast = jit->
GetParser()->Parse(
"name:: { ::var := 1; }");
1128 ASSERT_EQ(1, stack.size());
1129 ASSERT_TRUE(analysis.Analyze(ast, &stack));
1130 ASSERT_TRUE(stack.LookupName(
"::var::")) << stack.Dump();
1131 ASSERT_STREQ(
"::var", stack.LookupName(
"::var::")->m_text.c_str());
1132 ASSERT_STREQ(
"::var::", stack.LookupName(
"::var::")->m_normalized.c_str());
1134 ast = jit->
GetParser()->Parse(
"::name:: { ::ns2::var := 1; }");
1136 ASSERT_EQ(1, stack.size());
1137 ASSERT_TRUE(analysis.Analyze(ast, &stack));
1138 ASSERT_TRUE(stack.LookupName(
"::ns2::var::")) << stack.Dump();
1139 ASSERT_STREQ(
"::ns2::var", stack.LookupName(
"::ns2::var::")->m_text.c_str());
1140 ASSERT_STREQ(
"::ns2::var::", stack.LookupName(
"::ns2::var::")->m_normalized.c_str());
1168TEST(Ast, Interruption) {
1170 JIT * jit = JIT::ReCreate();
1178 ast = jit->
GetParser()->Parse(
"{ --; ++ }");
1180 ASSERT_EQ(1, ast->m_block.size());
1181 ASSERT_EQ(2, ast->m_block[0]->m_block.size());
1183 ast = jit->
GetParser()->Parse(
"{ { --; ++ } }");
1185 ASSERT_EQ(1, ast->m_block.size());
1186 ASSERT_EQ(1, ast->m_block[0]->m_block.size());
1187 ASSERT_EQ(2, ast->m_block[0]->m_block[0]->m_block.size());
1189 ast = jit->
GetParser()->Parse(
"ns { name { -- } }");
1191 ASSERT_EQ(1, ast->m_block.size());
1192 ASSERT_STREQ(
"ns", ast->m_namespace->m_text.c_str());
1193 ASSERT_EQ(1, ast->m_block[0]->m_block.size());
1194 ASSERT_TRUE(ast->m_block[0]->m_namespace);
1195 ASSERT_STREQ(
"name", ast->m_block[0]->m_namespace->m_text.c_str());
1198 ast = jit->
GetParser()->Parse(
":: --;");
1200 ASSERT_STREQ(
"::", ast->m_namespace->m_text.c_str());
1201 ASSERT_TRUE(analysis.Analyze(ast, &stack));
1202 ASSERT_TRUE(ast->m_namespace);
1203 ASSERT_STREQ(
"::", ast->m_namespace->m_text.c_str());
1205 ASSERT_NO_THROW(ast = jit->
GetParser()->Parse(
"name { name -- };"));
1207 ASSERT_TRUE(ast->isBlock());
1208 ASSERT_EQ(1, ast->m_block.size());
1209 ASSERT_STREQ(
"--", ast->m_block[0]->m_text.c_str());
1210 ASSERT_TRUE(ast->m_block[0]->isInterrupt());
1211 ASSERT_TRUE(ast->m_block[0]->m_namespace);
1212 ASSERT_STREQ(
"name::", ast->m_block[0]->m_namespace->m_text.c_str());
1213 ASSERT_TRUE(analysis.Analyze(ast, &stack));
1214 ASSERT_STREQ(
"name::", ast->m_block[0]->m_namespace->m_text.c_str());
1216 ASSERT_NO_THROW(ast = jit->
GetParser()->Parse(
"ns::name { ns::name -+ };"));
1217 ASSERT_TRUE(analysis.Analyze(ast, &stack));
1220 ASSERT_NO_THROW(ast = jit->
GetParser()->Parse(
"ns { name { ns +- } };"));
1221 ASSERT_TRUE(analysis.Analyze(ast, &stack));
1224 ASSERT_NO_THROW(ast = jit->
GetParser()->Parse(
"ns { { name { { ns:: ++ } } } };"));
1225 ASSERT_TRUE(analysis.Analyze(ast, &stack));
1228 ASSERT_NO_THROW(ast = jit->
GetParser()->Parse(
"{ ns::name { name:: { name:: +- } } };"));
1229 ASSERT_TRUE(analysis.Analyze(ast, &stack));
1232 ASSERT_NO_THROW(ast = jit->
GetParser()->Parse(
"ns::name { { name { local:: { ns::name ++ } } } };"));
1233 ASSERT_TRUE(analysis.Analyze(ast, &stack));
1236 ASSERT_NO_THROW(ast = jit->
GetParser()->Parse(
"ns { { name { local { local ++ } } } };"));
1237 ASSERT_TRUE(analysis.Analyze(ast, &stack));
1240 ASSERT_NO_THROW(ast = jit->
GetParser()->Parse(
"ns { { name { local:: { ns ++ } } } };"));
1241 ASSERT_TRUE(analysis.Analyze(ast, &stack));
1245 ASSERT_NO_THROW(ast = jit->
GetParser()->Parse(
"ns { { name { local:: { bad_name ++ } } } };"));
1246 ASSERT_FALSE(analysis.Analyze(ast, &stack));
1505 JIT * jit = JIT::ReCreate();
1512 ast = jit->
GetParser()->Parse(
"Bool(1)");
1513 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << jit->
Dump();
1515 ast = jit->
GetParser()->Parse(
":Bool(1)");
1516 ASSERT_TRUE(analysis.Analyze(ast, &stack)) << jit->
Dump();
1518 ASSERT_ANY_THROW(ast = jit->
GetParser()->Parse(
":Bool[](1)"));
1521 ast = jit->
GetParser()->Parse(
":Bool[...](1)");
1522 ASSERT_TRUE(analysis2.Analyze(ast));
1525 ast = jit->
GetParser()->Parse(
":Bool[ ..., ...](1)");
1526 ASSERT_FALSE(analysis3.Analyze(ast));
1529 ast = jit->
GetParser()->Parse(
":Bool[0](1)");
1530 ASSERT_TRUE(analysis4.Analyze(ast));
1533 ast = jit->
GetParser()->Parse(
":Bool[_](1)");
1534 ASSERT_TRUE(analysis5.Analyze(ast));
1537 ast = jit->
GetParser()->Parse(
":Bool[0..1..2](1)");
1538 ASSERT_TRUE(analysis6.Analyze(ast));
1541 ast = jit->
GetParser()->Parse(
"0.._..2");
1542 ASSERT_TRUE(analysis7.Analyze(ast));
2000TEST(Ast, CheckStrPrintf) {
2002 TermPtr args = Term::CreateDict();
2004 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"", args, 0));
2005 args->push_back(Term::CreateName(
""));
2006 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"", args, 0));
2007 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"", args, 1));
2009 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s", args, 0));
2010 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s", args, 1));
2011 args->push_back(Term::CreateName(
""));
2012 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s", args, 1));
2013 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s", args, 2));
2015 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d", args, 0));
2016 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d", args, 1));
2017 args->push_back(Term::CreateName(
"1"));
2019 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d", args, 1));
2020 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d", args, 2));
2022 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d%d", args, 0));
2023 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d%d", args, 1));
2024 args->push_back(Term::CreateName(
"1"));
2026 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d%d", args, 1));
2027 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d%ld", args, 1));
2029 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d%ld", args, 1));
2030 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d%ld", args, 2));
2032 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d%ld%f", args, 0));
2033 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d%ld%f", args, 1));
2034 args->push_back(Term::CreateName(
"0"));
2035 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d%ld%f", args, 1));
2036 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d%ld%f", args, 2));
2038 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d%ld%f%s", args, 0));
2039 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d%ld%f%s", args, 1));
2040 args->push_back(Term::CreateName(
""));
2041 ASSERT_TRUE(AstAnalysis::CheckStrPrintf(
"%s%d%ld%f%s", args, 1));
2042 ASSERT_FALSE(AstAnalysis::CheckStrPrintf(
"%s%d%ld%f%s", args, 2));
2065TEST(Ast, CheckStrFormat) {
2067 TermPtr args = Term::CreateDict();
2070 ASSERT_ANY_THROW(AstAnalysis::ConvertToVFormat_(
"{", *args));
2072 ASSERT_STREQ(
"", AstAnalysis::ConvertToVFormat_(
"", *args).c_str());
2073 ASSERT_STREQ(
"{{", AstAnalysis::ConvertToVFormat_(
"{{", *args).c_str());
2074 ASSERT_STREQ(
"format", AstAnalysis::ConvertToVFormat_(
"format", *args).c_str());
2075 ASSERT_STREQ(
"{}", AstAnalysis::ConvertToVFormat_(
"{}", *args).c_str());
2076 ASSERT_STREQ(
"{1}", AstAnalysis::ConvertToVFormat_(
"{1}", *args).c_str());
2077 ASSERT_STREQ(
"{1:}", AstAnalysis::ConvertToVFormat_(
"{1:}", *args).c_str());
2078 ASSERT_STREQ(
"{:0}", AstAnalysis::ConvertToVFormat_(
"{:0}", *args).c_str());
2079 ASSERT_STREQ(
"{:0}{:0}", AstAnalysis::ConvertToVFormat_(
"{:0}{:0}", *args).c_str());
2080 ASSERT_STREQ(
"{1:1}{1:1}", AstAnalysis::ConvertToVFormat_(
"{1:1}{1:1}", *args).c_str());
2082 ASSERT_ANY_THROW(AstAnalysis::ConvertToVFormat_(
"{{{1:1}{1:1", *args));
2083 ASSERT_STREQ(
"{{{1:1}{1:1}", AstAnalysis::ConvertToVFormat_(
"{{{1:1}{1:1}", *args).c_str());
2084 ASSERT_STREQ(
"{{{1:1}{1:1}}}", AstAnalysis::ConvertToVFormat_(
"{{{1:1}{1:1}}}", *args).c_str());
2086 args->push_back(Term::CreateNone(),
"name");
2087 ASSERT_STREQ(
"{0}", AstAnalysis::ConvertToVFormat_(
"{name}", *args).c_str());
2088 ASSERT_STREQ(
"{0}{0}", AstAnalysis::ConvertToVFormat_(
"{name}{name}", *args).c_str());
2089 ASSERT_STREQ(
"{0:0}{0:123}{0:0.0}", AstAnalysis::ConvertToVFormat_(
"{name:0}{0:123}{name:0.0}", *args).c_str());
2090 ASSERT_STREQ(
"{0}{0}", AstAnalysis::ConvertToVFormat_(
"{0}{name}", *args).c_str());
2092 ASSERT_STREQ(
"{{{0}}}", AstAnalysis::ConvertToVFormat_(
"{{{0}}}", *args).c_str());
2093 ASSERT_STREQ(
"{{{0}}}", AstAnalysis::ConvertToVFormat_(
"{{{name}}}", *args).c_str());
2095 ASSERT_STREQ(
"{{0}{0}}", AstAnalysis::ConvertToVFormat_(
"{{0}{name}}", *args).c_str());
2096 ASSERT_STREQ(
"{{{0}{0}}", AstAnalysis::ConvertToVFormat_(
"{{{0}{name}}", *args).c_str());
2099 args->push_back(Term::CreateNone(),
"name2");
2100 ASSERT_STREQ(
"{0}{1}", AstAnalysis::ConvertToVFormat_(
"{name}{name2}", *args).c_str());
2101 ASSERT_STREQ(
"{1}", AstAnalysis::ConvertToVFormat_(
"{name2}", *args).c_str());
2102 ASSERT_STREQ(
"{1:0}{1:.0}{0:0.0}", AstAnalysis::ConvertToVFormat_(
"{name2:0}{1:.0}{name:0.0}", *args).c_str());
2103 ASSERT_STREQ(
"{1}{0}", AstAnalysis::ConvertToVFormat_(
"{name2}{name}", *args).c_str());
2105 ASSERT_STREQ(
"{{name2}{0}}", AstAnalysis::ConvertToVFormat_(
"{{name2}{name}}", *args).c_str());
2106 ASSERT_STREQ(
"{{{1}{0}}", AstAnalysis::ConvertToVFormat_(
"{{{name2}{name}}", *args).c_str());
2107 ASSERT_STREQ(
"{{{1}}}", AstAnalysis::ConvertToVFormat_(
"{{{name2}}}", *args).c_str());
2109 ASSERT_STREQ(
"{{{0}}}", AstAnalysis::ConvertToVFormat_(
"{{{name}}}", *args).c_str());
2112 ASSERT_TRUE(!args->size());
2114 ASSERT_STREQ(
"", AstAnalysis::MakeFormat(
"", args,
nullptr). c_str());
2115 ASSERT_ANY_THROW(AstAnalysis::MakeFormat(
"{", args,
nullptr));
2116 ASSERT_STREQ(
"{", AstAnalysis::MakeFormat(
"{{", args,
nullptr). c_str());
2118 ASSERT_NO_THROW(ASSERT_STREQ(
"{}", AstAnalysis::MakeFormat(
"{{}}", args,
nullptr). c_str()));
2119 ASSERT_ANY_THROW(ASSERT_STREQ(
"{}", AstAnalysis::MakeFormat(
"{{{}}}", args,
nullptr). c_str()));
2121 args->push_back(Term::CreateNone(),
"none");
2122 ASSERT_NO_THROW(ASSERT_STREQ(
"{_}", AstAnalysis::MakeFormat(
"{{{}}}", args,
nullptr). c_str()));
2123 ASSERT_NO_THROW(ASSERT_STREQ(
"{_}", AstAnalysis::MakeFormat(
"{{{none}}}", args,
nullptr). c_str()));
2126 ASSERT_NO_THROW(ASSERT_STREQ(
"_", AstAnalysis::MakeFormat(
"{none}", args,
nullptr). c_str()));
2128 args->push_back(Term::CreateName(
"string", TermID::STRCHAR),
"str");
2129 ASSERT_NO_THROW(ASSERT_STREQ(
"'string'", AstAnalysis::MakeFormat(
"{str}", args,
nullptr). c_str()));
2131 args->push_back(Term::CreateName(
"123", TermID::STRCHAR),
"int");
2132 ASSERT_NO_THROW(ASSERT_STREQ(
"'123'", AstAnalysis::MakeFormat(
"{int}", args,
nullptr). c_str()));
2134 ASSERT_NO_THROW(ASSERT_STREQ(
"_", AstAnalysis::MakeFormat(
"{}", args,
nullptr). c_str()));
2135 ASSERT_NO_THROW(ASSERT_STREQ(
"_'string'", AstAnalysis::MakeFormat(
"{}{}", args,
nullptr). c_str()));
2136 ASSERT_NO_THROW(ASSERT_STREQ(
"_'string''123'", AstAnalysis::MakeFormat(
"{}{}{}", args,
nullptr). c_str()));
2138 ASSERT_NO_THROW(ASSERT_STREQ(
"'string'", AstAnalysis::MakeFormat(
"{1}", args,
nullptr). c_str()));
2139 ASSERT_NO_THROW(ASSERT_STREQ(
"_'string'_", AstAnalysis::MakeFormat(
"{0}{1}{0}", args,
nullptr). c_str()));
2140 ASSERT_NO_THROW(ASSERT_STREQ(
"'string''123'_", AstAnalysis::MakeFormat(
"{1}{2}{none}", args,
nullptr). c_str()));
2142 ASSERT_NO_THROW(ASSERT_STREQ(
"_'string''123'_", AstAnalysis::MakeFormat(
"{none}{str}{int}{none}", args,
nullptr). c_str()));
2145TEST(Ast, MakeInclude) {
2148 str = AstAnalysis::MakeInclude(Term::CreateName(
"name"));
2149 ASSERT_STREQ(
"", str.c_str());
2151 str = AstAnalysis::MakeInclude(ParseString(
"::val := 1;"));
2152 ASSERT_STREQ(
"::val := ...;\n", str.c_str());
2154 str = AstAnalysis::MakeInclude(ParseString(
"::val := 1; $val2 := 1; @::val3 := 1; val4 := 1;"));
2155 ASSERT_STREQ(
"::val := ...;\n@::val3 := ...;\nval4 := ...;\n", str.c_str());
2157 str = AstAnalysis::MakeInclude(ParseString(
"::val, val2, @::val3 := 1; $val4 := 1;"));
2158 ASSERT_STREQ(
"::val := ...;\nval2 := ...;\n@::val3 := ...;\n", str.c_str());
2160 str = AstAnalysis::MakeInclude(ParseString(
"@@ macro @@ := 1; @@ macro2 @@ := @@ 2 @@; @@@@ macro @@@@;"));
2161 ASSERT_STREQ(
"@@ macro @@ := 1;\n@@ macro2 @@ := @@ 2 @@;\n@@@@ macro @@@@;\n", str.c_str());
std::string Dump(const std::string_view filter="", const char delim=';')
std::map< std::string, StorageTerm > ModuleMapType
const TermPtr getDefaultType(const std::string_view text)
std::vector< std::string > PostLexerType
std::string ExtractName(std::string name)
std::shared_ptr< Term > TermPtr
std::shared_ptr< RunTime > RuntimePtr
std::string ExtractModuleName(const std::string_view name)
std::shared_ptr< Macro > MacroPtr
std::shared_ptr< Diag > DiagPtr