4#include <gtest/gtest.h>
14class SystemTest :
public ::testing::Test {
19 std::vector<std::string> m_postlex;
21 Logger::FuncCallback *m_log_callback_save;
22 void *m_log_callback_arg_save;
25 static void LoggerCallback(
void *param,
Logger::LogLevelType level,
const char * str,
bool flush) {
26 SystemTest *p =
static_cast<SystemTest *
> (param);
27 fprintf(stdout,
"%s", str);
37 Logger::Instance()->SaveCallback(m_log_callback_save, m_log_callback_arg_save);
38 Logger::Instance()->SetCallback(&LoggerCallback,
this);
42 Logger::Instance()->SetCallback(m_log_callback_save, m_log_callback_arg_save);
47 Parser p(buffer, &m_postlex, diag);
52 int Count(
TermID token_id) {
54 for (
int c = 0; c < ast->size(); c++) {
55 if ((*ast)[c].second->m_id == token_id) {
62 std::string LexOut() {
64 for (
int i = 0; i < m_postlex.size(); i++) {
146TEST_F(SystemTest, MethodExist) {
153 std::vector<Method> list;
155 list.push_back({
"getname",
nullptr});
160 std::string callname;
161 for (
auto &elem : list) {
162 callname =
"System::";
163 callname += elem.name;
169 ObjPtr arg = Obj::CreateDict();
170 arg->push_back(Obj::Arg());
171 arg->push_back(Obj::Arg(
"ls -l"));
173 ObjPtr ret = System::system(
nullptr, *arg);
175 std::cout << ret->toString().c_str();
179TEST_F(SystemTest, StaticAssert) {
181 JIT * jit = JIT::ReCreate();
185 ASSERT_FALSE(jit->
m_macro->empty());
192 ASSERT_TRUE(term->getTermID() == TermID::END);
194 ASSERT_ANY_THROW(jit->
GetParser()->Parse(
"@static_assert(0)"));
195 ASSERT_ANY_THROW(jit->
GetParser()->Parse(
"@static_assert(0.0)"));
196 ASSERT_ANY_THROW(jit->
GetParser()->Parse(
"@static_assert(0\\1)"));
197 ASSERT_ANY_THROW(jit->
GetParser()->Parse(
"@static_assert('')"));
198 ASSERT_ANY_THROW(jit->
GetParser()->Parse(
"@static_assert(\"\")"));
199 ASSERT_ANY_THROW(jit->
GetParser()->Parse(
"@static_assert($local)"));
200 ASSERT_ANY_THROW(jit->
GetParser()->Parse(
"@static_assert(::global)"));
201 ASSERT_ANY_THROW(jit->
GetParser()->Parse(
"@static_assert(@macro)"));
203 ASSERT_NO_THROW(jit->
GetParser()->Parse(
"@static_assert(1)"));
204 ASSERT_NO_THROW(jit->
GetParser()->Parse(
"@static_assert(1.0)"));
205 ASSERT_NO_THROW(jit->
GetParser()->Parse(
"@static_assert(1\\1)"));
206 ASSERT_NO_THROW(jit->
GetParser()->Parse(
"@static_assert(' ')"));
207 ASSERT_NO_THROW(jit->
GetParser()->Parse(
"@static_assert(\" \")"));
209 ASSERT_NO_THROW(jit->
GetParser()->Parse(
"@static_assert(%printf)"));
211 ASSERT_ANY_THROW(jit->
GetParser()->Parse(
"@static_assert(%FAIL_NATIVE_NAME)"));
212 int FAIL_NATIVE_NAME;
213 LLVMAddSymbol(
"FAIL_NATIVE_NAME", (
void *) &FAIL_NATIVE_NAME);
214 ASSERT_NO_THROW(jit->
GetParser()->Parse(
"@static_assert(%FAIL_NATIVE_NAME)"));
216 ASSERT_NO_THROW(jit->
GetParser()->Parse(
"@static_assert(1==1)"));
217 ASSERT_NO_THROW(jit->
GetParser()->Parse(
"@static_assert(1.0===1.0)"));
218 ASSERT_NO_THROW(jit->
GetParser()->Parse(
"@static_assert(1\\1 <= 10)"));
219 ASSERT_NO_THROW(jit->
GetParser()->Parse(
"@static_assert(''=='')"));
220 ASSERT_NO_THROW(jit->
GetParser()->Parse(
"@static_assert(\"str\"=='str')"));
222 ASSERT_ANY_THROW(jit->
GetParser()->Parse(
"@static_assert(\"str2222\"=='str')"));
226TEST_F(SystemTest, Assert) {
228 JIT * jit = JIT::ReCreate();
238 ASSERT_FALSE(jit->
m_macro->empty());
246 ASSERT_STREQ(
"1",
result->toString().c_str());
248 ASSERT_NO_THROW(
result = jit->
Run(
":Bool(1)"));
250 ASSERT_STREQ(
"1",
result->toString().c_str());
252 ASSERT_NO_THROW(
result = jit->
Run(
"1+1"));
254 ASSERT_STREQ(
"2",
result->toString().c_str());
256 ASSERT_NO_THROW(
result = jit->
Run(
":Bool(1+1)"));
258 ASSERT_STREQ(
"1",
result->toString().c_str());
261 ASSERT_NO_THROW(term = jit->
GetParser()->Parse(
" :Bool(1)")) << jit->
Dump();
263 ASSERT_STREQ(
":Bool(1)", term->toString().c_str());
265 ASSERT_NO_THROW(term = jit->
GetParser()->Parse(
":Bool(1+1)")) << jit->
Dump();
269 const char * assert1 =
"@assert(1+1, 2, 'str')";
274 ASSERT_TRUE(term->getTermID() == TermID::FOLLOW) << term->toString();
275 ASSERT_STREQ(
"[:Bool(1 + 1) == 0]-->{::Base::__assert_abort__(\"1+1\", 1 + 1, 2, 'str');};", term->toString().c_str());
278 ASSERT_TRUE(analisys.Analyze(term, &stack)) << jit->
Dump();
284 term = jit->
GetParser()->Parse(
"@verify(1)");
287 ASSERT_TRUE(term->getTermID() == TermID::FOLLOW) << term->toString();
288 ASSERT_STREQ(
"[:Bool(1) == 0]-->{::Base::__assert_abort__(\"1\", 1);};", term->toString().c_str());
290 ASSERT_NO_THROW(
result = jit->
Run(term->toString())) << jit->
Dump();
292 const char * assert2 =
"@verify(0, 3+4, '555')";
295 ASSERT_TRUE(term->getTermID() == TermID::FOLLOW) << term->toString();
296 ASSERT_STREQ(
"[:Bool(0) == 0]-->{::Base::__assert_abort__(\"0\", 0, 3 + 4, '555');};", term->toString().c_str());
301 jit = JIT::ReCreate({
"--nlc-no-assert"});
305 ASSERT_FALSE(jit->
m_macro->empty());
311 const char * assert3 =
"@assert(1+1, 2, 'str'); 33+44; 55";
316 ASSERT_TRUE(term->getTermID() == TermID::SEQUENCE) <<
toString(term->getTermID()) <<
" " << term->toString();
317 ASSERT_STREQ(
"_; 33 + 44; 55;", term->toString().c_str());
322 term = jit->
GetParser()->Parse(
"@verify(1+1, 'message'); 33+44");
325 ASSERT_TRUE(term->getTermID() == TermID::SEQUENCE) << term->toString();
326 ASSERT_STREQ(
"1 + 1; 33 + 44;", term->toString().c_str());
328 ASSERT_NO_THROW(
result = jit->
Run(term->toString()));
330 term = jit->
GetParser()->Parse(
"@verify(0+0)");
333 ASSERT_TRUE(term->getTermID() == TermID::OP_MATH) << term->toString();
334 ASSERT_STREQ(
"0 + 0", term->toString().c_str());
336 ASSERT_NO_THROW(
result = jit->
Run(term->toString()));
std::string Dump(const std::string_view filter="", const char delim=';')
ObjPtr Run(const std::string_view str, Obj *args=nullptr)
std::map< std::string, StorageTerm > ModuleMapType
std::shared_ptr< Term > TermPtr
std::shared_ptr< Obj > ObjPtr
std::shared_ptr< Macro > MacroPtr
std::shared_ptr< Diag > DiagPtr
const char * toString(TermID type)
std::string & trim(std::string &s, const char *t=ws)