4#include <gtest/gtest.h>
6#include <torch/torch.h>
22 ASSERT_TRUE(var.
empty());
23 ASSERT_EQ(ObjType::None, var.
getType());
30 ASSERT_EQ(ObjType::Bool, var.
getType());
33 ASSERT_EQ(ObjType::Bool, var.
getType());
36 ASSERT_EQ(ObjType::Float32, var.
getType());
39 ASSERT_EQ(ObjType::Float64, var.
getType());
42 ASSERT_EQ(ObjType::Bool, var.
getType());
45 ASSERT_EQ(ObjType::Int8, var.
getType());
48 ASSERT_EQ(ObjType::Int8, var.
getType());
51 ASSERT_EQ(ObjType::Int16, var.
getType());
54 ASSERT_EQ(ObjType::Int32, var.
getType());
57 ASSERT_EQ(ObjType::Int64, var.
getType());
60 ASSERT_EQ(ObjType::Float32, var.
getType());
63 ASSERT_EQ(ObjType::Float64, var.
getType());
66 ASSERT_EQ(ObjType::Bool, var.
getType());
69TEST(ObjTest, String) {
83 ObjPtr str_byte = Obj::CreateString(
"byte");
84 ASSERT_STREQ(
"byte", str_byte->GetValueAsString().c_str());
85 ASSERT_EQ(4, str_byte->size());
86 ASSERT_EQ(4, str_byte->m_value.size());
87 ASSERT_STREQ(
"b", (*str_byte)[0].second->GetValueAsString().c_str());
88 ASSERT_STREQ(
"y", (*str_byte)[1].second->GetValueAsString().c_str());
89 ASSERT_STREQ(
"t", (*str_byte)[2].second->GetValueAsString().c_str());
90 ASSERT_STREQ(
"e", (*str_byte)[3].second->GetValueAsString().c_str());
92 str_byte->op_set_index(0,
"B");
93 str_byte->op_set_index(1,
"Y");
94 ASSERT_STREQ(
"BYte", str_byte->GetValueAsString().c_str());
95 str_byte->op_set_index(2,
"T");
96 str_byte->op_set_index(3,
"E");
97 ASSERT_STREQ(
"BYTE", str_byte->GetValueAsString().c_str());
99 ObjPtr str_char = Obj::CreateString(L
"строка");
100 ASSERT_EQ(6, str_char->size());
101 ASSERT_EQ(6, str_char->m_string.size());
103 ASSERT_STREQ(
"с", (*str_char)[0].second->GetValueAsString().c_str());
104 ASSERT_STREQ(
"т", (*str_char)[1].second->GetValueAsString().c_str());
105 ASSERT_STREQ(
"р", (*str_char)[2].second->GetValueAsString().c_str());
106 ASSERT_STREQ(
"о", (*str_char)[3].second->GetValueAsString().c_str());
107 ASSERT_STREQ(
"к", (*str_char)[4].second->GetValueAsString().c_str());
108 ASSERT_STREQ(
"а", (*str_char)[5].second->GetValueAsString().c_str());
110 str_char->op_set_index(0,
"С");
111 str_char->op_set_index(1,
"Т");
112 ASSERT_STREQ(
"СТрока", str_char->GetValueAsString().c_str());
113 str_char->op_set_index(2,
"Р");
114 str_char->op_set_index(3,
"О");
115 ASSERT_STREQ(
"СТРОка", str_char->GetValueAsString().c_str());
119TEST(ObjTest, CreateFromInteger) {
122 ASSERT_EQ(ObjType::Int8, var01.GetValueAsObject()->getType()) <<
toString(var01.GetValueAsObject()->getType());
128 Variable obj01(Obj::CreateValue(100));
129 ASSERT_EQ(ObjType::Int8, var01.GetValueAsObject()->getType()) <<
toString(var01.GetValueAsObject()->getType());
134 Variable obj03(std::monostate(),
"");
136 ASSERT_EQ(ObjType::Int8, obj03.GetValueAsObject()->getType()) <<
toString(obj03.GetValueAsObject()->getType());
139 LatterType latter1(VariablePair::Create(Term::CreateName(
"latter1"), Obj::CreateNone()));
141 ASSERT_TRUE(latter1.GetVariablePair().term);
142 ASSERT_STREQ(
"latter1", latter1.GetVariablePair().term->m_text.c_str());
143 ASSERT_STREQ(
"_", latter1.GetVariablePair().var.GetValueAsObject()->toString().c_str());
145 LatterType latter2(VariablePair::Create(Term::CreateName(
"latter2"), Obj::CreateValue(1)));
146 ASSERT_TRUE(latter2.GetVariablePair().term);
147 ASSERT_STREQ(
"latter2", latter2.GetVariablePair().term->m_text.c_str());
148 ASSERT_STREQ(
"1", latter2.GetVariablePair().var.GetValueAsObject()->toString().c_str());
152 ASSERT_TRUE(latter1.GetVariablePair().term);
153 ASSERT_STREQ(
"latter2", latter1.GetVariablePair().term->m_text.c_str());
154 ASSERT_STREQ(
"1", latter1.GetVariablePair().var.GetValueAsObject()->toString().c_str());
157 JIT *jit = JIT::ReCreate();
161 ASSERT_EQ(ObjType::Int8, var->getType()) <<
toString(var->getType());
162 ASSERT_EQ(123, var->GetValueAsInteger());
166 ASSERT_EQ(ObjType::Int8, var2->getType()) <<
toString(var2->getType());
167 ASSERT_EQ(123, var2->GetValueAsInteger());
169 var = jit->
Run(
"-123");
171 ASSERT_EQ(ObjType::Int8, var->getType()) <<
toString(var->getType());
172 ASSERT_EQ(-123, var->GetValueAsInteger());
174 var2 = jit->
Run(
"-123");
176 ASSERT_EQ(ObjType::Int8, var2->getType()) <<
toString(var2->getType());
177 ASSERT_EQ(-123, var2->GetValueAsInteger());
180TEST(ObjTest, CreateFromNumber) {
182 JIT *jit = JIT::ReCreate();
186 ASSERT_EQ(ObjType::Float32, var->getType());
187 ASSERT_DOUBLE_EQ(123.123, var->GetValueAsNumber());
191 ASSERT_EQ(ObjType::Float32, var2->getType());
192 ASSERT_DOUBLE_EQ(123.123, var2->GetValueAsNumber());
194 var = jit->
Run(
"-123.123");
196 ASSERT_EQ(ObjType::Float64, var->getType());
197 ASSERT_DOUBLE_EQ(-123.123, var->GetValueAsNumber());
199 var2 = jit->
Run(
"-123.123E+40");
201 ASSERT_EQ(ObjType::Float64, var2->getType());
202 ASSERT_DOUBLE_EQ(-123.123E+40, var2->GetValueAsNumber());
205TEST(ObjTest, CreateFromString) {
207 JIT *jit = JIT::ReCreate();
211 ASSERT_EQ(ObjType::StrWide, var->getType());
212 ASSERT_STREQ(
"123.123", var->GetValueAsString().c_str());
216 ASSERT_EQ(ObjType::StrWide, var2->getType());
217 ASSERT_STREQ(
"123.123", var2->GetValueAsString().c_str());
219 var = jit->
Run(
"'строка'");
221 ASSERT_EQ(ObjType::StrChar, var->getType());
222 ASSERT_STREQ(
"строка", var->GetValueAsString().c_str());
224 var2 = jit->
Run(
"'строка'");
226 ASSERT_EQ(ObjType::StrChar, var2->getType());
227 ASSERT_STREQ(
"строка", var2->GetValueAsString().c_str());
230TEST(ObjTest, CreateFromRational) {
232 JIT *jit = JIT::ReCreate();
236 ASSERT_EQ(ObjType::Rational, var->getType()) <<
toString(var->getType());
237 ASSERT_EQ(123, var->GetValueAsInteger());
238 ASSERT_DOUBLE_EQ(123.0, var->GetValueAsNumber());
242 ASSERT_EQ(ObjType::Rational, var2->getType()) <<
toString(var2->getType());
243 ASSERT_EQ(123, var2->GetValueAsInteger());
244 ASSERT_DOUBLE_EQ(123, var2->GetValueAsNumber());
246 var = jit->
Run(
"-123\\1");
248 ASSERT_EQ(ObjType::Rational, var->getType()) <<
toString(var->getType());
249 ASSERT_EQ(-123, var->GetValueAsInteger());
250 ASSERT_DOUBLE_EQ(-123.0, var->GetValueAsNumber());
252 var2 = jit->
Run(
"-123\\1");
254 ASSERT_EQ(ObjType::Rational, var2->getType()) <<
toString(var2->getType());
255 ASSERT_EQ(-123, var2->GetValueAsInteger());
256 ASSERT_DOUBLE_EQ(-123, var2->GetValueAsNumber());
261 JIT *jit = JIT::ReCreate();
264 Obj var(ObjType::Dictionary);
265 ASSERT_TRUE(var.empty());
266 EXPECT_ANY_THROW(var[0]);
268 ASSERT_EQ(0, var.size());
270 ASSERT_NO_THROW(var2 = jit->
Run(
"(,)"));
272 var.push_back(Obj::CreateString(
"Test1"));
273 ASSERT_EQ(1, var.size());
274 var.push_back(Obj::CreateString(
"Test3"));
275 ASSERT_EQ(2, var.size());
276 var.insert(var.at_index_const(1), Obj::Arg(2,
"2"));
277 var.insert(var.at_index_const(0), Obj::Arg(0,
"0"));
278 ASSERT_EQ(4, var.size());
280 ASSERT_TRUE(var[0].second->op_accurate(Obj::CreateValue(0, ObjType::None)));
281 ASSERT_TRUE(var[1].second->op_accurate(Obj::CreateString(
"Test1")));
282 ASSERT_TRUE(var[2].second->op_accurate(Obj::CreateValue(2, ObjType::None)));
283 ASSERT_TRUE(var[3].second->op_accurate(Obj::CreateString(L
"Test3")));
285 ASSERT_NO_THROW(var2 = jit->
Run(
"(0, \"Test1\", 2, 'Test3',)"));
287 ASSERT_TRUE((*var2)[0].second->op_accurate(Obj::CreateValue(0, ObjType::None)));
288 ASSERT_TRUE((*var2)[1].second->op_accurate(Obj::CreateString(
"Test1")));
289 ASSERT_TRUE((*var2)[2].second->op_accurate(Obj::CreateValue(2, ObjType::None)));
290 ASSERT_TRUE((*var2)[3].second->op_accurate(Obj::CreateString(L
"Test3")));
294 ASSERT_NO_THROW(var3 = jit->
Run(
"(0, \"Test1\", 2, 'Test3',)"));
296 ASSERT_TRUE((*var3)[0].second->op_accurate(Obj::CreateValue(0, ObjType::None)));
297 ASSERT_TRUE((*var3)[1].second->op_accurate(Obj::CreateString(
"Test1")));
298 ASSERT_TRUE((*var3)[2].second->op_accurate(Obj::CreateValue(2, ObjType::None)));
299 ASSERT_TRUE((*var3)[3].second->op_accurate(Obj::CreateString(L
"Test3")));
302TEST(ObjTest, AsMap) {
304 ObjPtr map = Obj::CreateType(ObjType::Dictionary);
305 ASSERT_TRUE(map->empty());
306 EXPECT_ANY_THROW((*map)[
"test1"]);
307 ASSERT_EQ(0, map->size());
309 ObjPtr temp = Obj::CreateString(
"Test");
310 map->push_back(temp,
"test1");
311 map->push_back(Obj::CreateValue(100, ObjType::None),
"test2");
312 ASSERT_EQ(2, map->size());
313 ASSERT_STREQ((*map)[
"test1"].second->toString().c_str(), temp->toString().c_str()) << temp->toString().c_str();
315 ASSERT_TRUE((*map)[
"test2"].second);
316 ObjPtr temp100 = Obj::CreateValue(100, ObjType::None);
317 ASSERT_TRUE(map->exist(temp100,
true));
319 ObjPtr test2 = (*map)[
"test2"].second;
322 ASSERT_STREQ(
"100", test2->toString().c_str());
327 ObjPtr var_int = Obj::CreateValue(100, ObjType::None);
328 ObjPtr var_num = Obj::CreateValue(100.0, ObjType::None);
329 ObjPtr var_str = Obj::CreateString(L
"STRING");
330 ObjPtr var_bool = Obj::CreateBool(
true);
331 ObjPtr var_empty = Obj::CreateNone();
333 ASSERT_EQ(var_int->m_var_type_current, ObjType::Int8) << (int) var_int->getType();
334 ASSERT_EQ(var_num->m_var_type_current, ObjType::Float32) << (int) var_num->getType();
335 ASSERT_EQ(var_str->m_var_type_current, ObjType::StrWide) << (int) var_str->getType();
336 ASSERT_EQ(var_bool->m_var_type_current, ObjType::Bool) << (int) var_bool->getType();
337 ASSERT_EQ(var_empty->m_var_type_current, ObjType::None) << (int) var_empty->getType();
338 ASSERT_TRUE(var_empty->empty()) << (int) var_empty->getType();
339 ASSERT_FALSE(var_int->empty()) << (int) var_int->getType();
342 ASSERT_TRUE(var_int->op_accurate(Obj::CreateValue(100, ObjType::None)));
343 ASSERT_FALSE(var_int->op_accurate(Obj::CreateValue(111, ObjType::None)));
345 ASSERT_TRUE(var_num->op_equal(Obj::CreateValue(100.0, ObjType::None)));
346 ASSERT_FALSE(var_num->op_equal(Obj::CreateValue(100.0001, ObjType::None)));
347 ASSERT_TRUE(var_num->op_accurate(Obj::CreateValue(100.0, ObjType::None)));
348 ASSERT_FALSE(var_num->op_accurate(Obj::CreateValue(100.0001, ObjType::None)));
350 ASSERT_TRUE(var_int->op_equal(Obj::CreateValue(100.0, ObjType::None)));
351 ASSERT_TRUE(var_int->op_accurate(Obj::CreateValue(100.0, ObjType::None)));
352 ASSERT_FALSE(var_int->op_equal(Obj::CreateValue(100.1, ObjType::None)));
353 ASSERT_FALSE(var_int->op_accurate(Obj::CreateValue(100.1, ObjType::None)));
356 ObjPtr var_int2 = Obj::CreateValue(101, ObjType::None);
357 ObjPtr var_num2 = Obj::CreateValue(100.1, ObjType::None);
360 ASSERT_TRUE(var_int->op_accurate(var_int));
361 ASSERT_FALSE(var_int->op_accurate(var_int2));
363 ASSERT_TRUE(var_num->op_accurate(var_num));
364 ASSERT_FALSE(var_num->op_accurate(var_num2));
366 ASSERT_TRUE(var_int->op_equal(var_num));
368 ASSERT_FALSE(var_int->op_equal(var_num2));
369 ASSERT_FALSE(var_num2->op_equal(var_int));
371 ObjPtr var_bool2 = Obj::CreateBool(
false);
373 ASSERT_TRUE(var_bool->op_accurate(var_bool));
374 ASSERT_FALSE(var_bool->op_accurate(var_bool2));
376 ObjPtr var_str2 = Obj::CreateString(
"STRING2");
378 ASSERT_TRUE(var_str->op_accurate(var_str));
379 ASSERT_TRUE(var_str->op_accurate(Obj::CreateString(
"STRING")));
380 ASSERT_FALSE(var_str->op_accurate(var_str2));
383 ObjPtr var_empty2 = Obj::CreateNone();
385 ASSERT_TRUE(var_empty->op_accurate(var_empty));
386 ASSERT_TRUE(var_empty->op_accurate(var_empty2));
389TEST(ObjTest, Exist) {
391 Obj var_array(ObjType::Dictionary);
393 var_array.push_back(Obj::CreateString(
"item1"));
394 var_array.push_back(Obj::CreateString(
"item2"));
396 ObjPtr item = Obj::CreateString(
"item1");
397 ASSERT_TRUE(var_array.exist(item,
true));
398 item->SetValue_(
"item2");
399 ASSERT_TRUE(var_array.exist(item,
true));
400 item->SetValue_(
"item");
401 ASSERT_FALSE(var_array.exist(item,
true));
404 Obj var_map(ObjType::Dictionary);
406 var_map.push_back(Obj::CreateString(
"MAP_VALUE1"),
"map1");
407 var_map.push_back(Obj::CreateString(
"MAP_VALUE2"),
"map2");
409 ASSERT_TRUE(var_map[std::string(
"map1")].second);
410 ASSERT_TRUE(var_map[
"map2"].second);
411 ASSERT_EQ(var_map.find(
"map"), var_map.end());
415TEST(ObjTest, Intersec) {
417 Obj var_array(ObjType::Dictionary);
418 Obj var_array2(ObjType::Dictionary);
420 var_array.push_back(Obj::CreateString(
"item1"));
421 var_array.push_back(Obj::CreateString(
"item2"));
424 ASSERT_TRUE(
result->empty());
426 var_array2.push_back(Obj::CreateString(
"item3"));
428 result = var_array.op_bit_and(var_array2,
true);
429 ASSERT_TRUE(
result->empty());
431 var_array2.push_back(Obj::CreateString(
"item1"));
432 result = var_array.op_bit_and(var_array2,
true);
433 ASSERT_FALSE(
result->empty());
434 ASSERT_EQ(1,
result->size());
436 var_array2.push_back(Obj::CreateString(
"item2"));
437 result = var_array.op_bit_and(var_array2,
true);
438 ASSERT_FALSE(
result->empty());
439 ASSERT_EQ(2,
result->size());
475TEST(ObjTest, Print) {
477 JIT *jit = JIT::ReCreate();
480 ObjPtr var_int = Obj::CreateValue(100, ObjType::None);
481 ObjPtr var_num = Obj::CreateValue(100.123, ObjType::None);
482 ObjPtr var_str = Obj::CreateString(L
"STRCHAR");
483 ObjPtr var_strbyte = Obj::CreateString(
"STRBYTE");
484 ObjPtr var_bool = Obj::CreateBool(
true);
485 ObjPtr var_empty = Obj::CreateNone();
487 ASSERT_STREQ(
"100", var_int->toString().c_str()) << var_int;
488 ASSERT_STREQ(
"100.123", var_num->toString().c_str()) << var_num;
489 ASSERT_STREQ(
"\"STRCHAR\"", var_str->toString().c_str()) << var_str;
490 ASSERT_STREQ(
"'STRBYTE'", var_strbyte->toString().c_str()) << var_strbyte;
491 ASSERT_STREQ(
"1", var_bool->toString().c_str()) << var_bool;
492 ASSERT_STREQ(
"_", var_empty->toString().c_str()) << var_empty;
494 ObjPtr var_dict = Obj::CreateType(ObjType::Dictionary);
496 ASSERT_STREQ(
"(,)", var_dict->toString().c_str()) << var_dict;
498 var_dict->m_var_name =
"dict";
499 ASSERT_STREQ(
"dict=(,)", var_dict->toString().c_str()) << var_dict;
501 var_dict->push_back(Obj::CreateString(L
"item1"));
502 ASSERT_STREQ(
"dict=(\"item1\",)", var_dict->toString().c_str()) << var_dict;
503 var_dict->push_back(var_int);
504 var_dict->push_back(var_bool);
505 ASSERT_STREQ(
"dict=(\"item1\", 100, 1,)", var_dict->toString().c_str()) << var_dict;
508 ObjPtr var_array = Obj::CreateDict();
510 ASSERT_STREQ(
"(,)", var_array->toString().c_str()) << var_array;
512 var_array->m_var_name =
"array";
513 ASSERT_STREQ(
"array=(,)", var_array->toString().c_str()) << var_array;
515 var_array->push_back(Obj::CreateString(
"item1"));
516 ASSERT_STREQ(
"array=('item1',)", var_array->toString().c_str()) << var_array;
517 ASSERT_NO_THROW(var_array->push_back(var_int));
518 ASSERT_NO_THROW(var_array->push_back(var_bool));
519 ASSERT_STREQ(
"array=('item1', 100, 1,)", var_array->toString().c_str()) << var_array;
701TEST(ObjTest, FromLimit) {
703 std::multimap<int64_t, ObjType> IntTypes = {
707 {127, ObjType::Int8},
709 {256, ObjType::Int16},
711 {-200, ObjType::Int16},
712 {66000, ObjType::Int32},
713 {-33000, ObjType::Int32},
714 {5000000000, ObjType::Int64},
717 for (
auto elem : IntTypes) {
727TEST(ObjTest, Tensor) {
731 std::string from_str =
"русские буквы для ПРОВЕРКИ КОНВЕРТАЦИИ символов";
735 ASSERT_STREQ(from_str.c_str(), conv_str.c_str());
738 ObjPtr str = Obj::CreateString(
"test");
740 ASSERT_STREQ(
"test", str->m_value.c_str());
742 torch::Tensor tstr_t;
746 ASSERT_TRUE(tstr_t.defined());
747 ASSERT_EQ(tstr_t.index({0}).item<
int>(),
't');
748 ASSERT_EQ(tstr_t.index({1}).item<
int>(),
'e');
749 ASSERT_EQ(tstr_t.index({2}).item<
int>(),
's');
750 ASSERT_EQ(tstr_t.index({3}).item<
int>(),
't');
753 torch::Tensor tensot_temp = *str->toType(ObjType::Tensor)->m_tensor;
754 ASSERT_TRUE(tensot_temp.defined());
755 ASSERT_EQ(tensot_temp.index({0}).item<
int>(),
't');
756 ASSERT_EQ(tensot_temp.index({1}).item<
int>(),
'e');
757 ASSERT_EQ(tensot_temp.index({2}).item<
int>(),
's');
758 ASSERT_EQ(tensot_temp.index({3}).item<
int>(),
't');
761 ASSERT_EQ(t_str->m_var_type_current, ObjType::Int8) <<
toString(t_str->m_var_type_current);
762 ASSERT_EQ(4, t_str->size());
763 ASSERT_TRUE(t_str->m_tensor->defined());
765 ASSERT_EQ(t_str->m_tensor->index({0}).item<
int>(),
't');
766 ASSERT_EQ(t_str->m_tensor->index({1}).item<
int>(),
'e');
767 ASSERT_EQ(t_str->m_tensor->index({2}).item<
int>(),
's');
768 ASSERT_EQ(t_str->m_tensor->index({3}).item<
int>(),
't');
770 ASSERT_EQ(t_str->index_get({0})->GetValueAsInteger(),
't');
771 ASSERT_EQ(t_str->index_get({1})->GetValueAsInteger(),
'e');
772 ASSERT_EQ(t_str->index_get({2})->GetValueAsInteger(),
's');
773 ASSERT_EQ(t_str->index_get({3})->GetValueAsInteger(),
't');
775 ASSERT_STREQ(t_str->toType(ObjType::StrWide)->GetValueAsString().c_str(),
"test") << t_str->toType(ObjType::StrWide)->GetValueAsString();
777 t_str->index_set_({1}, Obj::CreateString(
"E"));
778 t_str->index_set_({2}, Obj::CreateString(
"S"));
780 EXPECT_STREQ(t_str->toType(ObjType::StrWide)->GetValueAsString().c_str(),
"tESt") << t_str->toType(ObjType::StrWide)->GetValueAsString();
783 ObjPtr wstr = Obj::CreateString(L
"ТЕСТ");
785 if (
sizeof (
wchar_t) == 2) {
786 ASSERT_EQ(t_wstr->m_var_type_current, ObjType::Int16);
788 ASSERT_TRUE(
sizeof (
wchar_t) == 4);
789 ASSERT_EQ(t_wstr->m_var_type_current, ObjType::Int32);
791 ASSERT_EQ(4, t_wstr->size());
793 ASSERT_EQ(t_wstr->index_get({0})->GetValueAsInteger(), L
'Т');
794 ASSERT_EQ(t_wstr->index_get({1})->GetValueAsInteger(), L
'Е');
795 ASSERT_EQ(t_wstr->index_get({2})->GetValueAsInteger(), L
'С');
796 ASSERT_EQ(t_wstr->index_get({3})->GetValueAsInteger(), L
'Т');
798 std::wstring test_wide = t_wstr->toType(ObjType::StrWide)->GetValueAsStringWide();
799 EXPECT_STREQ(
utf8_encode(test_wide).c_str(),
"ТЕСТ");
801 std::string test_str = t_wstr->toType(ObjType::StrWide)->GetValueAsString();
802 EXPECT_STREQ(test_str.c_str(),
"ТЕСТ") << test_str;
804 t_wstr->index_set_({1}, Obj::CreateString(L
"е"));
805 t_wstr->index_set_({2}, Obj::CreateString(L
"с"));
807 test_str = t_wstr->toType(ObjType::StrWide)->GetValueAsString();
808 EXPECT_STREQ(test_str.c_str(),
"ТесТ") << test_str;
814 ObjPtr var_zero = Obj::CreateValue(0, ObjType::None);
815 ASSERT_TRUE(var_zero->is_bool_type());
816 ASSERT_TRUE(var_zero->is_arithmetic_type());
817 ASSERT_EQ(ObjType::Bool, var_zero->m_var_type_current);
819 ObjPtr var_bool = Obj::CreateBool(
true);
820 ASSERT_TRUE(var_bool->is_bool_type());
821 ASSERT_TRUE(var_bool->is_arithmetic_type());
822 ASSERT_EQ(ObjType::Bool, var_bool->m_var_type_current);
824 ObjPtr var_char = Obj::CreateValue(100);
825 ASSERT_TRUE(var_char->is_arithmetic_type());
826 ASSERT_EQ(ObjType::Int8, var_char->m_var_type_current);
828 ObjPtr var_int = Obj::CreateValue(100000);
829 ASSERT_TRUE(var_int->is_arithmetic_type());
830 ASSERT_EQ(ObjType::Int32, var_int->m_var_type_current) <<
newlang::toString(var_char->m_var_type_current);
832 ObjPtr var_float = Obj::CreateValue(1.0);
833 ASSERT_TRUE(var_float->is_arithmetic_type());
834 ASSERT_EQ(ObjType::Float32, var_float->m_var_type_current) <<
newlang::toString(var_char->m_var_type_current);
836 ObjPtr var_tensor = Obj::CreateRange(0, 10)->toType(ObjType::Int32);
837 ASSERT_TRUE(var_tensor->is_arithmetic_type());
838 ASSERT_EQ(ObjType::Int32, var_tensor->m_var_type_current) <<
newlang::toString(var_char->m_var_type_current);
840 var_tensor->operator*=(var_bool);
841 ASSERT_TRUE(var_tensor->is_arithmetic_type());
842 EXPECT_EQ(ObjType::Int32, var_tensor->m_var_type_current) <<
newlang::toString(var_char->m_var_type_current);
844 var_tensor->operator*=(var_int);
845 ASSERT_TRUE(var_tensor->is_arithmetic_type());
846 EXPECT_EQ(ObjType::Int32, var_tensor->m_var_type_current) <<
newlang::toString(var_char->m_var_type_current);
848 var_tensor->operator*=(var_float);
849 ASSERT_TRUE(var_tensor->is_arithmetic_type());
850 EXPECT_EQ(ObjType::Float32, var_tensor->m_var_type_current) <<
newlang::toString(var_char->m_var_type_current);
855 ObjPtr dict = Obj::CreateDict();
857 dict->push_back(Obj::Arg(1,
"1"));
858 dict->push_back(Obj::Arg(2,
"22"));
859 dict->push_back(Obj::Arg(3,
"333"));
860 dict->push_back(Obj::Arg(4));
861 dict->push_back(Obj::Arg(5,
"555"));
863 ASSERT_EQ(5, dict->size());
865 auto all = std::regex(
"(.|\\n)*");
866 ASSERT_TRUE(std::regex_match(
"1", all));
867 ASSERT_TRUE(std::regex_match(
"22", all));
868 ASSERT_TRUE(std::regex_match(
"333", all));
869 ASSERT_TRUE(std::regex_match(
"", all));
870 ASSERT_TRUE(std::regex_match(
"\n", all));
871 ASSERT_TRUE(std::regex_match(
"\n\n\\n", all));
874 Iterator <Obj> iter(dict);
876 ASSERT_TRUE(iter == iter.begin());
877 ASSERT_TRUE(iter != iter.end());
879 ObjPtr copy = Obj::CreateDict();
880 for (
auto &elem : iter) {
882 copy->push_back(elem.second, elem.first);
885 ASSERT_TRUE(iter == iter.begin());
886 ASSERT_TRUE(iter != iter.end());
888 ASSERT_EQ(dict->size(), copy->size());
891 ASSERT_TRUE(iter == iter.begin());
893 ObjPtr one = iter.read_and_next(0);
895 ASSERT_EQ(1, one->GetValueAsInteger());
897 ASSERT_EQ(2, (*iter).second->GetValueAsInteger());
898 one = iter.read_and_next(0);
900 ASSERT_EQ(2, one->GetValueAsInteger());
902 ASSERT_EQ(3, (*iter).second->GetValueAsInteger());
903 one = iter.read_and_next(0);
905 ASSERT_EQ(3, one->GetValueAsInteger());
907 ASSERT_EQ(4, (*iter).second->GetValueAsInteger());
908 one = iter.read_and_next(0);
910 ASSERT_EQ(4, one->GetValueAsInteger());
912 ASSERT_EQ(5, (*iter).second->GetValueAsInteger());
913 one = iter.read_and_next(0);
915 ASSERT_EQ(5, one->GetValueAsInteger());
917 one = iter.read_and_next(0);
919 ASSERT_EQ(ObjType::IteratorEnd, one->getType()) << one <<
" " <<
toString(one->getType());
921 one = iter.read_and_next(0);
923 ASSERT_EQ(ObjType::IteratorEnd, one->getType()) << one <<
" " <<
toString(one->getType());
928 ASSERT_TRUE(iter == iter.end());
930 ASSERT_TRUE(iter == iter.begin());
931 ASSERT_TRUE(iter != iter.end());
933 ObjPtr dict1 = iter.read_and_next(-3);
935 ASSERT_EQ(3, dict1->size());
936 ASSERT_EQ(1, dict1->at(0).second->GetValueAsInteger());
937 ASSERT_EQ(2, dict1->at(1).second->GetValueAsInteger());
938 ASSERT_EQ(3, dict1->at(2).second->GetValueAsInteger());
940 ObjPtr dict2 = iter.read_and_next(-3);
942 ASSERT_EQ(3, dict2->size());
943 ASSERT_EQ(4, dict2->at(0).second->GetValueAsInteger());
944 ASSERT_EQ(5, dict2->at(1).second->GetValueAsInteger());
945 ASSERT_EQ(ObjType::IteratorEnd, dict2->at(2).second->getType());
947 ObjPtr dict3 = iter.read_and_next(-3);
949 ASSERT_EQ(3, dict1->size());
950 ASSERT_EQ(ObjType::IteratorEnd, dict3->at(0).second->getType());
951 ASSERT_EQ(ObjType::IteratorEnd, dict3->at(1).second->getType());
952 ASSERT_EQ(ObjType::IteratorEnd, dict3->at(2).second->getType());
956 ASSERT_TRUE(iter == iter.end());
958 ASSERT_TRUE(iter == iter.begin());
959 ASSERT_TRUE(iter != iter.end());
961 dict1 = iter.read_and_next(3);
963 ASSERT_EQ(3, dict1->size());
964 ASSERT_EQ(1, dict1->at(0).second->GetValueAsInteger());
965 ASSERT_EQ(2, dict1->at(1).second->GetValueAsInteger());
966 ASSERT_EQ(3, dict1->at(2).second->GetValueAsInteger());
968 dict2 = iter.read_and_next(3);
970 ASSERT_EQ(2, dict2->size());
971 ASSERT_EQ(4, dict2->at(0).second->GetValueAsInteger());
972 ASSERT_EQ(5, dict2->at(1).second->GetValueAsInteger());
974 dict3 = iter.read_and_next(3);
976 ASSERT_EQ(0, dict3->size());
981 Iterator <Obj> flt(dict,
"");
982 ObjPtr flt_res = flt.read_and_next(100);
983 ASSERT_TRUE(flt_res);
984 ASSERT_EQ(1, flt_res->size());
985 ASSERT_EQ(4, flt_res->at(0).second->GetValueAsInteger());
988 Iterator <Obj> flt1(dict,
".");
989 ObjPtr flt1_res = flt1.read_and_next(100);
990 ASSERT_TRUE(flt1_res);
991 ASSERT_EQ(1, flt1_res->size());
992 ASSERT_EQ(1, flt1_res->at(0).second->GetValueAsInteger());
995 Iterator <Obj> flt2(dict,
"..");
996 ObjPtr flt2_res = flt2.read_and_next(100);
997 ASSERT_TRUE(flt2_res);
998 ASSERT_EQ(1, flt2_res->size());
999 ASSERT_EQ(2, flt2_res->at(0).second->GetValueAsInteger());
1001 Iterator <Obj> flt3(dict,
"...");
1002 ObjPtr flt3_res = flt3.read_and_next(100);
1003 ASSERT_TRUE(flt3_res);
1004 ASSERT_EQ(2, flt3_res->size());
1005 ASSERT_EQ(3, flt3_res->at(0).second->GetValueAsInteger());
1006 ASSERT_EQ(5, flt3_res->at(1).second->GetValueAsInteger());
1642 EXPECT_EQ(8,
sizeof (std::exception));
1643 EXPECT_EQ(16,
sizeof (std::runtime_error));
1644 EXPECT_EQ(8,
sizeof (std::chrono::milliseconds));
1645 EXPECT_EQ(16,
sizeof (std::string_view));
1646 EXPECT_EQ(8,
sizeof (std::source_location));
1647 EXPECT_EQ(16,
sizeof (std::stacktrace));
1649 EXPECT_EQ(16,
sizeof (std::runtime_error));
1651 EXPECT_EQ(16,
sizeof (std::shared_ptr<Variable>));
1652 EXPECT_EQ(24,
sizeof (std::variant<
Variable *, std::shared_ptr < Variable>>));
1653 EXPECT_EQ(8,
sizeof (std::shared_ptr<Sync> *));
1665 EXPECT_EQ(48,
sizeof (var_int));
1667 EXPECT_EQ(48,
sizeof (VariableVariant));
1669 EXPECT_EQ(112,
sizeof (
Sync));
1670 EXPECT_EQ(8,
sizeof (std::unique_ptr<Sync>));
1671 EXPECT_EQ(16,
sizeof (std::shared_ptr<Sync>));
1672 EXPECT_EQ(8,
sizeof (std::unique_ptr<VariableTaken>));
1673 EXPECT_EQ(16,
sizeof (std::shared_ptr<VariableTaken>));
1676 EXPECT_EQ(48,
sizeof (VariableVariant));
1678 EXPECT_EQ(2,
sizeof (std::variant<std::monostate>));
1679 EXPECT_EQ(2,
sizeof (std::variant<bool>));
1680 EXPECT_EQ(2,
sizeof (std::variant<int8_t>));
1681 EXPECT_EQ(4,
sizeof (std::variant<int16_t>));
1682 EXPECT_EQ(8,
sizeof (std::variant<int32_t>));
1683 EXPECT_EQ(16,
sizeof (std::variant<int64_t>));
1684 EXPECT_EQ(40,
sizeof (std::variant<std::string>));
1685 EXPECT_EQ(40,
sizeof (std::variant<std::string, std::wstring>));
1686 EXPECT_EQ(32,
sizeof (std::string));
1687 EXPECT_EQ(32,
sizeof (std::wstring));
1689 EXPECT_EQ(8,
sizeof (std::unique_ptr<VariableTaken>));
1690 EXPECT_EQ(16,
sizeof (std::weak_ptr<Variable>));
1691 EXPECT_EQ(16,
sizeof (std::shared_ptr<Variable>));
1698 EXPECT_EQ(16,
sizeof (
ObjPtr));
1699 EXPECT_EQ(632,
sizeof (
Obj));
1701 EXPECT_EQ(16,
sizeof (
TermPtr));
1702 EXPECT_EQ(440,
sizeof (
Term));
1704 EXPECT_EQ(1,
sizeof (
ObjType));
1705 EXPECT_EQ(1,
sizeof (
bool));
1706 EXPECT_EQ(40,
sizeof (std::vector<bool>));
1707 EXPECT_EQ(24,
sizeof (std::vector<char>));
1708 EXPECT_EQ(24,
sizeof (std::vector<int>));
1709 EXPECT_EQ(24,
sizeof (std::vector<ObjType>));
1710 EXPECT_EQ(24,
sizeof (std::vector<uint8_t>));
1711 EXPECT_EQ(24,
sizeof (std::vector<int64_t>));
1713 EXPECT_EQ(120,
sizeof (Iterator < Obj>));
1717 class ZeroClass2 :
public std::enable_shared_from_this<ZeroClass> {
1719 class ZeroClass3 :
public Dict<ZeroClass3> {
1724 EXPECT_EQ(1,
sizeof (ZeroClass));
1725 EXPECT_EQ(16,
sizeof (ZeroClass2));
1726 EXPECT_EQ(32,
sizeof (ZeroClass3));
1727 EXPECT_EQ(120,
sizeof (Iterator < ZeroClass>));
1728 EXPECT_EQ(120,
sizeof (Iterator < ZeroClass4>));
1731 ASSERT_TRUE(std::holds_alternative<int64_t>(var_int));
1732 ASSERT_NO_THROW(ASSERT_EQ(std::get<int64_t>(var_int), 123););
1735 ASSERT_NO_THROW(EXPECT_TRUE(var_int.is_taked()));
1736 ASSERT_NO_THROW(ASSERT_TRUE(var_int.GetValueAsBoolean()));
1737 ASSERT_NO_THROW(ASSERT_EQ(123, var_int.GetValueAsInteger()));
1738 ASSERT_NO_THROW(ASSERT_DOUBLE_EQ(123, var_int.GetValueAsNumber()));
1741 ASSERT_TRUE(std::holds_alternative<VariableShared> (var_int_shared)) <<
VariableCaseToString(var_int_shared.index());
1744 ASSERT_NO_THROW(EXPECT_TRUE(var_int_shared.is_taked()));
1745 ASSERT_NO_THROW(ASSERT_TRUE(var_int_shared.GetValueAsBoolean()));
1746 ASSERT_NO_THROW(ASSERT_EQ(456, var_int_shared.GetValueAsInteger()));
1747 ASSERT_NO_THROW(ASSERT_DOUBLE_EQ(456, var_int_shared.GetValueAsNumber()));
1749 VariableShared temp1 = std::get<VariableShared> (var_int_shared);
1750 ASSERT_EQ(2, temp1.
data.use_count());
1751 ASSERT_TRUE(std::holds_alternative<int64_t>(*temp1.
data));
1752 ASSERT_NO_THROW(ASSERT_EQ(std::get<int64_t>(*temp1.
data), 456););
1753 ASSERT_FALSE(temp1.
sync);
1755 VariableShared temp2 = std::get<VariableShared> (var_int_shared);
1756 ASSERT_EQ(3, temp1.
data.use_count());
1757 ASSERT_EQ(3, temp2.
data.use_count());
1758 ASSERT_TRUE(std::holds_alternative<int64_t>(*temp2.
data));
1759 ASSERT_NO_THROW(ASSERT_EQ(std::get<int64_t>(*temp2.
data), 456););
1760 ASSERT_FALSE(temp2.
sync);
1816 ASSERT_NO_THROW(ASSERT_EQ(var_int.GetValueAsInteger(), 246););
1819 ASSERT_NO_THROW(ASSERT_EQ(var_int.GetValueAsInteger(), 251););
1822 ASSERT_NO_THROW(ASSERT_EQ(var_int.GetValueAsInteger(), 241););
1825 ASSERT_NO_THROW(ASSERT_EQ(var_int.GetValueAsInteger(), 24100););
1828 ASSERT_NO_THROW(ASSERT_EQ(var_int.GetValueAsInteger(), 2410););
1831 ASSERT_NO_THROW(ASSERT_EQ(var_int.GetValueAsInteger(), 410););
1835 ASSERT_TRUE(std::holds_alternative<std::string>(var_str));
1838 ASSERT_NO_THROW(ASSERT_STREQ(
"+", var_str.GetValueAsString().c_str()));
1840 ASSERT_EQ(2, VariableOp::iadd.size());
1841 VariableOp::OperatorType::VirtualFuncType * store = VariableOp::iadd.override(&VariableOp::__iadd_only_numbers__);
1842 ASSERT_EQ(3, VariableOp::iadd.size());
1848 VariableOp::iadd.pop_back();
1849 ASSERT_EQ(2, VariableOp::iadd.size());
1852 ASSERT_NO_THROW(ASSERT_STREQ(
"+++", var_str.GetValueAsString().c_str()););
std::pair< std::string, Type > PairType
ObjPtr Run(const std::string_view str, Obj *args=nullptr)
virtual bool empty() const
std::enable_if< std::is_same< T, bool >::value, void >::type SetValue_(bool value)
ObjPtr GetValueAsObject() const
std::wstring utf8_decode(const std::string str)
std::shared_ptr< Term > TermPtr
std::shared_ptr< Obj > ObjPtr
std::shared_ptr< RunTime > RuntimePtr
const char * VariableCaseToString(size_t index)
ObjType typeFromLimit(int64_t value, ObjType type_default=ObjType::Int64)
const char * toString(TermID type)
std::string utf8_encode(const std::wstring wstr)
void ConvertStringToTensor(const std::string &from, torch::Tensor &to, ObjType type=ObjType::None)
ObjPtr CreateTensor(torch::Tensor tensor)
std::shared_ptr< Variable > data
std::shared_ptr< Sync > sync
Объект синхронизации доступа к защищённой переменной