4#include <gtest/gtest.h>
23 ASSERT_NO_THROW(
result = jit->Run(
"[1]-->100"));
25 ASSERT_EQ(100,
result->GetValueAsInteger());
27 ASSERT_NO_THROW(
result = jit->Run(
"[-1]-->99"));
29 ASSERT_EQ(99,
result->GetValueAsInteger());
31 ASSERT_NO_THROW(
result = jit->Run(
"[0]-->111"));
33 ASSERT_TRUE(
result->is_none_type());
35 ASSERT_NO_THROW(
result = jit->Run(
"[1]-->111"));
37 ASSERT_EQ(111,
result->GetValueAsInteger());
41 ASSERT_NO_THROW(
result = jit->Run(
"[0]-->100,[1]-->300"));
43 ASSERT_EQ(300,
result->GetValueAsInteger());
45 ASSERT_NO_THROW(
result = jit->Run(
"[0]-->100,[0]-->300,[99]-->99,[...]-->1000"));
47 ASSERT_EQ(99,
result->GetValueAsInteger());
49 ASSERT_NO_THROW(
result = jit->Run(
"[0]-->111,[...]-->1000"));
51 ASSERT_EQ(1000,
result->GetValueAsInteger());
53 ASSERT_NO_THROW(
result = jit->Run(
"[0]-->{100},[1]-->{10;20;30}"));
55 ASSERT_EQ(30,
result->GetValueAsInteger());
57 ASSERT_NO_THROW(
result = jit->Run(
"[0]-->{100},[0]-->{300},[99]-->{99},[...]-->{1000}"));
59 ASSERT_EQ(99,
result->GetValueAsInteger());
61 ASSERT_NO_THROW(
result = jit->Run(
"[0]-->111,[...]-->{30;50;1000}"));
63 ASSERT_EQ(1000,
result->GetValueAsInteger());
66 ASSERT_NO_THROW(
result = jit->Run(
"cond := 100; [cond]-->111,[...]-->1000"));
68 ASSERT_EQ(111,
result->GetValueAsInteger());
70 ASSERT_NO_THROW(
result = jit->Run(
"cond2 := 0; [cond2]-->111,[...]-->1000"));
72 ASSERT_EQ(1000,
result->GetValueAsInteger());
74 ASSERT_NO_THROW(
result = jit->Run(
"val := 1\\1; [val == 1]-->111,[...]-->1000"));
76 ASSERT_EQ(111,
result->GetValueAsInteger());
78 ASSERT_NO_THROW(
result = jit->Run(
"val := 1\\1; [val < 0]-->111,[...]-->1000"));
80 ASSERT_EQ(1000,
result->GetValueAsInteger());
82 ASSERT_NO_THROW(
result = jit->Run(
"val := 1\\1; [val > 0]-->{111},[...]-->1000"));
84 ASSERT_EQ(111,
result->GetValueAsInteger());
94 ASSERT_NO_THROW(
result = jit->Run(
"result := 0"));
96 ASSERT_EQ(0,
result->GetValueAsInteger());
99 ASSERT_NO_THROW(cond = jit->Run(
"result < 4"));
101 ASSERT_TRUE(cond->GetValueAsBoolean());
103 ASSERT_NO_THROW(
result = jit->Run(
"result += 1"));
105 ASSERT_EQ(1,
result->GetValueAsInteger());
107 ASSERT_NO_THROW(cond = jit->Run(
"result < 4"));
109 ASSERT_TRUE(cond->GetValueAsBoolean());
111 ASSERT_NO_THROW(
result = jit->Run(
"result += 3"));
113 ASSERT_EQ(4,
result->GetValueAsInteger());
115 ASSERT_NO_THROW(cond = jit->Run(
"result < 4"));
117 ASSERT_FALSE(cond->GetValueAsBoolean());
121 ASSERT_NO_THROW(counter = jit->Run(
"counter := 0"));
122 ASSERT_EQ(0, counter->GetValueAsInteger());
124 ASSERT_EQ(4,
result->GetValueAsInteger());
125 ASSERT_NO_THROW(
result = jit->Run(
"result -= 1"));
126 ASSERT_EQ(3,
result->GetValueAsInteger());
128 ASSERT_NO_THROW(counter = jit->Run(
"[result -= 1] <-> {counter += 1}"));
129 ASSERT_TRUE(counter);
130 ASSERT_EQ(0, counter->GetValueAsInteger());
132 ASSERT_NO_THROW(counter = jit->Run(
"counter"));
133 ASSERT_EQ(2, counter->GetValueAsInteger());
137 ASSERT_NO_THROW(counter = jit->Run(
"{result += 1; counter += 1} <-> [result < 10]"));
138 ASSERT_EQ(10,
result->GetValueAsInteger());
140 ASSERT_TRUE(counter);
141 ASSERT_EQ(0, counter->GetValueAsInteger());
143 ASSERT_NO_THROW(counter = jit->Run(
"counter"));
144 ASSERT_EQ(12, counter->GetValueAsInteger());
146 ASSERT_NO_THROW(counter = jit->Run(
"result"));
147 ASSERT_EQ(10, counter->GetValueAsInteger());
156 ObjPtr test = Obj::CreateDict();
158 test->push_back(Obj::Arg(10));
159 test->push_back(Obj::Arg(11));
160 test->push_back(Obj::Arg(12));
161 test->push_back(Obj::Arg(13));
162 ASSERT_EQ(4, test->size());
163 ASSERT_EQ(10, (*test)[0].second->GetValueAsInteger());
164 ASSERT_EQ(13, (*test)[3].second->GetValueAsInteger());
166 ASSERT_EQ(test->resize_(4,
nullptr), test->size());
167 ASSERT_EQ(4, test->size());
168 ASSERT_EQ(10, (*test)[0].second->GetValueAsInteger());
169 ASSERT_EQ(13, (*test)[3].second->GetValueAsInteger());
171 test->resize_(-3,
nullptr);
172 ASSERT_EQ(3, test->size());
173 ASSERT_EQ(11, (*test)[0].second->GetValueAsInteger());
174 ASSERT_EQ(13, (*test)[2].second->GetValueAsInteger());
176 test->resize_(-1,
nullptr);
177 ASSERT_EQ(1, test->size());
178 ASSERT_EQ(13, (*test)[0].second->GetValueAsInteger());
180 test->resize_(0,
nullptr);
181 ASSERT_EQ(0, test->size());
184 ASSERT_NO_THROW(counter = jit->Run(
"counter := 100"));
185 ASSERT_EQ(100, counter->GetValueAsInteger());
188 ASSERT_NO_THROW(dict = jit->Run(
"dict := (0,1,2,)"));
190 ASSERT_TRUE(dict->is_dictionary_type());
191 ASSERT_EQ(3, dict->size());
192 ASSERT_EQ(0, (*dict)[0].second->GetValueAsInteger());
193 ASSERT_EQ(1, (*dict)[1].second->GetValueAsInteger());
194 ASSERT_EQ(2, (*dict)[2].second->GetValueAsInteger());
197 ASSERT_NO_THROW(counter = jit->Run(
"counter"));
198 ASSERT_EQ(100, counter->GetValueAsInteger());
201 ASSERT_NO_THROW(temp = jit->Run(
"counter, dict := ... dict"));
203 ASSERT_TRUE(temp->is_dictionary_type()) << temp->toString();
204 ASSERT_EQ(2, temp->size());
206 ASSERT_NO_THROW(counter = jit->Run(
"counter"));
207 ASSERT_EQ(0, counter->GetValueAsInteger());
209 ASSERT_TRUE(dict->is_dictionary_type());
210 ASSERT_EQ(2, dict->size());
211 ASSERT_EQ(1, (*dict)[0].second->GetValueAsInteger());
212 ASSERT_EQ(2, (*dict)[1].second->GetValueAsInteger());
214 ASSERT_NO_THROW(temp = jit->Run(
"counter, dict := ... dict"));
216 ASSERT_TRUE(temp->is_dictionary_type());
217 ASSERT_EQ(1, temp->size());
219 ASSERT_NO_THROW(counter = jit->Run(
"counter"));
220 ASSERT_TRUE(counter);
221 ASSERT_EQ(1, counter->GetValueAsInteger());
223 ASSERT_TRUE(dict->is_dictionary_type());
224 ASSERT_EQ(1, dict->size());
225 ASSERT_EQ(2, (*dict)[0].second->GetValueAsInteger());
227 ASSERT_NO_THROW(temp = jit->Run(
"counter += 1"));
229 ASSERT_EQ(2, temp->GetValueAsInteger());
231 ASSERT_NO_THROW(temp = jit->Run(
"counter += counter"));
233 ASSERT_EQ(4, temp->GetValueAsInteger());
236 ASSERT_NO_THROW(temp = jit->Run(
"counter, dict := ... dict"));
238 ASSERT_TRUE(temp->is_dictionary_type()) << temp->toString();
239 ASSERT_EQ(0, temp->size());
241 ASSERT_NO_THROW(counter = jit->Run(
"counter"));
242 ASSERT_TRUE(counter);
243 ASSERT_EQ(2, counter->GetValueAsInteger());
245 ASSERT_TRUE(dict->is_dictionary_type());
246 ASSERT_EQ(0, dict->size());
248 ASSERT_NO_THROW(temp = jit->Run(
"counter, dict := ... dict"));
250 ASSERT_TRUE(temp->is_dictionary_type());
251 ASSERT_TRUE(dict->is_dictionary_type());
252 ASSERT_EQ(0, dict->size());
254 ASSERT_NO_THROW(counter = jit->Run(
"counter"));
255 ASSERT_TRUE(counter);
256 ASSERT_TRUE(counter->is_none_type());
259 dict->push_back(Obj::Arg(10));
260 dict->push_back(Obj::Arg(20));
261 dict->push_back(Obj::Arg(30));
262 dict->push_back(Obj::Arg(40));
263 dict->push_back(Obj::Arg(50));
264 ASSERT_EQ(5, dict->size());
266 ASSERT_NO_THROW(temp = jit->Run(
"dict"));
268 ASSERT_TRUE(temp->is_dictionary_type());
269 ASSERT_FALSE(temp->is_scalar());
270 ASSERT_TRUE(temp->GetValueAsBoolean());
271 ASSERT_EQ(5, temp->size());
273 ASSERT_NO_THROW(temp = jit->Run(
":Bool[...](dict)"));
275 ASSERT_TRUE(temp->is_bool_type());
276 ASSERT_FALSE(temp->is_scalar());
277 ASSERT_TRUE(temp->GetValueAsBoolean());
278 ASSERT_EQ(5, temp->size());
280 ASSERT_NO_THROW(temp = jit->Run(
":Bool[_](dict)"));
282 ASSERT_TRUE(temp->is_bool_type());
283 ASSERT_FALSE(temp->is_scalar());
284 ASSERT_TRUE(temp->GetValueAsBoolean());
285 ASSERT_EQ(5, temp->size());
287 ASSERT_NO_THROW(temp = jit->Run(
":Bool[0](dict)"));
289 ASSERT_TRUE(temp->is_bool_type());
290 ASSERT_TRUE(temp->is_scalar());
291 ASSERT_TRUE(temp->GetValueAsBoolean());
292 ASSERT_EQ(0, temp->size());
294 ASSERT_NO_THROW(temp = jit->Run(
":Bool(dict)"));
296 ASSERT_TRUE(temp->is_bool_type());
297 ASSERT_TRUE(temp->is_scalar());
298 ASSERT_TRUE(temp->GetValueAsBoolean());
299 ASSERT_EQ(0, temp->size());
301 ASSERT_NO_THROW(temp = jit->Run(
"@not(dict)"));
303 ASSERT_TRUE(temp->is_bool_type());
304 ASSERT_FALSE(temp->GetValueAsBoolean());
306 ASSERT_NO_THROW(temp = jit->Run(
"dict"));
308 ASSERT_STREQ(
"(10, 20, 30, 40, 50,)", temp->toString().c_str());
311 ASSERT_NO_THROW(summa = jit->Run(
"summa := 0"));
312 ASSERT_STREQ(
"0", summa->toString().c_str());
313 ASSERT_NO_THROW(summa = jit->Run(
"summa += 100"));
314 ASSERT_STREQ(
"100", summa->toString().c_str());
316 ASSERT_NO_THROW(temp = jit->Run(
":Bool[...]( (1,) )"));
317 ASSERT_STREQ(
"[1,]:Bool", temp->toString().c_str());
318 ASSERT_NO_THROW(temp = jit->Run(
":Bool( (1,) )"));
319 ASSERT_STREQ(
"1", temp->toString().c_str());
321 ASSERT_NO_THROW(temp = jit->Run(
":Bool[...]( (1,) )"));
322 ASSERT_STREQ(
"[1,]:Bool", temp->toString().c_str());
323 ASSERT_NO_THROW(temp = jit->Run(
":Bool( (1,) )"));
324 ASSERT_STREQ(
"1", temp->toString().c_str());
326 ASSERT_NO_THROW(temp = jit->Run(
":Bool[...]( (0,) )"));
327 ASSERT_STREQ(
"[0,]:Bool", temp->toString().c_str());
328 ASSERT_NO_THROW(temp = jit->Run(
":Bool( (0,) )"));
329 ASSERT_STREQ(
"1", temp->toString().c_str());
331 ASSERT_ANY_THROW(temp = jit->Run(
":Bool[...]( (,) )"));
332 ASSERT_ANY_THROW(temp = jit->Run(
":Bool[_]( (,) )"));
333 ASSERT_NO_THROW(temp = jit->Run(
":Bool( (,) )"));
334 ASSERT_STREQ(
"0", temp->toString().c_str());
337 ASSERT_NO_THROW(temp = jit->Run(
"counter = 0; [dict] <-> {counter, dict := ... dict; summa += counter}"));
339 ASSERT_NO_THROW(summa = jit->Run(
"summa"));
340 ASSERT_STREQ(
"250", summa->toString().c_str());
342 ASSERT_NO_THROW(temp = jit->Run(
"counter"));
344 ASSERT_TRUE(temp->is_integer());
345 ASSERT_STREQ(
"50", temp->toString().c_str());
347 ASSERT_TRUE(dict->is_dictionary_type());
348 ASSERT_EQ(0, dict->size());
351 ASSERT_NO_THROW(dict = jit->Run(
"dict := (0,1,2,3,4,)"));
353 ASSERT_NO_THROW(item = jit->Run(
"item := 0"));
354 ASSERT_EQ(0, item->GetValueAsInteger());
355 ASSERT_NO_THROW(item = jit->Run(
"item, dict := ... dict; item"));
356 ASSERT_EQ(0, item->GetValueAsInteger());
357 ASSERT_NO_THROW(item = jit->Run(
"item, dict := ... dict; item"));
358 ASSERT_EQ(1, item->GetValueAsInteger());
359 ASSERT_NO_THROW(item = jit->Run(
"item, dict := ... dict; item"));
360 ASSERT_EQ(2, item->GetValueAsInteger());
363 ASSERT_NO_THROW(summa = jit->Run(
"sum := 0"));
365 ASSERT_STREQ(
"0", summa->toString().c_str());
366 ASSERT_NO_THROW(summa = jit->Run(
"sum += 1"));
368 ASSERT_STREQ(
"1", summa->toString().c_str());
369 ASSERT_NO_THROW(summa = jit->Run(
"sum += 2"));
371 ASSERT_STREQ(
"3", summa->toString().c_str());
374 ASSERT_NO_THROW(dict = jit->Run(
"dict := (0,1,2,3,4,)"));
378 ASSERT_NO_THROW(temp = jit->Run(
"val::=1; item := 0; [dict] <-> {item, dict := ... dict; print('Sum: %s, Item: %s\\n', :StrChar(sum), :StrChar(item)); sum += item}"));
380 ASSERT_STREQ(
"(,)", temp->GetValueAsString().c_str());
382 ASSERT_NO_THROW(summa = jit->Run(
"item"));
383 ASSERT_EQ(4, summa->GetValueAsInteger());
385 ASSERT_NO_THROW(summa = jit->Run(
"sum"));
386 ASSERT_EQ(13, summa->GetValueAsInteger());
392 ASSERT_NO_THROW(counter = jit->Run(
"counter := 55"));
393 ASSERT_EQ(55, counter->GetValueAsInteger());
396 ASSERT_NO_THROW(tensor = jit->Run(
"tensor := [10,11,12,]"));
398 ASSERT_TRUE(tensor->is_tensor_type());
399 ASSERT_TRUE(tensor->GetValueAsBoolean());
400 ASSERT_EQ(3, tensor->size());
401 ASSERT_EQ(10, (*tensor)[0].second->GetValueAsInteger());
402 ASSERT_EQ(11, (*tensor)[1].second->GetValueAsInteger());
403 ASSERT_EQ(12, (*tensor)[2].second->GetValueAsInteger());
405 ASSERT_NO_THROW(temp = jit->Run(
"counter, tensor := ... tensor "));
407 ASSERT_TRUE(temp->is_tensor_type());
408 ASSERT_EQ(2, temp->size());
410 ASSERT_NO_THROW(counter = jit->Run(
"counter"));
411 ASSERT_EQ(10, counter->GetValueAsInteger());
413 ASSERT_TRUE(tensor->is_tensor_type());
414 ASSERT_TRUE(tensor->GetValueAsBoolean());
415 ASSERT_EQ(2, tensor ->size());
416 ASSERT_EQ(11, (*tensor)[0].second->GetValueAsInteger());
417 ASSERT_EQ(12, (*tensor)[1].second->GetValueAsInteger());
419 ASSERT_NO_THROW(temp = jit->Run(
"counter, tensor := ... tensor "));
421 ASSERT_TRUE(temp->is_tensor_type());
422 ASSERT_EQ(1, temp->size());
424 ASSERT_NO_THROW(counter = jit->Run(
"counter"));
425 ASSERT_EQ(11, counter->GetValueAsInteger());
427 ASSERT_TRUE(tensor->is_tensor_type());
428 ASSERT_TRUE(tensor->GetValueAsBoolean());
429 ASSERT_EQ(1, tensor ->size());
430 ASSERT_EQ(12, (*tensor)[0].second->GetValueAsInteger());
432 ASSERT_NO_THROW(temp = jit->Run(
"counter, tensor := ... tensor "));
434 ASSERT_TRUE(temp->is_none_type());
436 ASSERT_NO_THROW(counter = jit->Run(
"counter"));
437 ASSERT_EQ(12, counter->GetValueAsInteger());
439 ASSERT_TRUE(tensor->is_none_type());
440 ASSERT_FALSE(tensor->GetValueAsBoolean());
442 ASSERT_ANY_THROW(temp = jit->Run(
"counter, tensor := ... tensor"));
450 ASSERT_NO_THROW(counter = jit->Run(
"counter"));
451 ASSERT_TRUE(counter);
452 ASSERT_TRUE(counter->empty());
459 ASSERT_NO_THROW(jit->Run(
"item2 := 0"));
460 ASSERT_NO_THROW(summa2 = jit->Run(
"summa := 0"));
461 ASSERT_NO_THROW(tensor2 = jit->Run(
"tensor := [10,20,30,40,50,60,]"));
462 ASSERT_NO_THROW(temp2 = jit->Run(
"[tensor] <-> {item2, tensor := ... tensor; summa += item2}"));
464 ASSERT_TRUE(temp2->is_none_type());
466 ASSERT_NO_THROW(summa2 = jit->Run(
"summa"));
467 ASSERT_EQ(210, summa2->GetValueAsInteger());
469 ASSERT_NO_THROW(temp2 = jit->Run(
"item2"));
470 ASSERT_EQ(60, temp2->GetValueAsInteger());
472 ASSERT_NO_THROW(tensor2 = jit->Run(
"tensor"));
473 ASSERT_TRUE(tensor2->is_none_type());
474 ASSERT_FALSE(tensor2->GetValueAsBoolean());
477 ASSERT_NO_THROW(tensor_size = jit->Run(
"tensor_size := [10,20,30,40,]"));
478 ASSERT_EQ(4, tensor_size->size());
479 ASSERT_EQ(10, (*tensor_size)[0].second->GetValueAsInteger());
480 ASSERT_EQ(40, (*tensor_size)[3].second->GetValueAsInteger());
482 tensor_size->resize_(-10,
nullptr);
483 ASSERT_EQ(10, tensor_size->size());
484 ASSERT_EQ(0, (*tensor_size)[0].second->GetValueAsInteger());
485 ASSERT_EQ(0, (*tensor_size)[5].second->GetValueAsInteger());
486 ASSERT_EQ(10, (*tensor_size)[6].second->GetValueAsInteger());
487 ASSERT_EQ(40, (*tensor_size)[9].second->GetValueAsInteger());
491TEST(Alg, DISABLED_BreakContinue) {
495 const char * run_raw =
""
507 ASSERT_NO_THROW(
result = jit->Run(run_raw));
508 ASSERT_NO_THROW(count = jit->Run(
"count"));
510 ASSERT_TRUE(
result->is_integer());
511 ASSERT_EQ(6, count->GetValueAsInteger());
512 ASSERT_EQ(100,
result->GetValueAsInteger());
514 const char * run_macro =
""
524 ASSERT_NO_THROW(
result = jit->Run(run_macro));
525 ASSERT_NO_THROW(count = jit->Run(
"count"));
527 ASSERT_TRUE(
result->is_integer());
528 ASSERT_EQ(6, count->GetValueAsInteger());
529 ASSERT_EQ(42,
result->GetValueAsInteger());
539 ASSERT_NO_THROW(
result = jit->Run(
"42"));
542 ASSERT_EQ(42,
result->GetValueAsInteger()) <<
result->toString().c_str();
544 ASSERT_NO_THROW(
result = jit->Run(
"[0]<->{ 43 },[...]-->{44}"));
547 ASSERT_EQ(44,
result->GetValueAsInteger()) <<
result->toString().c_str();
549 ASSERT_NO_THROW(
result = jit->Run(
"{- --100-- -}"));
552 ASSERT_STREQ(
":RetMinus(100)",
result->toString().c_str());
554 ASSERT_NO_THROW(
result = jit->Run(
"**{- --100-- -}"));
556 ASSERT_STREQ(
"100",
result->toString().c_str());
618 ASSERT_ANY_THROW(
result = jit->Run(
"--"));
628 ASSERT_ANY_THROW(
result = jit->Run(
":: --"));
629 }
catch (
IntAny &except) {
632 ASSERT_STREQ(
"::", except.
m_value.c_str());
639 ASSERT_ANY_THROW(
result = jit->Run(
"--100--"));
644 ASSERT_STREQ(
"100", except.
m_return_obj->toString().c_str());
649 ASSERT_ANY_THROW(
result = jit->Run(
":: --100--"));
650 }
catch (
IntAny &except) {
653 ASSERT_STREQ(
"::", except.
m_value.c_str());
655 ASSERT_STREQ(
"100", except.
m_return_obj->toString().c_str());
662 ASSERT_ANY_THROW(
result = jit->Run(
"++"));
666 ASSERT_STREQ(
"::", except.
m_value.c_str());
673 ASSERT_ANY_THROW(
result = jit->Run(
":: ++"));
674 }
catch (
IntAny &except) {
676 ASSERT_STREQ(
"::", except.
m_value.c_str());
684 ASSERT_ANY_THROW(
result = jit->Run(
"++100++"));
689 ASSERT_STREQ(
"100", except.
m_return_obj->toString().c_str());
694 ASSERT_ANY_THROW(
result = jit->Run(
":: ++100++"));
695 }
catch (
IntAny &except) {
699 ASSERT_STREQ(
"100", except.
m_return_obj->toString().c_str());
708 ASSERT_ANY_THROW(
result = jit->Run(
"{ -- }"));
718 ASSERT_NO_THROW(
result = jit->Run(
"ns{ ns ++ }"));
720 ASSERT_TRUE(
result->is_none_type());
721 }
catch (
IntAny &except) {
727 ASSERT_NO_THROW(
result = jit->Run(
"ns{ { ns ++ } }"));
729 ASSERT_TRUE(
result->is_none_type());
730 }
catch (
IntAny &except) {
737 ASSERT_ANY_THROW(
result = jit->Run(
"{ ++100++; 200 }"));
742 ASSERT_STREQ(
"100", except.
m_return_obj->toString().c_str());
747 ASSERT_NO_THROW(
result = jit->Run(
"ns { ns ++100++; 200}"));
749 ASSERT_STREQ(
"100",
result->toString().c_str());
750 }
catch (
IntAny &except) {
756 ASSERT_NO_THROW(
result = jit->Run(
"br:= 5; ns { br+=1; [br>10]--> ns:: ++ br ++; ns:: --br--; 200 }"));
758 ASSERT_STREQ(
"11",
result->toString().c_str());
759 }
catch (
IntAny &except) {
std::string m_value
Содержит байтовую строку или байтовый массив с данными для представления в нативном виде (Struct,...
std::shared_ptr< Obj > ObjPtr
std::shared_ptr< RunTime > RuntimePtr
const char * toString(TermID type)