4#include <gtest/gtest.h>
21TEST(Example, SpeedCPP) {
25 std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
27 std::string opt =
"ACGT";
29 std::string s_last =
"";
33 for (
int i = 0; i < len_str; i++) {
37 for (
int i = 0; i < len_str; i++) {
48 for (
int i = 0; i < len_str; i++) {
50 if (s[i] == opt.back()) {
63 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
64 int sec = (int) std::chrono::duration_cast<std::chrono::seconds>(end - begin).count();
65 int ms = (int) std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count() % 1000000;
66 LOG_INFO(
"Float of generated k-mers: %d at %d.%d sec", counter, sec, ms);
70TEST(Example, DISABLED_SpeedNewLang) {
75 setvbuf(stdin,
nullptr, _IONBF, 0);
76 setvbuf(stdout,
nullptr, _IONBF, 0);
77 setvbuf(stderr,
nullptr, _IONBF, 0);
82 ObjPtr str = jit->Run(
"str := 'ABCDEF\\n';",
nullptr);
84 ASSERT_STREQ(
"ABCDEF\n", str->GetValueAsString().c_str());
86 test = jit->Run(
"str := 'ABCDEF\\n'; print('%s', str)");
88 ASSERT_STREQ(
"7", test->GetValueAsString().c_str());
90 test = jit->Run(
"str[2] = 32; str",
nullptr);
92 ASSERT_STREQ(
"AB DEF\n", test->GetValueAsString().c_str());
94 test = jit->Run(
"str[0]",
nullptr);
96 ASSERT_STREQ(
"A", test->GetValueAsString().c_str());
98 test = jit->Run(
"str[1]",
nullptr);
100 ASSERT_STREQ(
"B", test->GetValueAsString().c_str());
102 test = jit->Run(
"str[2]",
nullptr);
104 ASSERT_STREQ(
" ", test->GetValueAsString().c_str());
107 ObjPtr test_convert = jit->Run(
"test_convert(sym:Int8):Int8 := %convert ...");
108 ASSERT_TRUE(test_convert);
116 test = jit->Run(
"test_convert(65)",
nullptr);
118 ASSERT_STREQ(
"67", test->GetValueAsString().c_str());
119 test = jit->Run(
"test_convert(67)",
nullptr);
121 ASSERT_STREQ(
"71", test->GetValueAsString().c_str());
123 test = jit->Run(
"test_convert(71)",
nullptr);
125 ASSERT_STREQ(
"84", test->GetValueAsString().c_str());
127 test = jit->Run(
"test_convert(84)",
nullptr);
129 ASSERT_STREQ(
"65", test->GetValueAsString().c_str());
131 ASSERT_NO_THROW(test = jit->Run(
"str"));
133 ASSERT_STREQ(
"AB DEF\n", test->GetValueAsString().c_str());
135 ASSERT_NO_THROW(test = jit->Run(
"str[0]"));
137 ASSERT_STREQ(
"A", test->GetValueAsString().c_str());
139 ASSERT_NO_THROW(test = jit->Run(
":Int8('A')"));
141 ASSERT_STREQ(
"65", test->GetValueAsString().c_str());
147 ASSERT_NO_THROW(test = jit->Run(
"test_convert(:Int8(str[0]))"));
149 ASSERT_STREQ(
"67", test->GetValueAsString().c_str());
151 ASSERT_NO_THROW(test = jit->Run(
"str[0] = test_convert(:Int8(str[0])); str"));
153 ASSERT_STREQ(
"CB DEF\n", test->GetValueAsString().c_str());
156 std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
157 ObjPtr result = jit->RunFile(
"../examples/speed_test.src");
158 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
159 Logger::Instance()->SetLogLevel(save);
164 ASSERT_TRUE(
result->is_string_type()) <<
result->toString();
165 ASSERT_STREQ(
"OK",
result->GetValueAsString().c_str());
168 int sec = (int) std::chrono::duration_cast<std::chrono::seconds>(end - begin).count();
169 int ms = (int) std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count() % 1000000;
170 LOG_INFO(
"Test speed complete at %d.%d sec", sec, ms);
227 setvbuf(stdin,
nullptr, _IONBF, 0);
228 setvbuf(stdout,
nullptr, _IONBF, 0);
229 setvbuf(stderr,
nullptr, _IONBF, 0);
240 ASSERT_NO_THROW(str = jit->Run(
"str := 'ABCDEF\\n';"));
242 ASSERT_STREQ(
"ABCDEF\n", str->GetValueAsString().c_str());
245 ASSERT_NO_THROW(test_printf = jit->Run(
"test_printf(format:FmtChar, ...):Int32 := %printf...")) <<
Dump(*rt) <<
"\n" << rt->m_main_ast->m_int_vars.Dump();
246 ASSERT_TRUE(test_printf);
247 ASSERT_STREQ(
"test_printf::(format:FmtChar, ...):Int32{ }", test_printf->toString().c_str());
250 ASSERT_NO_THROW(iter = jit->Run(
"iterator := (1, 5, 9999,)?"));
252 ASSERT_TRUE(iter->getType() == ObjType::Iterator);
253 ASSERT_TRUE(iter->m_iterator);
254 ASSERT_TRUE(*iter->m_iterator.get() == iter->m_iterator->begin());
255 ASSERT_TRUE(*iter->m_iterator.get() != iter->m_iterator->end());
257 ObjPtr test_frac = jit->Run(
"test_frac := 999\\123");
258 ASSERT_TRUE(test_frac);
259 ASSERT_TRUE(test_frac->getType() == ObjType::Rational);
260 ASSERT_STREQ(
"999\\123", test_frac->GetValueAsString().c_str());
262 ObjPtr str_frac = jit->Run(
":StrChar(test_frac)");
263 ASSERT_TRUE(str_frac);
264 ASSERT_TRUE(str_frac->getType() == ObjType::StrChar) <<
newlang::toString(str_frac->getType());
265 ASSERT_STREQ(
"999\\123", str_frac->GetValueAsString().c_str()) << str_frac->GetValueAsString();
267 ObjPtr test_prn = jit->Run(
"test_printf('%s\\n', :StrChar(test_frac))");
268 ASSERT_TRUE(test_prn);
269 ASSERT_STREQ(
"8", test_prn->GetValueAsString().c_str());
272 ASSERT_NO_THROW(test_arg = jit->Run(
"test_arg(arg:Rational) := {$arg*$arg}"));
273 ASSERT_TRUE(test_arg);
274 ASSERT_TRUE(test_arg->is_function_type());
275 ASSERT_FALSE(test_arg->is_none_type());
276 ASSERT_STREQ(
"test_arg::(arg:Rational){ }", test_arg->toString().c_str());
281 ASSERT_ANY_THROW(frac_test = jit->Run(
"test_arg()"));
282 ASSERT_ANY_THROW(frac_test = jit->Run(
"test_arg('')"));
284 ASSERT_NO_THROW(frac_test = jit->Run(
"test_arg(1)"))
285 << rt->m_main_ast->m_int_vars.Dump() <<
"\n"
286 << rt->m_main_ast->m_int_vars.find(
"test_arg$")->second->m_int_vars.Dump();
288 ASSERT_TRUE(frac_test);
289 ASSERT_EQ(ObjType::Rational, frac_test->getType()) <<
newlang::toString(frac_test->getType());
290 ASSERT_STREQ(
"1\\1", frac_test->GetValueAsString().c_str());
292 ASSERT_NO_THROW(frac_test = jit->Run(
"test_arg(2\\1)"));
293 ASSERT_TRUE(frac_test);
294 ASSERT_STREQ(
"4\\1", frac_test->GetValueAsString().c_str());
297 ASSERT_NO_THROW(iter_test = jit->Run(
"iter_test := :Int64(5+1)..1..-1?"));
298 ASSERT_TRUE(iter_test);
299 ASSERT_STREQ(
":Iterator", iter_test->toString().c_str());
302 ASSERT_NO_THROW(fact_range_test = jit->Run(
""
304 "iter_cnt := @iter(6..1..-1);"
305 "[ @curr(iter_cnt) ] <-> {"
306 " print('1: n=%s, iter=%s\\n', :StrChar(n), :StrChar(@curr(iter_cnt)));"
307 " n *= @next(iter_cnt);"
308 " print('2: n=%s\\n', :StrChar(n));"
312 ASSERT_TRUE(fact_range_test);
313 ASSERT_STREQ(
"720\\1", fact_range_test->toString().c_str());
317 ASSERT_NO_THROW(
result = jit->RunFile(
"../examples/fact_40.src"));
319 ASSERT_STREQ(
"815915283247897734345611269596115894272000000000\\1",
result->GetValueAsString().c_str());
321 ASSERT_NO_THROW(
result = jit->RunFile(
"../examples/fact_40_dsl.src"));
323 ASSERT_STREQ(
"815915283247897734345611269596115894272000000000\\1",
result->GetValueAsString().c_str());
327 std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
328 ASSERT_NO_THROW(
result = jit->RunFile(
"../examples/rational.src"));
329 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
330 Logger::Instance()->SetLogLevel(save);
333 ASSERT_STREQ(
"402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\1",
result->GetValueAsString().c_str());
335 int sec = (int) std::chrono::duration_cast<std::chrono::seconds>(end - begin).count();
336 int ms = (int) std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count() % 1000000;
337 LOG_INFO(
"Test factorial 1000! complete at %d.%d sec", sec, ms);
353TEST(Example, Tensor) {
359 TermPtr ast = rt->GetParser()->Parse(
"print('%%%s\\n', :StrChar(123))");
363 ASSERT_TRUE(analysis.Analyze(ast, ast));
364 ASSERT_EQ(2, ast->size());
365 ASSERT_TRUE((*ast)[0].second->m_id == TermID::STRCHAR);
366 ASSERT_TRUE((*ast)[1].second->m_id == TermID::TYPE);
367 ASSERT_TRUE(!(*ast)[1].second->m_int_name.empty());
370 ast = rt->GetParser()->Parse(
"var := 123; var2 := var * 123");
374 ASSERT_TRUE(analysis2.Analyze(ast, ast));
375 ASSERT_EQ(2, ast->m_block.size()) << ast->m_int_vars.Dump();
376 ASSERT_TRUE(!ast->m_block[0]->m_left->m_int_name.empty());
377 ASSERT_TRUE(!ast->m_block[1]->m_left->m_int_name.empty());
378 ASSERT_TRUE(ast->m_block[1]->m_right->getTermID() == TermID::OP_MATH);
379 TermPtr math = ast->m_block[1]->m_right;
380 ASSERT_TRUE(math->m_right);
381 ASSERT_TRUE(math->m_left);
382 ASSERT_TRUE(!math->m_left->m_int_name.empty());
385 ast = rt->GetParser()->Parse(
"rand():Int32 := %rand ...;");
389 ASSERT_TRUE(analysis3.Analyze(ast, ast));
390 ASSERT_TRUE(ast->m_right);
391 ASSERT_TRUE(ast->m_left);
392 ASSERT_TRUE(!ast->m_left->m_int_name.empty());
395 ast = rt->GetParser()->Parse(
"r():Int32 := %rand ...; :Tensor[10](42, ... r() ...)");
399 ASSERT_TRUE(analysis4.Analyze(ast, ast));
400 ASSERT_EQ(2, ast->m_block.size()) << ast->m_int_vars.Dump();
401 ASSERT_TRUE(!ast->m_block[0]->m_left->m_int_name.empty());
403 TermPtr t = ast->m_block[0]->m_left;
405 ASSERT_TRUE(!t->m_int_name.empty()) << t->toString();
409 ASSERT_EQ(2, t->size());
410 ASSERT_TRUE((*t)[1].second);
411 ASSERT_TRUE((*t)[1].second->m_right);
412 ASSERT_TRUE(!(*t)[1].second->m_right->m_int_name.empty()) << (*t)[1].second->m_right->toString();
416 ast = rt->GetParser()->Parse(
"sss := :Tensor[10](42, ... rnda() ...)");
420 ASSERT_FALSE(analysis5.Analyze(ast, ast));
423 setvbuf(stdin,
nullptr, _IONBF, 0);
424 setvbuf(stdout,
nullptr, _IONBF, 0);
425 setvbuf(stderr,
nullptr, _IONBF, 0);
429 std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
431 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
432 Logger::Instance()->SetLogLevel(save);
436 ASSERT_TRUE(
result->is_integer()) <<
result->toString();
437 ASSERT_TRUE(
result->GetValueAsInteger() == 20) <<
result->toString();
452TEST(Example, Hello) {
458 ASSERT_NO_THROW(prn = jit->Run(
"prn(format:FmtChar, ...):Int32 ::= %printf ..."));
461 ObjPtr res = (*prn)(
"Привет, мир!\n");
463 ASSERT_TRUE(res->is_integer()) << res->toString();
464 ASSERT_STREQ(
"22", res->GetValueAsString().c_str());
480 setvbuf(stdin,
nullptr, _IONBF, 0);
481 setvbuf(stdout,
nullptr, _IONBF, 0);
482 setvbuf(stderr,
nullptr, _IONBF, 0);
486 std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
488 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
489 Logger::Instance()->SetLogLevel(save);
493 ASSERT_TRUE(
result->is_integral()) <<
result->toString();
494 ASSERT_STREQ(
"14",
result->GetValueAsString().c_str());
510 RuntimePtr rt = RunTime::Init({
"--nlc-no-eval-enable"});
512 ASSERT_FALSE(rt->m_eval_enable);
513 ASSERT_ANY_THROW(jit->Run(
"`ls`"));
514 rt->m_eval_enable =
true;
517 ASSERT_NO_THROW(exec = jit->Run(
"`ls`"));
519 ASSERT_TRUE(exec->is_string_char_type()) << exec->toString();
520 ASSERT_TRUE(exec->GetValueAsString().find(
"nlc_test\n") != std::string::npos);
std::shared_ptr< Term > TermPtr
std::shared_ptr< Obj > ObjPtr
std::shared_ptr< RunTime > RuntimePtr
const char * toString(TermID type)
std::string Dump(const T &iterable)