4#include <gtest/gtest.h>
6#include <torch/torch.h>
25 ObjPtr res = jit->Run(
"123");
27 ASSERT_STREQ(
"123", res->toString().c_str());
28 ASSERT_EQ(1, rt->m_main_ast->m_block.size());
30 res = jit->Run(
"123.456");
32 ASSERT_STREQ(
"123.456", res->toString().c_str());
33 ASSERT_EQ(2, rt->m_main_ast->m_block.size());
35 res = jit->Run(
"'123.456'");
37 ASSERT_STREQ(
"'123.456'", res->toString().c_str());
38 ASSERT_EQ(3, rt->m_main_ast->m_block.size());
40 res = jit->Run(
"\"123.456\"");
42 ASSERT_STREQ(
"\"123.456\"", res->toString().c_str());
43 ASSERT_EQ(4, rt->m_main_ast->m_block.size());
45 res = jit->Run(
"(,)");
47 ASSERT_STREQ(
"(,)", res->toString().c_str());
48 ASSERT_EQ(5, rt->m_main_ast->m_block.size());
50 res = jit->Run(
"(123,)");
52 ASSERT_STREQ(
"(123,)", res->toString().c_str());
53 ASSERT_EQ(6, rt->m_main_ast->m_block.size());
55 res = jit->Run(
"(name=123,)");
57 ASSERT_STREQ(
"(name=123,)", res->toString().c_str());
58 ASSERT_EQ(7, rt->m_main_ast->m_block.size());
60 res = jit->Run(
"(name=123,):ClassName");
62 ASSERT_STREQ(
"(name=123,):ClassName", res->toString().c_str());
63 ASSERT_EQ(8, rt->m_main_ast->m_block.size());
65 res = jit->Run(
"[123,]");
67 ASSERT_STREQ(
"[123,]:Int8", res->toString().c_str());
68 ASSERT_EQ(9, rt->m_main_ast->m_block.size());
70 res = jit->Run(
"[123,456,]:Float32");
72 ASSERT_STREQ(
"[123, 456,]:Float32", res->toString().c_str());
73 ASSERT_EQ(10, rt->m_main_ast->m_block.size());
87 size_t glob_count = rt->size();
89 ObjPtr res = jit->Run(
"::var_glob := 123");
91 ASSERT_EQ(1, rt->size() - glob_count);
92 ASSERT_EQ(1, rt->m_main_ast->m_block.size());
93 ASSERT_EQ(0, rt->m_main_runner->size()) << rt->m_main_runner->Dump();
94 ASSERT_EQ(1, rt->m_main_ast->m_int_vars.size()) << rt->m_main_ast->m_int_vars.Dump();
95 ASSERT_STREQ(
"123", res->toString().c_str());
97 res = jit->Run(
"var_mod := 456");
99 ASSERT_STREQ(
"456", res->toString().c_str());
100 ASSERT_EQ(1, rt->size() - glob_count);
101 ASSERT_EQ(2, rt->m_main_ast->m_block.size());
102 ASSERT_EQ(0, rt->m_main_runner->size());
103 ASSERT_EQ(2, rt->m_main_ast->m_int_vars.size()) << rt->m_main_ast->m_int_vars.Dump();
106 res = jit->Run(
"$var_loc := 789");
108 ASSERT_STREQ(
"789", res->toString().c_str());
109 ASSERT_EQ(1, rt->size() - glob_count);
110 ASSERT_EQ(3, rt->m_main_ast->m_block.size());
111 ASSERT_EQ(0, rt->m_main_runner->size());
112 ASSERT_EQ(3, rt->m_main_ast->m_int_vars.size()) << rt->m_main_ast->m_int_vars.Dump();
115 res = jit->Run(
"::var_glob2 := var_glob");
117 ASSERT_STREQ(
"123", res->toString().c_str());
118 ASSERT_EQ(2, rt->size() - glob_count);
119 ASSERT_EQ(4, rt->m_main_ast->m_block.size());
120 ASSERT_EQ(0, rt->m_main_runner->size());
121 ASSERT_EQ(4, rt->m_main_ast->m_int_vars.size()) << rt->m_main_ast->m_int_vars.Dump();
123 ASSERT_ANY_THROW(jit->Run(
"var_mod ::= 0")) <<
Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
124 ASSERT_ANY_THROW(jit->Run(
"var_mod2 = 0")) <<
Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
125 ASSERT_NO_THROW(res = jit->Run(
"var_mod2 ::= var_mod")) <<
Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
127 ASSERT_STREQ(
"456", res->toString().c_str());
128 ASSERT_EQ(2, rt->size() - glob_count);
129 ASSERT_EQ(5, rt->m_main_ast->m_block.size());
130 ASSERT_EQ(0, rt->m_main_runner->size());
131 ASSERT_EQ(5, rt->m_main_ast->m_int_vars.size()) << rt->m_main_ast->m_int_vars.Dump();
133 ASSERT_NO_THROW(res = jit->Run(
"$var_loc2 := $var_loc")) <<
Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
135 ASSERT_STREQ(
"789", res->toString().c_str());
136 ASSERT_EQ(2, rt->size() - glob_count);
137 ASSERT_EQ(6, rt->m_main_ast->m_block.size());
138 ASSERT_EQ(0, rt->m_main_runner->size());
139 ASSERT_EQ(6, rt->m_main_ast->m_int_vars.size()) << rt->m_main_ast->m_int_vars.Dump();
143 ASSERT_ANY_THROW(jit->Run(
"::var_glob2 ::= -1"));
144 res = jit->Run(
"::var_glob2 = -1");
146 ASSERT_STREQ(
"-1", res->toString().c_str());
147 ASSERT_EQ(2, rt->size() - glob_count);
148 ASSERT_EQ(7, rt->m_main_ast->m_block.size());
149 ASSERT_EQ(0, rt->m_main_runner->size());
150 ASSERT_EQ(6, rt->m_main_ast->m_int_vars.size());
153 ASSERT_NO_THROW(res = jit->Run(
"var_mod2 = -2")) <<
Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
155 ASSERT_STREQ(
"-2", res->toString().c_str());
156 ASSERT_EQ(2, rt->size() - glob_count);
157 ASSERT_EQ(8, rt->m_main_ast->m_block.size());
158 ASSERT_EQ(0, rt->m_main_runner->size());
159 ASSERT_EQ(6, rt->m_main_ast->m_int_vars.size());
161 ASSERT_ANY_THROW(jit->Run(
"$var_loc2 ::= -3"));
162 res = jit->Run(
"$var_loc2 = -3");
164 ASSERT_STREQ(
"-3", res->toString().c_str());
165 ASSERT_EQ(2, rt->size() - glob_count);
166 ASSERT_EQ(9, rt->m_main_ast->m_block.size());
167 ASSERT_EQ(0, rt->m_main_runner->size());
168 ASSERT_EQ(6, rt->m_main_ast->m_int_vars.size());
170 res = jit->Run(
"@::glob := -5");
172 ASSERT_STREQ(
"-5", res->toString().c_str());
173 ASSERT_EQ(2, rt->size() - glob_count);
174 ASSERT_EQ(10, rt->m_main_ast->m_block.size());
175 ASSERT_EQ(0, rt->m_main_runner->size());
176 ASSERT_EQ(7, rt->m_main_ast->m_int_vars.size());
184 size_t glob_count = rt->size();
185 ASSERT_FALSE(rt->m_main_ast);
186 ASSERT_FALSE(rt->m_main_runner);
188 ObjPtr res = jit->Run(
"::func_glob() := { 123 }");
190 ASSERT_EQ(1, rt->size() - glob_count) <<
Dump(*rt);
191 ASSERT_EQ(1, rt->m_main_ast->m_block.size());
192 ASSERT_EQ(0, rt->m_main_runner->size());
193 ASSERT_EQ(1, rt->m_main_ast->m_int_vars.size()) << rt->m_main_ast->m_int_vars.Dump();
194 ASSERT_STREQ(
"::func_glob::(){ }", res->toString().c_str());
196 res = jit->Run(
"::func_glob()");
198 ASSERT_STREQ(
"123", res->toString().c_str());
200 ASSERT_ANY_THROW(jit->Run(
"::func_glob ::= {}")) <<
Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
201 ASSERT_ANY_THROW(jit->Run(
"::func_glob = {}")) <<
Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
204 res = jit->Run(
"func_loc() := { 456 }");
206 ASSERT_EQ(1, rt->size() - glob_count);
207 ASSERT_EQ(3, rt->m_main_ast->m_block.size());
208 ASSERT_EQ(0, rt->m_main_runner->size());
209 ASSERT_EQ(2, rt->m_main_ast->m_int_vars.size());
210 ASSERT_STREQ(
"func_loc::(){ }", res->toString().c_str());
212 ASSERT_NO_THROW(res = jit->Run(
"func_loc()")) <<
Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
215 ASSERT_STREQ(
"456", res->toString().c_str());
217 ASSERT_NO_THROW(res = jit->Run(
"$func_loc()")) <<
Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
220 ASSERT_STREQ(
"456", res->toString().c_str());
222 res = jit->Run(
"@::func() := { 789 }");
224 ASSERT_EQ(1, rt->size() - glob_count);
225 ASSERT_EQ(6, rt->m_main_ast->m_block.size());
226 ASSERT_EQ(0, rt->m_main_runner->size());
227 ASSERT_EQ(3, rt->m_main_ast->m_int_vars.size());
228 ASSERT_STREQ(
"@::func::(){ }", res->toString().c_str());
230 ASSERT_NO_THROW(res = jit->Run(
"@::func()")) <<
Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
232 ASSERT_STREQ(
"789", res->toString().c_str());
234 ASSERT_NO_THROW(res = jit->Run(
"func()")) <<
Dump(*rt) << rt->m_main_ast->m_int_vars.Dump();
236 ASSERT_STREQ(
"789", res->toString().c_str());
303static int64_t var_long = 987654321;
305static int64_t func_export(int64_t arg_long, uint8_t arg_byte) {
306 return arg_long + 2 * arg_byte;
313 ObjPtr list = jit->Run(
"$?!");
314 ASSERT_STREQ(
"(,)", list->toString().c_str());
316 ObjPtr var1 = jit->Run(
"var1 ::= 123");
318 ASSERT_TRUE(var1->is_arithmetic_type());
319 ASSERT_TRUE(var1->is_integer());
320 ASSERT_TRUE(std::holds_alternative<int64_t>(var1->m_var));
321 ASSERT_EQ(var1->m_var_type_current, ObjType::Int8) <<
newlang::toString(var1->m_var_type_current);
322 ASSERT_EQ(var1->m_var_type_fixed, ObjType::None) <<
newlang::toString(var1->m_var_type_fixed);
323 ASSERT_STREQ(
"123", var1->toString().c_str());
325 list = jit->Run(
"$?!");
326 ASSERT_STREQ(
"('var1',)", list->toString().c_str());
328 ASSERT_ANY_THROW(jit->Run(
"var1 ::= 123"));
330 ASSERT_NO_THROW(var1 = jit->Run(
"var1 = 100:Int8"));
331 ASSERT_EQ(var1->m_var_type_current, ObjType::Int8) <<
newlang::toString(var1->m_var_type_current);
332 ASSERT_EQ(var1->m_var_type_fixed, ObjType::Int8) <<
newlang::toString(var1->m_var_type_fixed);
333 ASSERT_STREQ(
"100", var1->toString().c_str());
335 ASSERT_NO_THROW(var1 = jit->Run(
"var1 = 999"));
336 ASSERT_STREQ(
"999", var1->toString().c_str());
338 ASSERT_NO_THROW(var1 = jit->Run(
"var1 = _"));
339 ASSERT_EQ(var1->getType(), ObjType::None);
340 ASSERT_STREQ(
"_", var1->toString().c_str());
342 list = jit->Run(
"$?!");
343 ASSERT_STREQ(
"('var1',)", list->toString().c_str());
349 list = jit->Run(
"$?!");
350 ASSERT_STREQ(
"(,)", list->toString().c_str());
353 ASSERT_NO_THROW(var_str = jit->Run(
"var_str := 'Строка'"));
354 ASSERT_TRUE(var_str);
355 ASSERT_TRUE(var_str->is_string_type());
356 ASSERT_EQ(var_str->m_var_type_current, ObjType::StrChar) <<
newlang::toString(var_str->m_var_type_current);
357 ASSERT_EQ(var_str->m_var_type_fixed, ObjType::String) <<
newlang::toString(var_str->m_var_type_fixed);
358 ASSERT_STREQ(
"'Строка'", var_str->toString().c_str());
360 list = jit->Run(
"$?!");
361 ASSERT_STREQ(
"('var_str',)", list->toString().c_str());
364 ASSERT_NO_THROW(var_num = jit->Run(
"$var_num := 123.456: Single"));
365 ASSERT_TRUE(var_num);
366 ASSERT_TRUE(var_num->is_arithmetic_type());
367 ASSERT_TRUE(var_num->is_tensor_type());
368 ASSERT_EQ(var_num->m_var_type_current, ObjType::Single) <<
newlang::toString(var_num->m_var_type_current);
369 ASSERT_EQ(var_num->m_var_type_fixed, ObjType::Single) <<
newlang::toString(var_num->m_var_type_fixed);
370 ASSERT_STREQ(
"123.456", var_num->toString().c_str());
372 list = jit->Run(
"$?!");
373 ASSERT_STREQ(
"('$var_num', 'var_str',)", list->toString().c_str());
376 var_long = 987654321;
379 ASSERT_ANY_THROW(jit->Run(
"var_export:= %var_long"));
380 ASSERT_ANY_THROW(jit->Run(
"var_export:= %var_long..."));
381 ASSERT_ANY_THROW(jit->Run(
"var_export:Int64 := %var_long:Int32 "));
382 ASSERT_ANY_THROW(jit->Run(
"var_export := %var_long:Int64 "));
384 ASSERT_ANY_THROW(var_export = jit->Run(
"var_export:Int64 := %var_long..."));
386 LLVMAddSymbol(
"var_long", &var_long);
388 ASSERT_NO_THROW(var_export = jit->Run(
"var_export:Int64 := %var_long..."));
390 ASSERT_TRUE(var_export);
391 ASSERT_TRUE(var_export->is_tensor_type()) << var_export->toString();
392 ASSERT_EQ(var_export->getType(), ObjType::Int64);
393 ASSERT_STREQ(
"987654321", var_export->toString().c_str());
394 var_long = 123132132;
395 ASSERT_STREQ(
"123132132", var_export->toString().c_str());
396 var_export->SetValue_(Obj::CreateValue(59875, ObjType::None));
397 ASSERT_EQ(59875, var_long);
399 list = jit->Run(
"$?!");
400 ASSERT_STREQ(
"('var_export', '$var_num', 'var_str',)", list->toString().c_str());
414 ASSERT_ANY_THROW(jit->Run(
"$func_export(arg1:Int64, arg2:Int8):Int64 := %func_export"));
415 ASSERT_ANY_THROW(jit->Run(
"$func_export(arg1:Int64, arg2:Int8):Int64 := %func_export..."));
417 LLVMAddSymbol(
"func_export", (
void *) &func_export);
419 ASSERT_NO_THROW(func = jit->Run(
"$func_export(arg1:Int64, arg2:Int8):Int64 := %func_export..."));
422 ASSERT_TRUE(func->is_function_type()) << func;
423 ASSERT_EQ(func->getType(), ObjType::NativeFunc);
424 ASSERT_STREQ(
"$func_export::(arg1:Int64, arg2:Int8):Int64{ }", func->toString().c_str());
428 ASSERT_EQ(220,
result->GetValueAsInteger());
432 ASSERT_EQ(30,
result->GetValueAsInteger());
534 ASSERT_NO_THROW(ddd = jit->Run(
"(1,2,3,)"));
536 ASSERT_STREQ(
"(1, 2, 3,)", ddd->GetValueAsString().c_str()) << ddd->GetValueAsString().c_str();
538 ASSERT_NO_THROW(ddd = jit->Run(
":Tensor[...]( (1,2,3,) )"));
540 ASSERT_STREQ(
"[1, 2, 3,]:Int8", ddd->GetValueAsString().c_str()) << ddd->GetValueAsString().c_str();
543 ASSERT_NO_THROW(ddd = jit->Run(
":Dictionary(1,2,3)"));
545 ASSERT_STREQ(
"(1, 2, 3,)", ddd->GetValueAsString().c_str()) << ddd->GetValueAsString().c_str();
547 ASSERT_NO_THROW(ddd = jit->Run(
":Dictionary( (1,2,3,) )"));
549 ASSERT_STREQ(
"((1, 2, 3,),)", ddd->GetValueAsString().c_str()) << ddd->GetValueAsString().c_str();
552 ASSERT_NO_THROW(tensor = jit->Run(
":Tensor(1)"));
554 ASSERT_EQ(ObjType::Tensor, tensor->m_var_type_fixed) <<
toString(tensor->m_var_type_fixed);
555 ASSERT_EQ(ObjType::Bool, tensor->getType()) <<
toString(tensor->m_var_type_current);
556 ASSERT_EQ(0, tensor->size());
558 ASSERT_STREQ(
"1", tensor->GetValueAsString().c_str()) << tensor->GetValueAsString().c_str();
560 ASSERT_NO_THROW(tensor = jit->Run(
"(1,2,3,)"));
562 ASSERT_STREQ(
"(1, 2, 3,)", tensor->GetValueAsString().c_str()) << tensor->GetValueAsString().c_str();
564 ASSERT_NO_THROW(tensor = jit->Run(
":Tensor[...]([1,2,3,])"));
566 ASSERT_STREQ(
"[1, 2, 3,]:Int8", tensor->GetValueAsString().c_str()) << tensor->GetValueAsString().c_str();
568 ASSERT_NO_THROW(tensor = jit->Run(
":Int32[_]([1,])"));
570 ASSERT_STREQ(
"[1,]:Int32", tensor->GetValueAsString().c_str()) << tensor->GetValueAsString().c_str();
572 ASSERT_NO_THROW(tensor = jit->Run(
":Int32([1,])"));
574 ASSERT_STREQ(
"1", tensor->GetValueAsString().c_str()) << tensor->GetValueAsString().c_str();
577 ASSERT_NO_THROW(tt = jit->Run(
":Tensor[3]( (1,2,3,) )"));
579 ASSERT_STREQ(
"[1, 2, 3,]:Int8", tt->GetValueAsString().c_str()) << tt->GetValueAsString().c_str();
581 ASSERT_NO_THROW(tensor = jit->Run(
":Int32[...]((1,2,3,))"));
583 ASSERT_STREQ(
"[1, 2, 3,]:Int32", tensor->GetValueAsString().c_str()) << tensor->GetValueAsString().c_str();
585 ASSERT_NO_THROW(tensor = jit->Run(
":Int32[2,3]((1,2,3,4,5,6,))"));
588 EXPECT_EQ(2, tensor->m_tensor->dim());
589 EXPECT_EQ(2, tensor->m_tensor->size(0));
590 EXPECT_EQ(3, tensor->m_tensor->size(1));
592 ASSERT_STREQ(
"[\n [1, 2, 3,], [4, 5, 6,],\n]:Int32", tensor->GetValueAsString().c_str());
595 ASSERT_NO_THROW(str = jit->Run(
":Tensor[_]('first second')"));
597 ASSERT_STREQ(
"[102, 105, 114, 115, 116, 32, 115, 101, 99, 111, 110, 100,]:Int8", str->GetValueAsString().c_str());
599 ASSERT_NO_THROW(tt = jit->Run(
":Tensor[...]((item1='first', space=32, item3='second',))"));
601 ASSERT_STREQ(
"[102, 105, 114, 115, 116, 32, 115, 101, 99, 111, 110, 100,]:Int8", tt->GetValueAsString().c_str());
603 ASSERT_TRUE(str->op_equal(tt));
605 ASSERT_NO_THROW(tt = jit->Run(
":Int32[7,2](\"Тензор Int32 \")"));
607 ASSERT_STREQ(
"[\n [1058, 1077,], [1085, 1079,], [1086, 1088,], [32, 73,], "
608 "[110, 116,], [51, 50,], [32, 32,],\n]:Int32",
609 tt->GetValueAsString().c_str());
611 ASSERT_NO_THROW(tt = jit->Run(
":Tensor(99)"));
613 ASSERT_STREQ(
"99", tt->GetValueAsString().c_str());
615 ASSERT_NO_THROW(tt = jit->Run(
":Float64[10,2](0, ... )"));
617 ASSERT_STREQ(
"[\n [0, 0,], [0, 0,], [0, 0,], [0, 0,], [0, 0,], [0, 0,], [0, "
618 "0,], [0, 0,], [0, 0,], [0, 0,],\n]:Float64",
619 tt->GetValueAsString().c_str());
623TEST(Run, Comprehensions) {
629 ASSERT_NO_THROW(srand = jit->Run(
"srand(seed:Int32):None ::= %srand..."));
631 ObjPtr ret = (*srand)(100);
633 ASSERT_TRUE(ret->is_none_type());
636 ASSERT_NO_THROW(rand = jit->Run(
"rand():Int32 ::= %rand ... "));
643 ASSERT_NO_THROW(tt = jit->Run(
":Int32[3,2]( 42, ... rand() ... )"));
644 Logger::Instance()->SetLogLevel(save);
647 std::string rand_str = tt->GetValueAsString();
648 ASSERT_TRUE(50 < tt->GetValueAsString().size()) << rand_str;
652 ASSERT_NO_THROW(tt = jit->Run(
":Int32[5,2]( ... 0..10 )"));
654 ASSERT_STREQ(
"[\n [0, 1,], [2, 3,], [4, 5,], [6, 7,], [8, 9,],\n]:Int32", tt->GetValueAsString().c_str());
656 ASSERT_NO_THROW(tt = jit->Run(
":Float64[5,2]( 0..10 )"));
658 ASSERT_STREQ(
"[\n [0, 1,], [2, 3,], [4, 5,], [6, 7,], [8, 9,],\n]:Float64", tt->GetValueAsString().c_str());
660 ASSERT_NO_THROW(tt = jit->Run(
"0..1..0.1"));
662 ASSERT_STREQ(
"0..1..0.1", tt->toString().c_str());
664 ASSERT_NO_THROW(tt = jit->Run(
":Tensor[_]( ... 0..0.99..0.1 )"));
666 ASSERT_STREQ(
"[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9,]:Float64", tt->GetValueAsString().c_str());
672 ASSERT_NO_THROW(tt = jit->Run(
":Tensor[10]( 1, 2, ... )"));
674 ASSERT_STREQ(
"[1, 2, 1, 2, 1, 2, 1, 2, 1, 2,]:Int8", tt->GetValueAsString().c_str());
676 ASSERT_NO_THROW(tt = jit->Run(
":Tensor[10]( 1, 2, ... 0 ...)"));
678 ASSERT_STREQ(
"[1, 2, 0, 0, 0, 0, 0, 0, 0, 0,]:Int8", tt->GetValueAsString().c_str());
680 ASSERT_NO_THROW(tt = jit->Run(
":Tensor[14]( 99, 100, ... 0..5, ... )"));
682 ASSERT_STREQ(
"[99, 100, 0, 1, 2, 3, 4, 99, 100, 0, 1, 2, 3, 4,]:Int8", tt->GetValueAsString().c_str());
685 ASSERT_NO_THROW(dict = jit->Run(
":Dictionary( ... 0..0.99..0.1 )"));
687 ASSERT_STREQ(
"(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9,)", dict->GetValueAsString().c_str());
689 ASSERT_NO_THROW(dict = jit->Run(
":Dictionary( ... 10..0..-1\\1 )"));
691 ASSERT_STREQ(
"(10\\1, 9\\1, 8\\1, 7\\1, 6\\1, 5\\1, 4\\1, 3\\1, 2\\1, 1\\1,)", dict->GetValueAsString().c_str());
693 ASSERT_NO_THROW(dict = jit->Run(
"dict ::= ( 1, two=2, .three=3,)"));
695 ASSERT_STREQ(
"(1, two=2, three=3,)", dict->GetValueAsString().c_str());
698 ASSERT_NO_THROW(dd = jit->Run(
":Dictionary( 0, ... dict)"));
700 ASSERT_STREQ(
"(0, 1, 2, 3,)", dd->GetValueAsString().c_str());
702 ASSERT_NO_THROW(dd = jit->Run(
":Dictionary( 0, ... ... dict, end=42)"));
704 ASSERT_STREQ(
"(0, 1, two=2, three=3, end=42,)", dd->GetValueAsString().c_str());
707 ASSERT_TRUE(rt->m_diag->m_fill_remainder);
708 ASSERT_ANY_THROW(tt = jit->Run(
":Tensor[16]( 99, 100, ... 0..5, ... )"));
709 rt->m_diag->m_fill_remainder =
false;
710 ASSERT_NO_THROW(tt = jit->Run(
":Tensor[16]( 99, 100, ... 0..5, ... )"));
712 ASSERT_STREQ(
"[99, 100, 0, 1, 2, 3, 4, 99, 100, 0, 1, 2, 3, 4, 99, 100,]:Int8", tt->GetValueAsString().c_str());
1367 ASSERT_NO_THROW(dict = jit->Run(
"dict := ('1'=1, \"22\"=2, '333'=3, 4, \"555\"=5,)"));
1369 ASSERT_EQ(5, dict->size());
1370 ASSERT_EQ(1, dict->at(0).second->GetValueAsInteger());
1371 ASSERT_EQ(2, dict->at(1).second->GetValueAsInteger());
1372 ASSERT_EQ(3, dict->at(2).second->GetValueAsInteger());
1373 ASSERT_EQ(4, dict->at(3).second->GetValueAsInteger());
1374 ASSERT_EQ(5, dict->at(4).second->GetValueAsInteger());
1375 ASSERT_STREQ(
"1", dict->at(0).first.c_str());
1376 ASSERT_STREQ(
"22", dict->at(1).first.c_str());
1377 ASSERT_STREQ(
"333", dict->at(2).first.c_str());
1378 ASSERT_STREQ(
"", dict->at(3).first.c_str());
1379 ASSERT_STREQ(
"555", dict->at(4).first.c_str());
1382 ASSERT_NO_THROW(dict1 = jit->Run(
"dict??"));
1384 ASSERT_EQ(5, dict1->size());
1385 ASSERT_EQ(1, dict1->at(0).second->GetValueAsInteger());
1386 ASSERT_EQ(2, dict1->at(1).second->GetValueAsInteger());
1387 ASSERT_EQ(3, dict1->at(2).second->GetValueAsInteger());
1388 ASSERT_EQ(4, dict1->at(3).second->GetValueAsInteger());
1389 ASSERT_EQ(5, dict1->at(4).second->GetValueAsInteger());
1390 ASSERT_STREQ(
"1", dict1->at(0).first.c_str());
1391 ASSERT_STREQ(
"22", dict1->at(1).first.c_str());
1392 ASSERT_STREQ(
"333", dict1->at(2).first.c_str());
1393 ASSERT_STREQ(
"", dict1->at(3).first.c_str());
1394 ASSERT_STREQ(
"555", dict1->at(4).first.c_str());
1397 ObjPtr iter_d = dict->IteratorMake();
1399 ASSERT_TRUE(iter_d);
1400 ASSERT_EQ(iter_d->getType(), ObjType::Iterator);
1402 ASSERT_STREQ(
"1", iter_d->IteratorData()->toString().c_str());
1403 ASSERT_STREQ(
"1", iter_d->IteratorNext(0)->toString().c_str());
1405 ASSERT_STREQ(
"2", iter_d->IteratorData()->toString().c_str());
1406 ASSERT_STREQ(
"2", iter_d->IteratorNext(0)->toString().c_str());
1408 ASSERT_STREQ(
"3", iter_d->IteratorData()->toString().c_str());
1409 ASSERT_STREQ(
"3", iter_d->IteratorNext(0)->toString().c_str());
1411 ASSERT_STREQ(
"4", iter_d->IteratorData()->toString().c_str());
1412 ASSERT_STREQ(
"4", iter_d->IteratorNext(0)->toString().c_str());
1414 ASSERT_STREQ(
"5", iter_d->IteratorData()->toString().c_str());
1415 ASSERT_STREQ(
"5", iter_d->IteratorNext(0)->toString().c_str());
1417 ASSERT_STREQ(
":IteratorEnd", iter_d->IteratorData()->toString().c_str());
1418 ObjPtr iter_end = iter_d->IteratorNext(0);
1419 ASSERT_TRUE(iter_end);
1420 EXPECT_EQ(ObjType::IteratorEnd, iter_end->getType()) <<
newlang::toString(iter_end->getType());
1421 EXPECT_FALSE(iter_end->GetValueAsBoolean());
1422 ASSERT_STREQ(
":IteratorEnd", iter_end->IteratorData()->toString().c_str());
1424 iter_end = iter_d->IteratorNext(0);
1425 ASSERT_TRUE(iter_end);
1426 ASSERT_EQ(ObjType::IteratorEnd, iter_end->getType());
1427 ASSERT_FALSE(iter_end->GetValueAsBoolean());
1428 ASSERT_STREQ(
":IteratorEnd", iter_d->IteratorData()->toString().c_str());
1432 ASSERT_NO_THROW(iter = jit->Run(
"it := dict?"));
1435 ASSERT_EQ(ObjType::Iterator, iter->getType()) <<
toString(iter->getType());
1436 ASSERT_TRUE(iter->m_iterator);
1438 ASSERT_TRUE(iter->m_iterator->begin() != iter->m_iterator->end());
1439 ASSERT_TRUE(*(iter->m_iterator) == iter->m_iterator->begin());
1442 ASSERT_NO_THROW(one = jit->Run(
"it!"));
1444 ASSERT_EQ(1, dict->at(0).second->GetValueAsInteger());
1446 ASSERT_NO_THROW(one = jit->Run(
"it!"));
1448 ASSERT_EQ(2, one->GetValueAsInteger());
1450 ASSERT_NO_THROW(one = jit->Run(
"@next(it)"));
1452 ASSERT_EQ(3, one->GetValueAsInteger());
1454 ASSERT_NO_THROW(one = jit->Run(
"it!"));
1456 ASSERT_EQ(4, one->GetValueAsInteger());
1458 ASSERT_NO_THROW(one = jit->Run(
"it!"));
1460 ASSERT_EQ(5, one->GetValueAsInteger());
1462 ASSERT_NO_THROW(one = jit->Run(
"it!"));
1464 ASSERT_EQ(ObjType::IteratorEnd, one->getType()) << one <<
" " <<
toString(one->getType());
1466 ASSERT_NO_THROW(one = jit->Run(
"it!"));
1468 ASSERT_EQ(ObjType::IteratorEnd, one->getType()) << one <<
" " <<
toString(one->getType());
1477 ASSERT_TRUE(*(iter->m_iterator) == iter->m_iterator->end());
1478 ASSERT_NO_THROW(one = jit->Run(
"it!!"));
1479 ASSERT_TRUE(*(iter->m_iterator) != iter->m_iterator->end());
1481 ASSERT_NO_THROW(dict1 = jit->Run(
"it??(-3)"));
1483 ASSERT_EQ(3, dict1->size());
1484 ASSERT_EQ(1, dict1->at(0).second->GetValueAsInteger());
1485 ASSERT_EQ(2, dict1->at(1).second->GetValueAsInteger());
1486 ASSERT_EQ(3, dict1->at(2).second->GetValueAsInteger());
1489 ASSERT_NO_THROW(dict2 = jit->Run(
"it??(-3)"));
1491 ASSERT_EQ(3, dict2->size());
1492 ASSERT_EQ(4, dict2->at(0).second->GetValueAsInteger());
1493 ASSERT_EQ(5, dict2->at(1).second->GetValueAsInteger());
1494 ASSERT_EQ(ObjType::IteratorEnd, dict2->at(2).second->getType());
1497 ASSERT_NO_THROW(dict3 = jit->Run(
"it??(-3)"));
1499 ASSERT_EQ(3, dict1->size());
1500 ASSERT_EQ(ObjType::IteratorEnd, dict3->at(0).second->getType());
1501 ASSERT_EQ(ObjType::IteratorEnd, dict3->at(1).second->getType());
1502 ASSERT_EQ(ObjType::IteratorEnd, dict3->at(2).second->getType());
1506 ASSERT_TRUE(*(iter->m_iterator) == iter->m_iterator->end());
1507 ASSERT_NO_THROW(jit->Run(
"it!!"));
1508 ASSERT_TRUE(*(iter->m_iterator) != iter->m_iterator->end());
1510 ASSERT_NO_THROW(dict1 = jit->Run(
"it??(3)"));
1512 ASSERT_EQ(3, dict1->size());
1513 ASSERT_EQ(1, dict1->at(0).second->GetValueAsInteger());
1514 ASSERT_EQ(2, dict1->at(1).second->GetValueAsInteger());
1515 ASSERT_EQ(3, dict1->at(2).second->GetValueAsInteger());
1517 ASSERT_NO_THROW(dict2 = jit->Run(
"it??(3)"));
1519 ASSERT_EQ(2, dict2->size());
1520 ASSERT_EQ(4, dict2->at(0).second->GetValueAsInteger());
1521 ASSERT_EQ(5, dict2->at(1).second->GetValueAsInteger());
1523 ASSERT_NO_THROW(dict3 = jit->Run(
"it??(3)"));
1525 ASSERT_EQ(0, dict3->size());
1529 ASSERT_TRUE(*(iter->m_iterator) == iter->m_iterator->end());
1530 ASSERT_NO_THROW(jit->Run(
"it!!"));
1531 ASSERT_TRUE(*(iter->m_iterator) != iter->m_iterator->end());
1534 ASSERT_NO_THROW(flt_res = jit->Run(
"dict??('')"));
1535 ASSERT_TRUE(flt_res);
1536 ASSERT_EQ(1, flt_res->size());
1537 ASSERT_EQ(4, flt_res->at(0).second->GetValueAsInteger());
1541 ASSERT_NO_THROW(flt1_res = jit->Run(
"dict??('.',100)"));
1542 ASSERT_TRUE(flt1_res);
1543 ASSERT_EQ(1, flt1_res->size());
1544 ASSERT_EQ(1, flt1_res->at(0).second->GetValueAsInteger());
1548 ASSERT_NO_THROW(flt2_res = jit->Run(
"dict??('..',100)"));
1549 ASSERT_TRUE(flt2_res);
1550 ASSERT_EQ(1, flt2_res->size());
1551 ASSERT_EQ(2, flt2_res->at(0).second->GetValueAsInteger());
1554 ASSERT_NO_THROW(flt3_res = jit->Run(
"dict??('...',100)"));
1555 ASSERT_TRUE(flt3_res);
1556 ASSERT_EQ(2, flt3_res->size());
1557 ASSERT_EQ(3, flt3_res->at(0).second->GetValueAsInteger());
1558 ASSERT_EQ(5, flt3_res->at(1).second->GetValueAsInteger());
1563 ASSERT_NO_THROW(range_test = jit->Run(
"1\\1..1..-1"));
1564 ASSERT_TRUE(range_test);
1565 ASSERT_EQ(3, range_test->size());
1566 ASSERT_STREQ(
"1\\1", range_test->at(0).second->GetValueAsString().c_str());
1567 ASSERT_STREQ(
"1\\1", range_test->at(1).second->GetValueAsString().c_str());
1568 ASSERT_STREQ(
"-1\\1", range_test->at(2).second->GetValueAsString().c_str());
1569 ASSERT_STREQ(
"1\\1..1\\1..-1\\1", range_test->GetValueAsString().c_str());
1576 ASSERT_NO_THROW(iter_dict = jit->Run(
"1..1..-1??"));
1577 ASSERT_TRUE(iter_dict);
1578 ASSERT_STREQ(
"(,)", iter_dict->GetValueAsString().c_str());
1580 ASSERT_NO_THROW(iter_dict = jit->Run(
"2..1..-1??"));
1581 ASSERT_TRUE(iter_dict);
1582 ASSERT_STREQ(
"(2,)", iter_dict->GetValueAsString().c_str());
1584 ASSERT_NO_THROW(iter_dict = jit->Run(
"3..1..-1??"));
1585 ASSERT_TRUE(iter_dict);
1586 ASSERT_STREQ(
"(3, 2,)", iter_dict->GetValueAsString().c_str());
1588 ASSERT_NO_THROW(iter_dict = jit->Run(
"3\\1..1..-1??"));
1589 ASSERT_TRUE(iter_dict);
1590 ASSERT_STREQ(
"(3\\1, 2\\1,)", iter_dict->GetValueAsString().c_str());
1593 ASSERT_NO_THROW(iter_test = jit->Run(
"iter_test := 3\\1..1..-1?"));
1594 ASSERT_TRUE(iter_test);
1595 ASSERT_TRUE(iter_test->m_iterator);
1596 ASSERT_TRUE(iter_test->m_iterator->m_iter_obj);
1597 ASSERT_TRUE(iter_test->m_iterator->m_iter_obj->m_iter_range_value);
1598 ASSERT_STREQ(
"3\\1", iter_test->m_iterator->m_iter_obj->m_iter_range_value->GetValueAsString().c_str()) << iter_test->m_iterator->m_iter_obj->m_iter_range_value->GetValueAsString().c_str();
1599 ASSERT_EQ(iter_test->getType(), ObjType::Iterator);
1603 ASSERT_NO_THROW(while_test = jit->Run(
"[@next(iter_test)]<->{- --'EXIT'-- -}"));
1604 ASSERT_TRUE(while_test);
1605 ASSERT_TRUE(while_test->is_return()) << while_test->toString();
1606 ASSERT_STREQ(
":RetMinus('EXIT')", while_test->toString().c_str()) << while_test->toString();
1608 ASSERT_NO_THROW(while_test = jit->Run(
"$^"));
1609 ASSERT_TRUE(while_test);
1610 ASSERT_TRUE(while_test->is_return()) << while_test->toString();
1611 ASSERT_STREQ(
":RetMinus('EXIT')", while_test->toString().c_str()) << while_test->toString();
1613 ASSERT_NO_THROW(while_test = jit->Run(
"@latter"));
1614 ASSERT_TRUE(while_test);
1615 ASSERT_TRUE(while_test->is_return()) << while_test->toString();
1616 ASSERT_STREQ(
":RetMinus('EXIT')", while_test->toString().c_str()) << while_test->toString();
1618 ASSERT_NO_THROW(while_test = jit->Run(
"* $^"));
1619 ASSERT_TRUE(while_test);
1620 ASSERT_TRUE(while_test->is_string_type()) << while_test->toString();
1621 ASSERT_STREQ(
"'EXIT'", while_test->toString().c_str()) << while_test->toString();
1624 ASSERT_NO_THROW(while_test = jit->Run(
"[iter_test!]<->{+ ++'PLUS'++ +}"));
1625 ASSERT_TRUE(while_test);
1626 ASSERT_TRUE(while_test->is_return()) << while_test->toString();
1627 ASSERT_STREQ(
":RetPlus('PLUS')", while_test->toString().c_str()) << while_test->toString();
1630 ASSERT_NO_THROW(iter_dict = jit->Run(
"iter_dict := (1,2,3,)?"));
1631 ASSERT_TRUE(iter_dict);
1634 ASSERT_EQ(iter_dict->getType(), ObjType::Iterator);
1636 ASSERT_NO_THROW(while_test = jit->Run(
"[iter_dict!]<->{+ ++'EXIT'++ +}"));
1637 ASSERT_TRUE(while_test);
1638 ASSERT_TRUE(while_test->is_return()) << while_test->toString();
1639 ASSERT_STREQ(
":RetPlus('EXIT')", while_test->toString().c_str()) << while_test->toString();
1641 ASSERT_NO_THROW(while_test = jit->Run(
"$^"));
1642 ASSERT_TRUE(while_test);
1643 ASSERT_TRUE(while_test->is_return()) << while_test->toString();
1644 ASSERT_STREQ(
":RetPlus('EXIT')", while_test->toString().c_str()) << while_test->toString();
1646 ASSERT_NO_THROW(while_test = jit->Run(
"@latter"));
1647 ASSERT_TRUE(while_test);
1648 ASSERT_TRUE(while_test->is_return()) << while_test->toString();
1649 ASSERT_STREQ(
":RetPlus('EXIT')", while_test->toString().c_str()) << while_test->toString();
1651 ASSERT_NO_THROW(while_test = jit->Run(
"*@latter"));
1652 ASSERT_TRUE(while_test);
1653 ASSERT_TRUE(while_test->is_string_type()) << while_test->toString();
1654 ASSERT_STREQ(
"'EXIT'", while_test->toString().c_str()) << while_test->toString();
1657 ASSERT_NO_THROW(iter_test = jit->Run(
"iter_test := @iter(3\\1..1..-1)"));
1660 ASSERT_NO_THROW(item_val = jit->Run(
"@curr(iter_test)"));
1661 ASSERT_TRUE(item_val);
1662 ASSERT_STREQ(
"3\\1", item_val->GetValueAsString().c_str());
1664 ASSERT_NO_THROW(item_val = jit->Run(
"@next(iter_test)"));
1665 ASSERT_TRUE(item_val);
1666 ASSERT_STREQ(
"3\\1", item_val->GetValueAsString().c_str());
1668 ASSERT_NO_THROW(item_val = jit->Run(
"iter_test!?"));
1669 ASSERT_TRUE(item_val);
1670 ASSERT_STREQ(
"2\\1", item_val->GetValueAsString().c_str());
1672 ASSERT_NO_THROW(item_val = jit->Run(
"iter_test?!"));
1673 ASSERT_TRUE(item_val);
1674 ASSERT_STREQ(
"2\\1", item_val->GetValueAsString().c_str());
1676 ASSERT_STREQ(
":Iterator", iter_test->GetValueAsString().c_str());
1677 ASSERT_TRUE(iter_test->m_iterator);
1678 ASSERT_TRUE(iter_test->m_iterator->m_iter_obj);
1679 ASSERT_STREQ(
"2\\1", iter_test->m_iterator->m_iter_obj->m_iter_range_value->GetValueAsString().c_str());
1680 ASSERT_STREQ(
"3\\1..1\\1..-1\\1", iter_test->m_iterator->m_iter_obj->GetValueAsString().c_str());
1682 ASSERT_NO_THROW(item_val = jit->Run(
"@next(iter_test)"));
1683 ASSERT_TRUE(item_val);
1684 ASSERT_STREQ(
"2\\1", item_val->GetValueAsString().c_str());
1685 ASSERT_TRUE(item_val->GetValueAsBoolean());
1687 ASSERT_STREQ(
":Iterator", iter_test->GetValueAsString().c_str());
1688 ASSERT_TRUE(iter_test->m_iterator);
1689 ASSERT_TRUE(iter_test->m_iterator->m_iter_obj);
1690 ASSERT_STREQ(
"1\\1", iter_test->m_iterator->m_iter_obj->m_iter_range_value->GetValueAsString().c_str());
1691 ASSERT_STREQ(
"3\\1..1\\1..-1\\1", iter_test->m_iterator->m_iter_obj->GetValueAsString().c_str());
1693 ASSERT_NO_THROW(item_val = jit->Run(
"@next(iter_test)"));
1694 ASSERT_TRUE(item_val);
1696 ASSERT_STREQ(
":Iterator", iter_test->GetValueAsString().c_str());
1697 ASSERT_TRUE(iter_test->m_iterator);
1698 ASSERT_TRUE(iter_test->m_iterator->m_iter_obj);
1699 ASSERT_STREQ(
"1\\1", iter_test->m_iterator->m_iter_obj->m_iter_range_value->GetValueAsString().c_str());
1700 ASSERT_STREQ(
"3\\1..1\\1..-1\\1", iter_test->m_iterator->m_iter_obj->GetValueAsString().c_str());
1704 ASSERT_TRUE(iter_test->m_iterator->m_iter_obj);
1705 ASSERT_STREQ(
"3\\1..1\\1..-1\\1", iter_test->m_iterator->m_iter_obj->GetValueAsString().c_str());
1707 ASSERT_STREQ(
":IteratorEnd", item_val->GetValueAsString().c_str());
1708 ASSERT_FALSE(item_val->GetValueAsBoolean());
1710 ASSERT_NO_THROW(item_val = jit->Run(
"iter_test"));
1711 ASSERT_TRUE(item_val);
1712 ASSERT_STREQ(
":Iterator", item_val->GetValueAsString().c_str());
1714 ASSERT_STREQ(
":IteratorEnd", item_val->IteratorData()->GetValueAsString().c_str());
1715 ASSERT_FALSE(item_val->IteratorNext(0)->GetValueAsBoolean());
1717 ASSERT_NO_THROW(while_test = jit->Run(
"[iter_test?!]<->{ --'EXIT'-- }"));
1718 ASSERT_TRUE(while_test);
1719 ASSERT_STRNE(
"EXIT", while_test->GetValueAsString().c_str()) << while_test->GetValueAsString().c_str();
1722 ASSERT_NO_THROW(item_val = jit->Run(
"@first(iter_test)"));
1723 ASSERT_TRUE(item_val);
1724 ASSERT_STREQ(
"3\\1", item_val->GetValueAsString().c_str());
1838class RunTester :
public ::testing::Test {
1842 std::string m_string;
1844 RunTester() : m_rt(
RunTime::Init()) {
1847 const char *Test(std::string eval,
Obj *vars) {
1849 m_result = m_jit->Run(eval, vars);
1851 m_string = m_result->GetValueAsString();
1852 return m_string.c_str();
1854 std::cout <<
"Fail parsing: '" << eval <<
"'\n";
1860 const char *Test(
const char *eval) {
1863 return Test(eval, &vars);
1867TEST_F(RunTester, Ops) {
1868 ASSERT_STREQ(
"10", Test(
"10"));
1869 ASSERT_STREQ(
"32", Test(
"10+22"));
1870 ASSERT_STREQ(
"5.1", Test(
"1.1+4"));
1871 ASSERT_STREQ(
"5.5", Test(
"1+4.5"));
1873 ASSERT_STREQ(
"10\\1", Test(
"10\\1"));
1874 ASSERT_STREQ(
"32\\1", Test(
"10\\1+22\\1"));
1875 ASSERT_STREQ(
"5\\1", Test(
"4\\5 + 42\\10"));
1876 ASSERT_STREQ(
"11\\1", Test(
"10\\1 + 1"));
1877 ASSERT_STREQ(
"4\\3", Test(
"1\\3 + 1"));
1879 ASSERT_STREQ(
"-12", Test(
"10 - 22"));
1880 ASSERT_STREQ(
"-2.9", Test(
"1.1 - 4"));
1881 ASSERT_STREQ(
"-3.5", Test(
"1 - 4.5"));
1882 ASSERT_STREQ(
"-17\\5", Test(
"4\\5 - 42\\10"));
1883 ASSERT_STREQ(
"-9\\10", Test(
"1\\10 - 1"));
1884 ASSERT_STREQ(
"-2\\3", Test(
"1\\3 - 1"));
1886 ASSERT_STREQ(
"66", Test(
"2 * 33"));
1887 ASSERT_STREQ(
"-5.5", Test(
"1.1 * -5"));
1888 ASSERT_STREQ(
"180", Test(
"10 * 18"));
1889 ASSERT_STREQ(
"66\\1", Test(
"2\\1 * 66\\2"));
1890 ASSERT_STREQ(
"-15\\1", Test(
"3\\1 * -5"));
1891 ASSERT_STREQ(
"9\\5", Test(
"18\\100 * 10"));
1893 ASSERT_STREQ(
"5", Test(
"10/2"));
1894 ASSERT_STREQ(
"5.05", Test(
"10.1 / 2"));
1895 ASSERT_STREQ(
"0.1", Test(
"1 / 10"));
1896 ASSERT_STREQ(
"0.1", Test(
"1.0 / 10"));
1898 ASSERT_STREQ(
"4\\3", Test(
"12\\3 / 3"));
1899 ASSERT_STREQ(
"1\\1", Test(
"5\\10 / 1\\2"));
1900 ASSERT_STREQ(
"1\\100", Test(
"1\\10 / 10"));
1902 ASSERT_STREQ(
"5", Test(
"10//2"));
1903 ASSERT_STREQ(
"5", Test(
"10.0 // 2"));
1904 ASSERT_STREQ(
"0", Test(
"1 // 10"));
1905 ASSERT_STREQ(
"7", Test(
"15 // 2"));
1906 ASSERT_STREQ(
"-8", Test(
"-15 // 2"));
1907 ASSERT_STREQ(
"2", Test(
"25 // 10"));
1908 ASSERT_STREQ(
"-3", Test(
"-25 // 10"));
1909 ASSERT_STREQ(
"-3", Test(
"-30 // 10"));
1910 ASSERT_STREQ(
"-4", Test(
"-31 // 10"));
1914 ASSERT_STREQ(
"", Test(
"\"\""));
1915 ASSERT_STREQ(
" ", Test(
"\" \""));
1916 ASSERT_STREQ(
"строка", Test(
"\"\" \"строка\" "));
1917 ASSERT_STREQ(
"строка 222", Test(
"\"строка \" \"222\" "));
1920 ASSERT_STREQ(
"100", Test(
"$var1:=100"));
1923 ASSERT_STREQ(
"('$var1',)", Test(
"$?!"));
1924 ASSERT_STREQ(
"100", Test(
"var1"));
1926 ObjPtr vars = Obj::CreateDict(Obj::Arg(var1,
"var1"));
1929 ASSERT_NO_THROW(Test(
"$var1", vars.get()));
1930 ASSERT_STREQ(
"100", Test(
"$var1", vars.get()));
1932 ASSERT_STREQ(
"20", Test(
"$var2:=9+11"));
1935 ASSERT_STREQ(
"('$var1', '$var2',)", Test(
"$!?"));
1936 ASSERT_STREQ(
"20", Test(
"var2"));
1940 vars->push_back(Obj::Arg(var2,
"var2"));
1942 ASSERT_NO_THROW(Test(
"$var2", vars.get()));
1943 ASSERT_STREQ(
"20", Test(
"$var2", vars.get()));
1945 ASSERT_STREQ(
"100", Test(
"var1"));
1946 ASSERT_STREQ(
"120", Test(
"var1+=var2"));
1947 ASSERT_STREQ(
"('$var1', '$var2',)", Test(
"$!?"));
1949 ASSERT_STREQ(
"120", Test(
"$var1", vars.get()));
1951 ASSERT_NO_THROW(Test(
"var1 := _"));
1952 ASSERT_STREQ(
"('$var1', '$var2',)", Test(
"$?!"));
1953 ASSERT_NO_THROW(Test(
"var2 := _"));
1954 ASSERT_STREQ(
"('$var1', '$var2',)", Test(
"$?!"));
2228TEST(RunTest, Empty) {
2230 ASSERT_TRUE(var.
empty());
2231 ASSERT_EQ(ObjType::None, var.
getType());
2234TEST(RunTest, Value) {
2238 ASSERT_EQ(ObjType::Bool, var.
getType());
2241 ASSERT_EQ(ObjType::Bool, var.
getType());
2244 ASSERT_EQ(ObjType::Float32, var.
getType());
2247 ASSERT_EQ(ObjType::Float64, var.
getType());
2250 ASSERT_EQ(ObjType::Bool, var.
getType());
2253 ASSERT_EQ(ObjType::Int8, var.
getType());
2256 ASSERT_EQ(ObjType::Int8, var.
getType());
2259 ASSERT_EQ(ObjType::Int16, var.
getType());
2262 ASSERT_EQ(ObjType::Int32, var.
getType());
2265 ASSERT_EQ(ObjType::Int64, var.
getType());
2268 ASSERT_EQ(ObjType::Float32, var.
getType());
2271 ASSERT_EQ(ObjType::Float64, var.
getType());
2274 ASSERT_EQ(ObjType::Bool, var.
getType());
2277TEST(RunTest, String) {
2291 ObjPtr str_byte = Obj::CreateString(
"byte");
2292 ASSERT_STREQ(
"byte", str_byte->GetValueAsString().c_str());
2293 ASSERT_EQ(4, str_byte->size());
2294 ASSERT_EQ(4, str_byte->m_value.size());
2295 ASSERT_STREQ(
"b", (*str_byte)[0].second->GetValueAsString().c_str());
2296 ASSERT_STREQ(
"y", (*str_byte)[1].second->GetValueAsString().c_str());
2297 ASSERT_STREQ(
"t", (*str_byte)[2].second->GetValueAsString().c_str());
2298 ASSERT_STREQ(
"e", (*str_byte)[3].second->GetValueAsString().c_str());
2300 str_byte->op_set_index(0,
"B");
2301 str_byte->op_set_index(1,
"Y");
2302 ASSERT_STREQ(
"BYte", str_byte->GetValueAsString().c_str());
2303 str_byte->op_set_index(2,
"T");
2304 str_byte->op_set_index(3,
"E");
2305 ASSERT_STREQ(
"BYTE", str_byte->GetValueAsString().c_str());
2307 ObjPtr str_char = Obj::CreateString(L
"строка");
2308 ASSERT_EQ(6, str_char->size());
2309 ASSERT_EQ(6, str_char->m_string.size());
2311 ASSERT_STREQ(
"с", (*str_char)[0].second->GetValueAsString().c_str());
2312 ASSERT_STREQ(
"т", (*str_char)[1].second->GetValueAsString().c_str());
2313 ASSERT_STREQ(
"р", (*str_char)[2].second->GetValueAsString().c_str());
2314 ASSERT_STREQ(
"о", (*str_char)[3].second->GetValueAsString().c_str());
2315 ASSERT_STREQ(
"к", (*str_char)[4].second->GetValueAsString().c_str());
2316 ASSERT_STREQ(
"а", (*str_char)[5].second->GetValueAsString().c_str());
2318 str_char->op_set_index(0,
"С");
2319 str_char->op_set_index(1,
"Т");
2320 ASSERT_STREQ(
"СТрока", str_char->GetValueAsString().c_str());
2321 str_char->op_set_index(2,
"Р");
2322 str_char->op_set_index(3,
"О");
2323 ASSERT_STREQ(
"СТРОка", str_char->GetValueAsString().c_str());
2349TEST(RunTest,
Dict) {
2354 Obj var(ObjType::Dictionary);
2355 ASSERT_TRUE(var.
empty());
2356 EXPECT_ANY_THROW(var[0]);
2358 ASSERT_EQ(0, var.
size());
2360 ASSERT_NO_THROW(var2 = jit->Run(
"(,)"));
2362 var.
push_back(Obj::CreateString(
"Test1"));
2363 ASSERT_EQ(1, var.
size());
2364 var.
push_back(Obj::CreateString(
"Test3"));
2365 ASSERT_EQ(2, var.
size());
2368 ASSERT_EQ(4, var.
size());
2370 ASSERT_TRUE(var[0].second->op_accurate(Obj::CreateValue(0, ObjType::None)));
2371 ASSERT_TRUE(var[1].second->op_accurate(Obj::CreateString(
"Test1")));
2372 ASSERT_TRUE(var[2].second->op_accurate(Obj::CreateValue(2, ObjType::None)));
2373 ASSERT_TRUE(var[3].second->op_accurate(Obj::CreateString(L
"Test3")));
2375 ASSERT_NO_THROW(var2 = jit->Run(
"(0, \"Test1\", 2, 'Test3',)"));
2377 ASSERT_TRUE((*var2)[0].second->op_accurate(Obj::CreateValue(0, ObjType::None)));
2378 ASSERT_TRUE((*var2)[1].second->op_accurate(Obj::CreateString(
"Test1")));
2379 ASSERT_TRUE((*var2)[2].second->op_accurate(Obj::CreateValue(2, ObjType::None)));
2380 ASSERT_TRUE((*var2)[3].second->op_accurate(Obj::CreateString(L
"Test3")));
2384 ASSERT_NO_THROW(var3 = jit->Run(
"(0, \"Test1\", 2, 'Test3',)"));
2386 ASSERT_TRUE((*var3)[0].second->op_accurate(Obj::CreateValue(0, ObjType::None)));
2387 ASSERT_TRUE((*var3)[1].second->op_accurate(Obj::CreateString(
"Test1")));
2388 ASSERT_TRUE((*var3)[2].second->op_accurate(Obj::CreateValue(2, ObjType::None)));
2389 ASSERT_TRUE((*var3)[3].second->op_accurate(Obj::CreateString(L
"Test3")));
2392TEST(RunTest, AsMap) {
2394 ObjPtr map = Obj::CreateType(ObjType::Dictionary);
2395 ASSERT_TRUE(map->empty());
2396 EXPECT_ANY_THROW((*map)[
"test1"]);
2397 ASSERT_EQ(0, map->size());
2399 ObjPtr temp = Obj::CreateString(
"Test");
2400 map->push_back(temp,
"test1");
2401 map->push_back(Obj::CreateValue(100, ObjType::None),
"test2");
2402 ASSERT_EQ(2, map->size());
2403 ASSERT_STREQ((*map)[
"test1"].second->toString().c_str(), temp->toString().c_str()) << temp->toString().c_str();
2405 ASSERT_TRUE((*map)[
"test2"].second);
2406 ObjPtr temp100 = Obj::CreateValue(100, ObjType::None);
2407 ASSERT_TRUE(map->exist(temp100,
true));
2409 ObjPtr test2 = (*map)[
"test2"].second;
2412 ASSERT_STREQ(
"100", test2->toString().c_str());
2417 ObjPtr var_int = Obj::CreateValue(100, ObjType::None);
2418 ObjPtr var_num = Obj::CreateValue(100.0, ObjType::None);
2419 ObjPtr var_str = Obj::CreateString(L
"STRING");
2420 ObjPtr var_bool = Obj::CreateBool(
true);
2421 ObjPtr var_empty = Obj::CreateNone();
2423 ASSERT_EQ(var_int->m_var_type_current, ObjType::Int8) << (int) var_int->getType();
2424 ASSERT_EQ(var_num->m_var_type_current, ObjType::Float32) << (int) var_num->getType();
2425 ASSERT_EQ(var_str->m_var_type_current, ObjType::StrWide) << (int) var_str->getType();
2426 ASSERT_EQ(var_bool->m_var_type_current, ObjType::Bool) << (int) var_bool->getType();
2427 ASSERT_EQ(var_empty->m_var_type_current, ObjType::None) << (int) var_empty->getType();
2428 ASSERT_TRUE(var_empty->empty()) << (int) var_empty->getType();
2429 ASSERT_FALSE(var_int->empty()) << (int) var_int->getType();
2432 ASSERT_TRUE(var_int->op_accurate(Obj::CreateValue(100, ObjType::None)));
2433 ASSERT_FALSE(var_int->op_accurate(Obj::CreateValue(111, ObjType::None)));
2435 ASSERT_TRUE(var_num->op_equal(Obj::CreateValue(100.0, ObjType::None)));
2436 ASSERT_FALSE(var_num->op_equal(Obj::CreateValue(100.0001, ObjType::None)));
2437 ASSERT_TRUE(var_num->op_accurate(Obj::CreateValue(100.0, ObjType::None)));
2438 ASSERT_FALSE(var_num->op_accurate(Obj::CreateValue(100.0001, ObjType::None)));
2440 ASSERT_TRUE(var_int->op_equal(Obj::CreateValue(100.0, ObjType::None)));
2441 ASSERT_TRUE(var_int->op_accurate(Obj::CreateValue(100.0, ObjType::None)));
2442 ASSERT_FALSE(var_int->op_equal(Obj::CreateValue(100.1, ObjType::None)));
2443 ASSERT_FALSE(var_int->op_accurate(Obj::CreateValue(100.1, ObjType::None)));
2446 ObjPtr var_int2 = Obj::CreateValue(101, ObjType::None);
2447 ObjPtr var_num2 = Obj::CreateValue(100.1, ObjType::None);
2450 ASSERT_TRUE(var_int->op_accurate(var_int));
2451 ASSERT_FALSE(var_int->op_accurate(var_int2));
2453 ASSERT_TRUE(var_num->op_accurate(var_num));
2454 ASSERT_FALSE(var_num->op_accurate(var_num2));
2456 ASSERT_TRUE(var_int->op_equal(var_num));
2458 ASSERT_FALSE(var_int->op_equal(var_num2));
2459 ASSERT_FALSE(var_num2->op_equal(var_int));
2461 ObjPtr var_bool2 = Obj::CreateBool(
false);
2463 ASSERT_TRUE(var_bool->op_accurate(var_bool));
2464 ASSERT_FALSE(var_bool->op_accurate(var_bool2));
2466 ObjPtr var_str2 = Obj::CreateString(
"STRING2");
2468 ASSERT_TRUE(var_str->op_accurate(var_str));
2469 ASSERT_TRUE(var_str->op_accurate(Obj::CreateString(
"STRING")));
2470 ASSERT_FALSE(var_str->op_accurate(var_str2));
2473 ObjPtr var_empty2 = Obj::CreateNone();
2475 ASSERT_TRUE(var_empty->op_accurate(var_empty));
2476 ASSERT_TRUE(var_empty->op_accurate(var_empty2));
2481 ObjPtr var_zero = Obj::CreateValue(0, ObjType::None);
2482 ASSERT_TRUE(var_zero->is_bool_type());
2483 ASSERT_TRUE(var_zero->is_arithmetic_type());
2484 ASSERT_EQ(ObjType::Bool, var_zero->m_var_type_current);
2486 ObjPtr var_bool = Obj::CreateBool(
true);
2487 ASSERT_TRUE(var_bool->is_bool_type());
2488 ASSERT_TRUE(var_bool->is_arithmetic_type());
2489 ASSERT_EQ(ObjType::Bool, var_bool->m_var_type_current);
2491 ObjPtr var_char = Obj::CreateValue(100);
2492 ASSERT_TRUE(var_char->is_arithmetic_type());
2493 ASSERT_EQ(ObjType::Int8, var_char->m_var_type_current);
2495 ObjPtr var_int = Obj::CreateValue(100000);
2496 ASSERT_TRUE(var_int->is_arithmetic_type());
2497 ASSERT_EQ(ObjType::Int32, var_int->m_var_type_current) <<
newlang::toString(var_char->m_var_type_current);
2499 ObjPtr var_float = Obj::CreateValue(1.0);
2500 ASSERT_TRUE(var_float->is_arithmetic_type());
2501 ASSERT_EQ(ObjType::Float32, var_float->m_var_type_current) <<
newlang::toString(var_char->m_var_type_current);
2503 ObjPtr var_tensor = Obj::CreateRange(0, 10)->toType(ObjType::Int32);
2504 ASSERT_TRUE(var_tensor->is_arithmetic_type());
2505 ASSERT_EQ(ObjType::Int32, var_tensor->m_var_type_current) <<
newlang::toString(var_char->m_var_type_current);
2507 var_tensor->operator*=(var_bool);
2508 ASSERT_TRUE(var_tensor->is_arithmetic_type());
2509 EXPECT_EQ(ObjType::Int32, var_tensor->m_var_type_current) <<
newlang::toString(var_char->m_var_type_current);
2511 var_tensor->operator*=(var_int);
2512 ASSERT_TRUE(var_tensor->is_arithmetic_type());
2513 EXPECT_EQ(ObjType::Int32, var_tensor->m_var_type_current) <<
newlang::toString(var_char->m_var_type_current);
2515 var_tensor->operator*=(var_float);
2516 ASSERT_TRUE(var_tensor->is_arithmetic_type());
2517 EXPECT_EQ(ObjType::Float32, var_tensor->m_var_type_current) <<
newlang::toString(var_char->m_var_type_current);
2520TEST(RunTest, Exist) {
2522 Obj var_array(ObjType::Dictionary);
2524 var_array.push_back(Obj::CreateString(
"item1"));
2525 var_array.push_back(Obj::CreateString(
"item2"));
2527 ObjPtr item = Obj::CreateString(
"item1");
2528 ASSERT_TRUE(var_array.exist(item,
true));
2529 item->SetValue_(
"item2");
2530 ASSERT_TRUE(var_array.exist(item,
true));
2531 item->SetValue_(
"item");
2532 ASSERT_FALSE(var_array.exist(item,
true));
2535 Obj var_map(ObjType::Dictionary);
2537 var_map.push_back(Obj::CreateString(
"MAP_VALUE1"),
"map1");
2538 var_map.push_back(Obj::CreateString(
"MAP_VALUE2"),
"map2");
2540 ASSERT_TRUE(var_map[std::string(
"map1")].second);
2541 ASSERT_TRUE(var_map[
"map2"].second);
2542 ASSERT_EQ(var_map.find(
"map"), var_map.end());
2546TEST(RunTest, Intersec) {
2548 Obj var_array(ObjType::Dictionary);
2549 Obj var_array2(ObjType::Dictionary);
2551 var_array.push_back(Obj::CreateString(
"item1"));
2552 var_array.push_back(Obj::CreateString(
"item2"));
2554 ObjPtr result = var_array.op_bit_and(var_array2,
true);
2555 ASSERT_TRUE(
result->empty());
2557 var_array2.push_back(Obj::CreateString(
"item3"));
2559 result = var_array.op_bit_and(var_array2,
true);
2560 ASSERT_TRUE(
result->empty());
2562 var_array2.push_back(Obj::CreateString(
"item1"));
2563 result = var_array.op_bit_and(var_array2,
true);
2564 ASSERT_FALSE(
result->empty());
2565 ASSERT_EQ(1,
result->size());
2567 var_array2.push_back(Obj::CreateString(
"item2"));
2568 result = var_array.op_bit_and(var_array2,
true);
2569 ASSERT_FALSE(
result->empty());
2570 ASSERT_EQ(2,
result->size());
2606TEST(RunTest, Print) {
2611 ObjPtr var_int = Obj::CreateValue(100, ObjType::None);
2612 ObjPtr var_num = Obj::CreateValue(100.123, ObjType::None);
2613 ObjPtr var_str = Obj::CreateString(L
"STRCHAR");
2614 ObjPtr var_strbyte = Obj::CreateString(
"STRBYTE");
2615 ObjPtr var_bool = Obj::CreateBool(
true);
2616 ObjPtr var_empty = Obj::CreateNone();
2618 ASSERT_STREQ(
"100", var_int->toString().c_str()) << var_int;
2619 ASSERT_STREQ(
"100.123", var_num->toString().c_str()) << var_num;
2620 ASSERT_STREQ(
"\"STRCHAR\"", var_str->toString().c_str()) << var_str;
2621 ASSERT_STREQ(
"'STRBYTE'", var_strbyte->toString().c_str()) << var_strbyte;
2622 ASSERT_STREQ(
"1", var_bool->toString().c_str()) << var_bool;
2623 ASSERT_STREQ(
"_", var_empty->toString().c_str()) << var_empty;
2625 ObjPtr var_dict = Obj::CreateType(ObjType::Dictionary);
2627 ASSERT_STREQ(
"(,)", var_dict->toString().c_str()) << var_dict;
2629 var_dict->m_var_name =
"dict";
2630 ASSERT_STREQ(
"dict=(,)", var_dict->toString().c_str()) << var_dict;
2632 var_dict->push_back(Obj::CreateString(L
"item1"));
2633 ASSERT_STREQ(
"dict=(\"item1\",)", var_dict->toString().c_str()) << var_dict;
2634 var_dict->push_back(var_int);
2635 var_dict->push_back(var_bool);
2636 ASSERT_STREQ(
"dict=(\"item1\", 100, 1,)", var_dict->toString().c_str()) << var_dict;
2639 ObjPtr var_array = Obj::CreateDict();
2641 ASSERT_STREQ(
"(,)", var_array->toString().c_str()) << var_array;
2643 var_array->m_var_name =
"array";
2644 ASSERT_STREQ(
"array=(,)", var_array->toString().c_str()) << var_array;
2646 var_array->push_back(Obj::CreateString(
"item1"));
2647 ASSERT_STREQ(
"array=('item1',)", var_array->toString().c_str()) << var_array;
2648 ASSERT_NO_THROW(var_array->push_back(var_int));
2649 ASSERT_NO_THROW(var_array->push_back(var_bool));
2650 ASSERT_STREQ(
"array=('item1', 100, 1,)", var_array->toString().c_str()) << var_array;
2654TEST(RunTest, CreateFromInteger) {
2658 ObjPtr var = jit->Run(
"123");
2660 ASSERT_EQ(ObjType::Int8, var->getType()) <<
toString(var->getType());
2661 ASSERT_EQ(123, var->GetValueAsInteger());
2663 ObjPtr var2 = jit->Run(
"123");
2665 ASSERT_EQ(ObjType::Int8, var2->getType()) <<
toString(var2->getType());
2666 ASSERT_EQ(123, var2->GetValueAsInteger());
2668 var = jit->Run(
"-123");
2670 ASSERT_EQ(ObjType::Int8, var->getType()) <<
toString(var->getType());
2671 ASSERT_EQ(-123, var->GetValueAsInteger());
2673 var2 = jit->Run(
"-123");
2675 ASSERT_EQ(ObjType::Int8, var2->getType()) <<
toString(var2->getType());
2676 ASSERT_EQ(-123, var2->GetValueAsInteger());
2679TEST(RunTest, CreateFromNumber) {
2683 ObjPtr var = jit->Run(
"123.123");
2685 ASSERT_EQ(ObjType::Float32, var->getType());
2686 ASSERT_DOUBLE_EQ(123.123, var->GetValueAsNumber());
2688 ObjPtr var2 = jit->Run(
"123.123");
2690 ASSERT_EQ(ObjType::Float32, var2->getType());
2691 ASSERT_DOUBLE_EQ(123.123, var2->GetValueAsNumber());
2693 var = jit->Run(
"-123.123");
2695 ASSERT_EQ(ObjType::Float64, var->getType());
2696 ASSERT_DOUBLE_EQ(-123.123, var->GetValueAsNumber());
2698 var2 = jit->Run(
"-123.123E+40");
2700 ASSERT_EQ(ObjType::Float64, var2->getType());
2701 ASSERT_DOUBLE_EQ(-123.123E+40, var2->GetValueAsNumber());
2704TEST(RunTest, CreateFromString) {
2708 ObjPtr var = jit->Run(
"\"123.123\"");
2710 ASSERT_EQ(ObjType::StrWide, var->getType());
2711 ASSERT_STREQ(
"123.123", var->GetValueAsString().c_str());
2713 ObjPtr var2 = jit->Run(
"\"123.123\"");
2715 ASSERT_EQ(ObjType::StrWide, var2->getType());
2716 ASSERT_STREQ(
"123.123", var2->GetValueAsString().c_str());
2718 var = jit->Run(
"'строка'");
2720 ASSERT_EQ(ObjType::StrChar, var->getType());
2721 ASSERT_STREQ(
"строка", var->GetValueAsString().c_str());
2723 var2 = jit->Run(
"'строка'");
2725 ASSERT_EQ(ObjType::StrChar, var2->getType());
2726 ASSERT_STREQ(
"строка", var2->GetValueAsString().c_str());
2729TEST(RunTest, CreateFromRational) {
2733 ObjPtr var = jit->Run(
"123\\1");
2735 ASSERT_EQ(ObjType::Rational, var->getType()) <<
toString(var->getType());
2736 ASSERT_EQ(123, var->GetValueAsInteger());
2737 ASSERT_DOUBLE_EQ(123.0, var->GetValueAsNumber());
2739 ObjPtr var2 = jit->Run(
"123\\1");
2741 ASSERT_EQ(ObjType::Rational, var2->getType()) <<
toString(var2->getType());
2742 ASSERT_EQ(123, var2->GetValueAsInteger());
2743 ASSERT_DOUBLE_EQ(123, var2->GetValueAsNumber());
2745 var = jit->Run(
"-123\\1");
2747 ASSERT_EQ(ObjType::Rational, var->getType()) <<
toString(var->getType());
2748 ASSERT_EQ(-123, var->GetValueAsInteger());
2749 ASSERT_DOUBLE_EQ(-123.0, var->GetValueAsNumber());
2751 var2 = jit->Run(
"-123\\1");
2753 ASSERT_EQ(ObjType::Rational, var2->getType()) <<
toString(var2->getType());
2754 ASSERT_EQ(-123, var2->GetValueAsInteger());
2755 ASSERT_DOUBLE_EQ(-123, var2->GetValueAsNumber());
2935TEST(Types, FromLimit) {
2937 std::multimap<int64_t, ObjType> IntTypes = {
2941 {127, ObjType::Int8},
2943 {256, ObjType::Int16},
2944 {-1, ObjType::Int8},
2945 {-200, ObjType::Int16},
2946 {66000, ObjType::Int32},
2947 {-33000, ObjType::Int32},
2948 {5000000000, ObjType::Int64},
2951 for (
auto elem : IntTypes) {
2961TEST(RunTest, Tensor) {
2965 std::string from_str =
"русские буквы для ПРОВЕРКИ КОНВЕРТАЦИИ символов";
2969 ASSERT_STREQ(from_str.c_str(), conv_str.c_str());
2972 ObjPtr str = Obj::CreateString(
"test");
2974 ASSERT_STREQ(
"test", str->m_value.c_str());
2976 torch::Tensor tstr_t;
2980 ASSERT_TRUE(tstr_t.defined());
2981 ASSERT_EQ(tstr_t.index({0}).item<
int>(),
't');
2982 ASSERT_EQ(tstr_t.index({1}).item<
int>(),
'e');
2983 ASSERT_EQ(tstr_t.index({2}).item<
int>(),
's');
2984 ASSERT_EQ(tstr_t.index({3}).item<
int>(),
't');
2987 torch::Tensor tensot_temp = *str->toType(ObjType::Tensor)->m_tensor;
2988 ASSERT_TRUE(tensot_temp.defined());
2989 ASSERT_EQ(tensot_temp.index({0}).item<
int>(),
't');
2990 ASSERT_EQ(tensot_temp.index({1}).item<
int>(),
'e');
2991 ASSERT_EQ(tensot_temp.index({2}).item<
int>(),
's');
2992 ASSERT_EQ(tensot_temp.index({3}).item<
int>(),
't');
2995 ASSERT_EQ(t_str->m_var_type_current, ObjType::Int8) <<
toString(t_str->m_var_type_current);
2996 ASSERT_EQ(4, t_str->size());
2997 ASSERT_TRUE(t_str->m_tensor->defined());
2999 ASSERT_EQ(t_str->m_tensor->index({0}).item<
int>(),
't');
3000 ASSERT_EQ(t_str->m_tensor->index({1}).item<
int>(),
'e');
3001 ASSERT_EQ(t_str->m_tensor->index({2}).item<
int>(),
's');
3002 ASSERT_EQ(t_str->m_tensor->index({3}).item<
int>(),
't');
3004 ASSERT_EQ(t_str->index_get({0})->GetValueAsInteger(),
't');
3005 ASSERT_EQ(t_str->index_get({1})->GetValueAsInteger(),
'e');
3006 ASSERT_EQ(t_str->index_get({2})->GetValueAsInteger(),
's');
3007 ASSERT_EQ(t_str->index_get({3})->GetValueAsInteger(),
't');
3009 ASSERT_STREQ(t_str->toType(ObjType::StrWide)->GetValueAsString().c_str(),
"test") << t_str->toType(ObjType::StrWide)->GetValueAsString();
3011 t_str->index_set_({1}, Obj::CreateString(
"E"));
3012 t_str->index_set_({2}, Obj::CreateString(
"S"));
3014 EXPECT_STREQ(t_str->toType(ObjType::StrWide)->GetValueAsString().c_str(),
"tESt") << t_str->toType(ObjType::StrWide)->GetValueAsString();
3017 ObjPtr wstr = Obj::CreateString(L
"ТЕСТ");
3019 if (
sizeof (
wchar_t) == 2) {
3020 ASSERT_EQ(t_wstr->m_var_type_current, ObjType::Int16);
3022 ASSERT_TRUE(
sizeof (
wchar_t) == 4);
3023 ASSERT_EQ(t_wstr->m_var_type_current, ObjType::Int32);
3025 ASSERT_EQ(4, t_wstr->size());
3027 ASSERT_EQ(t_wstr->index_get({0})->GetValueAsInteger(), L
'Т');
3028 ASSERT_EQ(t_wstr->index_get({1})->GetValueAsInteger(), L
'Е');
3029 ASSERT_EQ(t_wstr->index_get({2})->GetValueAsInteger(), L
'С');
3030 ASSERT_EQ(t_wstr->index_get({3})->GetValueAsInteger(), L
'Т');
3032 std::wstring test_wide = t_wstr->toType(ObjType::StrWide)->GetValueAsStringWide();
3033 EXPECT_STREQ(
utf8_encode(test_wide).c_str(),
"ТЕСТ");
3035 std::string test_str = t_wstr->toType(ObjType::StrWide)->GetValueAsString();
3036 EXPECT_STREQ(test_str.c_str(),
"ТЕСТ") << test_str;
3038 t_wstr->index_set_({1}, Obj::CreateString(L
"е"));
3039 t_wstr->index_set_({2}, Obj::CreateString(L
"с"));
3041 test_str = t_wstr->toType(ObjType::StrWide)->GetValueAsString();
3042 EXPECT_STREQ(test_str.c_str(),
"ТесТ") << test_str;
3048 ObjPtr dict = Obj::CreateDict();
3050 dict->push_back(Obj::Arg(1,
"1"));
3051 dict->push_back(Obj::Arg(2,
"22"));
3052 dict->push_back(Obj::Arg(3,
"333"));
3053 dict->push_back(Obj::Arg(4));
3054 dict->push_back(Obj::Arg(5,
"555"));
3056 ASSERT_EQ(5, dict->size());
3058 auto all = std::regex(
"(.|\\n)*");
3059 ASSERT_TRUE(std::regex_match(
"1", all));
3060 ASSERT_TRUE(std::regex_match(
"22", all));
3061 ASSERT_TRUE(std::regex_match(
"333", all));
3062 ASSERT_TRUE(std::regex_match(
"", all));
3063 ASSERT_TRUE(std::regex_match(
"\n", all));
3064 ASSERT_TRUE(std::regex_match(
"\n\n\\n", all));
3067 Iterator <Obj> iter(dict);
3069 ASSERT_TRUE(iter == iter.begin());
3070 ASSERT_TRUE(iter != iter.end());
3072 ObjPtr copy = Obj::CreateDict();
3073 for (
auto &elem : iter) {
3075 copy->push_back(elem.second, elem.first);
3078 ASSERT_TRUE(iter == iter.begin());
3079 ASSERT_TRUE(iter != iter.end());
3081 ASSERT_EQ(dict->size(), copy->size());
3084 ASSERT_TRUE(iter == iter.begin());
3086 ObjPtr one = iter.read_and_next(0);
3088 ASSERT_EQ(1, one->GetValueAsInteger());
3090 ASSERT_EQ(2, (*iter).second->GetValueAsInteger());
3091 one = iter.read_and_next(0);
3093 ASSERT_EQ(2, one->GetValueAsInteger());
3095 ASSERT_EQ(3, (*iter).second->GetValueAsInteger());
3096 one = iter.read_and_next(0);
3098 ASSERT_EQ(3, one->GetValueAsInteger());
3100 ASSERT_EQ(4, (*iter).second->GetValueAsInteger());
3101 one = iter.read_and_next(0);
3103 ASSERT_EQ(4, one->GetValueAsInteger());
3105 ASSERT_EQ(5, (*iter).second->GetValueAsInteger());
3106 one = iter.read_and_next(0);
3108 ASSERT_EQ(5, one->GetValueAsInteger());
3110 one = iter.read_and_next(0);
3112 ASSERT_EQ(ObjType::IteratorEnd, one->getType()) << one <<
" " <<
toString(one->getType());
3114 one = iter.read_and_next(0);
3116 ASSERT_EQ(ObjType::IteratorEnd, one->getType()) << one <<
" " <<
toString(one->getType());
3121 ASSERT_TRUE(iter == iter.end());
3123 ASSERT_TRUE(iter == iter.begin());
3124 ASSERT_TRUE(iter != iter.end());
3126 ObjPtr dict1 = iter.read_and_next(-3);
3128 ASSERT_EQ(3, dict1->size());
3129 ASSERT_EQ(1, dict1->at(0).second->GetValueAsInteger());
3130 ASSERT_EQ(2, dict1->at(1).second->GetValueAsInteger());
3131 ASSERT_EQ(3, dict1->at(2).second->GetValueAsInteger());
3133 ObjPtr dict2 = iter.read_and_next(-3);
3135 ASSERT_EQ(3, dict2->size());
3136 ASSERT_EQ(4, dict2->at(0).second->GetValueAsInteger());
3137 ASSERT_EQ(5, dict2->at(1).second->GetValueAsInteger());
3138 ASSERT_EQ(ObjType::IteratorEnd, dict2->at(2).second->getType());
3140 ObjPtr dict3 = iter.read_and_next(-3);
3142 ASSERT_EQ(3, dict1->size());
3143 ASSERT_EQ(ObjType::IteratorEnd, dict3->at(0).second->getType());
3144 ASSERT_EQ(ObjType::IteratorEnd, dict3->at(1).second->getType());
3145 ASSERT_EQ(ObjType::IteratorEnd, dict3->at(2).second->getType());
3149 ASSERT_TRUE(iter == iter.end());
3151 ASSERT_TRUE(iter == iter.begin());
3152 ASSERT_TRUE(iter != iter.end());
3154 dict1 = iter.read_and_next(3);
3156 ASSERT_EQ(3, dict1->size());
3157 ASSERT_EQ(1, dict1->at(0).second->GetValueAsInteger());
3158 ASSERT_EQ(2, dict1->at(1).second->GetValueAsInteger());
3159 ASSERT_EQ(3, dict1->at(2).second->GetValueAsInteger());
3161 dict2 = iter.read_and_next(3);
3163 ASSERT_EQ(2, dict2->size());
3164 ASSERT_EQ(4, dict2->at(0).second->GetValueAsInteger());
3165 ASSERT_EQ(5, dict2->at(1).second->GetValueAsInteger());
3167 dict3 = iter.read_and_next(3);
3169 ASSERT_EQ(0, dict3->size());
3174 Iterator <Obj> flt(dict,
"");
3175 ObjPtr flt_res = flt.read_and_next(100);
3176 ASSERT_TRUE(flt_res);
3177 ASSERT_EQ(1, flt_res->size());
3178 ASSERT_EQ(4, flt_res->at(0).second->GetValueAsInteger());
3181 Iterator <Obj> flt1(dict,
".");
3182 ObjPtr flt1_res = flt1.read_and_next(100);
3183 ASSERT_TRUE(flt1_res);
3184 ASSERT_EQ(1, flt1_res->size());
3185 ASSERT_EQ(1, flt1_res->at(0).second->GetValueAsInteger());
3188 Iterator <Obj> flt2(dict,
"..");
3189 ObjPtr flt2_res = flt2.read_and_next(100);
3190 ASSERT_TRUE(flt2_res);
3191 ASSERT_EQ(1, flt2_res->size());
3192 ASSERT_EQ(2, flt2_res->at(0).second->GetValueAsInteger());
3194 Iterator <Obj> flt3(dict,
"...");
3195 ObjPtr flt3_res = flt3.read_and_next(100);
3196 ASSERT_TRUE(flt3_res);
3197 ASSERT_EQ(2, flt3_res->size());
3198 ASSERT_EQ(3, flt3_res->at(0).second->GetValueAsInteger());
3199 ASSERT_EQ(5, flt3_res->at(1).second->GetValueAsInteger());
3207TEST(RunTest, System) {
3209 ASSERT_STREQ(
"name",
ExtractName(
"name").c_str());
3210 ASSERT_STREQ(
"name",
ExtractName(
"::name").c_str());
3211 ASSERT_STREQ(
"name",
ExtractName(
"ns::name").c_str());
3213 ASSERT_STREQ(
"",
ExtractName(
"\\\\dir.file").c_str());
3214 ASSERT_STREQ(
"var",
ExtractName(
"\\dir.file::var").c_str());
3215 ASSERT_STREQ(
"var.field",
ExtractName(
"\\\\dir.file::var.field").c_str());
3221 ASSERT_STREQ(
"\\\\dir.file",
ExtractModuleName(
"\\\\dir.file::var.field").c_str());
3224 ObjPtr none = Obj::CreateNone();
3226 ASSERT_TRUE(none->at(
"__error_field_name__").second);
3227 ASSERT_STREQ(
"Internal field '__error_field_name__' not exist!", none->at(
"__error_field_name__").second->GetValueAsString().c_str());
3229 ASSERT_TRUE(none->at(
"__type__").second);
3230 ASSERT_STREQ(
":None", none->at(
"__type__").second->GetValueAsString().c_str());
3232 ASSERT_TRUE(none->at(
"__type_fixed__").second);
3233 ASSERT_STREQ(
":None", none->at(
"__type_fixed__").second->GetValueAsString().c_str());
3235 ASSERT_TRUE(none->at(
"__name__").second);
3236 ASSERT_STREQ(
"", none->at(
"__name__").second->GetValueAsString().c_str());
3238 ASSERT_TRUE(none->at(
"__full_name__").second);
3239 ASSERT_STREQ(
"", none->at(
"__full_name__").second->GetValueAsString().c_str());
3241 ASSERT_TRUE(none->at(
"__module__").second);
3242 ASSERT_STREQ(
"", none->at(
"__module__").second->GetValueAsString().c_str());
3244 ASSERT_TRUE(none->at(
"__class__").second);
3245 ASSERT_STREQ(
"", none->at(
"__class__").second->GetValueAsString().c_str());
3247 ASSERT_TRUE(none->at(
"__base__").second);
3248 ASSERT_STREQ(
"(,)", none->at(
"__base__").second->GetValueAsString().c_str());
3250 ASSERT_TRUE(none->at(
"__doc__").second);
3251 ASSERT_STREQ(
"Help system not implemented!!!!!", none->at(
"__doc__").second->GetValueAsString().c_str());
3253 ASSERT_TRUE(none->at(
"__str__").second);
3254 ASSERT_STREQ(
"_", none->at(
"__str__").second->GetValueAsString().c_str());
3256 none->m_var_is_init =
false;
3257 ASSERT_TRUE(none->at(
"__error_field_name__").second);
3258 ASSERT_STREQ(
":Undefined", none->at(
"__error_field_name__").second->GetValueAsString().c_str());
3261 ObjPtr str = Obj::CreateString(
"str");
3262 str->m_var_name =
"name";
3264 ASSERT_TRUE(str->at(
"__type__").second);
3265 ASSERT_STREQ(
":StrChar", str->at(
"__type__").second->GetValueAsString().c_str());
3267 ASSERT_TRUE(str->at(
"__type_fixed__").second);
3268 ASSERT_STREQ(
":String", str->at(
"__type_fixed__").second->GetValueAsString().c_str());
3270 ASSERT_TRUE(str->at(
"__name__").second);
3271 ASSERT_STREQ(
"name", str->at(
"__name__").second->GetValueAsString().c_str());
3273 ASSERT_TRUE(str->at(
"__full_name__").second);
3274 ASSERT_STREQ(
"name", str->at(
"__full_name__").second->GetValueAsString().c_str());
3276 ASSERT_TRUE(str->at(
"__module__").second);
3277 ASSERT_STREQ(
"", str->at(
"__module__").second->GetValueAsString().c_str());
3279 ASSERT_TRUE(str->at(
"__class__").second);
3280 ASSERT_STREQ(
"", str->at(
"__class__").second->GetValueAsString().c_str());
3282 ASSERT_TRUE(str->at(
"__base__").second);
3283 ASSERT_STREQ(
"(,)", str->at(
"__base__").second->GetValueAsString().c_str());
3285 ASSERT_TRUE(str->at(
"__doc__").second);
3286 ASSERT_STREQ(
"Help system not implemented!!!!!", str->at(
"__doc__").second->GetValueAsString().c_str());
3288 ASSERT_TRUE(str->at(
"__str__").second);
3289 ASSERT_STREQ(
"name='str'", str->at(
"__str__").second->GetValueAsString().c_str());
3292 ObjPtr cls = Obj::CreateClass(
"class");
3293 cls->m_var_name =
"::ns::name";
3294 cls->push_back(Obj::CreateRange(0, 10, 3),
"filed");
3296 ASSERT_TRUE(cls->at(
"__type__").second);
3297 ASSERT_STREQ(
":Class", cls->at(
"__type__").second->GetValueAsString().c_str());
3299 ASSERT_TRUE(cls->at(
"__type_fixed__").second);
3300 ASSERT_STREQ(
":None", cls->at(
"__type_fixed__").second->GetValueAsString().c_str());
3302 ASSERT_TRUE(cls->at(
"__name__").second);
3303 ASSERT_STREQ(
"name", cls->at(
"__name__").second->GetValueAsString().c_str());
3305 ASSERT_TRUE(cls->at(
"__full_name__").second);
3306 ASSERT_STREQ(
"::ns::name", cls->at(
"__full_name__").second->GetValueAsString().c_str());
3308 ASSERT_TRUE(cls->at(
"__module__").second);
3309 ASSERT_STREQ(
"", cls->at(
"__module__").second->GetValueAsString().c_str());
3311 ASSERT_TRUE(cls->at(
"__class__").second);
3312 ASSERT_STREQ(
"class", cls->at(
"__class__").second->GetValueAsString().c_str());
3314 ASSERT_TRUE(cls->at(
"__base__").second);
3315 ASSERT_STREQ(
"(,)", cls->at(
"__base__").second->GetValueAsString().c_str());
3317 ASSERT_TRUE(cls->at(
"__doc__").second);
3318 ASSERT_STREQ(
"Help system not implemented!!!!!", cls->at(
"__doc__").second->GetValueAsString().c_str());
3320 ASSERT_TRUE(cls->at(
"__str__").second);
3321 ASSERT_STREQ(
"::ns::name=class(filed=0..10..3)", cls->at(
"__str__").second->GetValueAsString().c_str());
virtual int64_t size() const
virtual bool empty() const
std::enable_if< std::is_same< T, bool >::value, void >::type SetValue_(bool value)
Obj::const_iterator insert(Obj::const_iterator pos, const PairType &data)
PairType & push_back(const PairType &p)
Obj::const_iterator at_index_const(const int64_t index) const
std::wstring utf8_decode(const std::string str)
std::string ExtractName(std::string name)
std::shared_ptr< Obj > ObjPtr
std::shared_ptr< RunTime > RuntimePtr
std::string ExtractModuleName(const std::string_view name)
ObjType typeFromLimit(int64_t value, ObjType type_default=ObjType::Int64)
const char * toString(TermID type)
std::string utf8_encode(const std::wstring wstr)
std::string Dump(const T &iterable)
void ConvertStringToTensor(const std::string &from, torch::Tensor &to, ObjType type=ObjType::None)
ObjPtr CreateTensor(torch::Tensor tensor)