linter_ut.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. #include "linter.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. using namespace NYql;
  4. using namespace NYql::NFastCheck;
  5. Y_UNIT_TEST_SUITE(TLinterTests) {
  6. Y_UNIT_TEST(ListChecksResult) {
  7. auto res = ListChecks();
  8. UNIT_ASSERT(!res.empty());
  9. }
  10. Y_UNIT_TEST(DummyLexerSExpr) {
  11. TChecksRequest request;
  12. request.Program = "((return world))";
  13. request.Syntax = ESyntax::SExpr;
  14. request.Filters.ConstructInPlace();
  15. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "lexer"});
  16. auto res = RunChecks(request);
  17. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  18. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer");
  19. UNIT_ASSERT(res.Checks[0].Success);
  20. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
  21. }
  22. Y_UNIT_TEST(DummyLexerPg) {
  23. TChecksRequest request;
  24. request.Program = "select 1::text";
  25. request.Syntax = ESyntax::PG;
  26. request.Filters.ConstructInPlace();
  27. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "lexer"});
  28. auto res = RunChecks(request);
  29. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  30. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer");
  31. UNIT_ASSERT(res.Checks[0].Success);
  32. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
  33. }
  34. Y_UNIT_TEST(GoodLexerYql) {
  35. TChecksRequest request;
  36. request.Program = "1";
  37. request.Syntax = ESyntax::YQL;
  38. request.Filters.ConstructInPlace();
  39. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "lexer"});
  40. auto res = RunChecks(request);
  41. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  42. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer");
  43. UNIT_ASSERT(res.Checks[0].Success);
  44. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
  45. }
  46. Y_UNIT_TEST(BadLexerYql) {
  47. TChecksRequest request;
  48. request.Program = "Я";
  49. request.Syntax = ESyntax::YQL;
  50. request.Filters.ConstructInPlace();
  51. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "lexer"});
  52. auto res = RunChecks(request);
  53. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  54. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer");
  55. UNIT_ASSERT(!res.Checks[0].Success);
  56. Cerr << res.Checks[0].Issues.ToString();
  57. UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
  58. }
  59. Y_UNIT_TEST(DummyFormatSExpr) {
  60. TChecksRequest request;
  61. request.Program = "((return world))";
  62. request.Syntax = ESyntax::SExpr;
  63. request.Filters.ConstructInPlace();
  64. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
  65. auto res = RunChecks(request);
  66. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  67. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
  68. UNIT_ASSERT(res.Checks[0].Success);
  69. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
  70. }
  71. Y_UNIT_TEST(DummyFormatPg) {
  72. TChecksRequest request;
  73. request.Program = "select 1::text";
  74. request.Syntax = ESyntax::PG;
  75. request.Filters.ConstructInPlace();
  76. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
  77. auto res = RunChecks(request);
  78. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  79. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
  80. UNIT_ASSERT(res.Checks[0].Success);
  81. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
  82. }
  83. Y_UNIT_TEST(GoodFormatYql) {
  84. TChecksRequest request;
  85. request.Program = "SELECT\n 1\n;\n";
  86. request.Syntax = ESyntax::YQL;
  87. request.Filters.ConstructInPlace();
  88. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
  89. auto res = RunChecks(request);
  90. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  91. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
  92. UNIT_ASSERT(res.Checks[0].Success);
  93. Cerr << res.Checks[0].Issues.ToString();
  94. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
  95. }
  96. Y_UNIT_TEST(UnparsedFormatYql) {
  97. TChecksRequest request;
  98. request.Program = "select1\n";
  99. request.Syntax = ESyntax::YQL;
  100. request.Filters.ConstructInPlace();
  101. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
  102. auto res = RunChecks(request);
  103. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  104. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
  105. UNIT_ASSERT(res.Checks[0].Success);
  106. Cerr << res.Checks[0].Issues.ToString();
  107. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
  108. }
  109. Y_UNIT_TEST(BadFormatYql) {
  110. TChecksRequest request;
  111. request.Program = "select 1";
  112. request.Syntax = ESyntax::YQL;
  113. request.Filters.ConstructInPlace();
  114. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
  115. auto res = RunChecks(request);
  116. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  117. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
  118. UNIT_ASSERT(!res.Checks[0].Success);
  119. Cerr << res.Checks[0].Issues.ToString();
  120. UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
  121. }
  122. Y_UNIT_TEST(ContextForBadFormatYql) {
  123. TChecksRequest request;
  124. request.Program = "SELECT\n 'привет',1;";
  125. request.File = "myFile.sql";
  126. request.Syntax = ESyntax::YQL;
  127. request.Filters.ConstructInPlace();
  128. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "format"});
  129. auto res = RunChecks(request);
  130. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  131. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format");
  132. UNIT_ASSERT(!res.Checks[0].Success);
  133. Cerr << res.Checks[0].Issues.ToString();
  134. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 1);
  135. const auto& pos = res.Checks[0].Issues.back().Position;
  136. UNIT_ASSERT_VALUES_EQUAL(pos.Row, 2);
  137. UNIT_ASSERT_VALUES_EQUAL(pos.Column, 13);
  138. }
  139. Y_UNIT_TEST(GoodParserSExpr) {
  140. TChecksRequest request;
  141. request.Program = "((return world))";
  142. request.Syntax = ESyntax::SExpr;
  143. request.Filters.ConstructInPlace();
  144. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
  145. auto res = RunChecks(request);
  146. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  147. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
  148. UNIT_ASSERT(res.Checks[0].Success);
  149. Cerr << res.Checks[0].Issues.ToString();
  150. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
  151. }
  152. Y_UNIT_TEST(BadParserSExpr) {
  153. TChecksRequest request;
  154. request.Program = ")";
  155. request.Syntax = ESyntax::SExpr;
  156. request.Filters.ConstructInPlace();
  157. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
  158. auto res = RunChecks(request);
  159. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  160. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
  161. UNIT_ASSERT(!res.Checks[0].Success);
  162. Cerr << res.Checks[0].Issues.ToString();
  163. UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
  164. }
  165. Y_UNIT_TEST(GoodParserPg) {
  166. TChecksRequest request;
  167. request.Program = "select 1::text";
  168. request.Syntax = ESyntax::PG;
  169. request.Filters.ConstructInPlace();
  170. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
  171. auto res = RunChecks(request);
  172. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  173. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
  174. UNIT_ASSERT(res.Checks[0].Success);
  175. Cerr << res.Checks[0].Issues.ToString();
  176. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
  177. }
  178. Y_UNIT_TEST(BadParserPg) {
  179. TChecksRequest request;
  180. request.Program = "sel";
  181. request.Syntax = ESyntax::PG;
  182. request.Filters.ConstructInPlace();
  183. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
  184. auto res = RunChecks(request);
  185. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  186. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
  187. UNIT_ASSERT(!res.Checks[0].Success);
  188. Cerr << res.Checks[0].Issues.ToString();
  189. UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
  190. }
  191. Y_UNIT_TEST(DummyParserPg) {
  192. TChecksRequest request;
  193. request.Program = "select 1::text";
  194. request.Syntax = ESyntax::PG;
  195. request.Filters.ConstructInPlace();
  196. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
  197. auto res = RunChecks(request);
  198. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  199. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
  200. UNIT_ASSERT(res.Checks[0].Success);
  201. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
  202. }
  203. Y_UNIT_TEST(GoodParserYql) {
  204. TChecksRequest request;
  205. request.Program = "SELECT 1";
  206. request.Syntax = ESyntax::YQL;
  207. request.Filters.ConstructInPlace();
  208. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
  209. auto res = RunChecks(request);
  210. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  211. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
  212. UNIT_ASSERT(res.Checks[0].Success);
  213. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
  214. }
  215. Y_UNIT_TEST(BadParserYql) {
  216. TChecksRequest request;
  217. request.Program = "1";
  218. request.Syntax = ESyntax::YQL;
  219. request.Filters.ConstructInPlace();
  220. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "parser"});
  221. auto res = RunChecks(request);
  222. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  223. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser");
  224. UNIT_ASSERT(!res.Checks[0].Success);
  225. Cerr << res.Checks[0].Issues.ToString();
  226. UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
  227. }
  228. Y_UNIT_TEST(DummyTranslatorSExpr) {
  229. TChecksRequest request;
  230. request.Program = "((return world))";
  231. request.Syntax = ESyntax::SExpr;
  232. request.Filters.ConstructInPlace();
  233. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
  234. auto res = RunChecks(request);
  235. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  236. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
  237. UNIT_ASSERT(res.Checks[0].Success);
  238. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0);
  239. }
  240. Y_UNIT_TEST(GoodTranslatorPg) {
  241. TChecksRequest request;
  242. request.ClusterMapping["plato"] = TString(YtProviderName);
  243. request.Program = "select * from plato.\"Input\"";
  244. request.Syntax = ESyntax::PG;
  245. request.Filters.ConstructInPlace();
  246. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
  247. auto res = RunChecks(request);
  248. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  249. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
  250. UNIT_ASSERT(res.Checks[0].Success);
  251. Cerr << res.Checks[0].Issues.ToString();
  252. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
  253. }
  254. Y_UNIT_TEST(BadTranslatorPg) {
  255. TChecksRequest request;
  256. request.Program = "select * from \"Input\"";
  257. request.Syntax = ESyntax::PG;
  258. request.Filters.ConstructInPlace();
  259. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
  260. auto res = RunChecks(request);
  261. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  262. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
  263. UNIT_ASSERT(!res.Checks[0].Success);
  264. Cerr << res.Checks[0].Issues.ToString();
  265. UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
  266. }
  267. Y_UNIT_TEST(GoodTranslatorYql) {
  268. TChecksRequest request;
  269. request.ClusterMapping["plato"] = TString(YtProviderName);
  270. request.Program = "use plato; select * from Input";
  271. request.Syntax = ESyntax::YQL;
  272. request.Filters.ConstructInPlace();
  273. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
  274. auto res = RunChecks(request);
  275. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  276. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
  277. UNIT_ASSERT(res.Checks[0].Success);
  278. Cerr << res.Checks[0].Issues.ToString();
  279. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
  280. }
  281. Y_UNIT_TEST(BadTranslatorYql) {
  282. TChecksRequest request;
  283. request.Program = "select ListLengggth([1,2,3])";
  284. request.Syntax = ESyntax::YQL;
  285. request.Filters.ConstructInPlace();
  286. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
  287. auto res = RunChecks(request);
  288. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  289. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
  290. UNIT_ASSERT(!res.Checks[0].Success);
  291. Cerr << res.Checks[0].Issues.ToString();
  292. UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
  293. }
  294. Y_UNIT_TEST(AllowYqlExportsForLibrary) {
  295. TChecksRequest request;
  296. request.Program = "$a = 1; export $a";
  297. request.Mode = EMode::Library;
  298. request.Syntax = ESyntax::YQL;
  299. request.Filters.ConstructInPlace();
  300. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
  301. auto res = RunChecks(request);
  302. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  303. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
  304. UNIT_ASSERT(res.Checks[0].Success);
  305. Cerr << res.Checks[0].Issues.ToString();
  306. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
  307. }
  308. Y_UNIT_TEST(AllowYqlExportsForDefault) {
  309. TChecksRequest request;
  310. request.Program = "$a = 1; export $a";
  311. request.Syntax = ESyntax::YQL;
  312. request.Filters.ConstructInPlace();
  313. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
  314. auto res = RunChecks(request);
  315. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  316. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
  317. UNIT_ASSERT(res.Checks[0].Success);
  318. Cerr << res.Checks[0].Issues.ToString();
  319. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
  320. }
  321. Y_UNIT_TEST(DisallowYqlExportsForMain) {
  322. TChecksRequest request;
  323. request.Program = "$a = 1; export $a";
  324. request.Syntax = ESyntax::YQL;
  325. request.Mode = EMode::Main;
  326. request.Filters.ConstructInPlace();
  327. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
  328. auto res = RunChecks(request);
  329. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  330. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
  331. UNIT_ASSERT(!res.Checks[0].Success);
  332. Cerr << res.Checks[0].Issues.ToString();
  333. UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
  334. }
  335. Y_UNIT_TEST(DisallowYqlExportsForView) {
  336. TChecksRequest request;
  337. request.Program = "$a = 1; export $a";
  338. request.Syntax = ESyntax::YQL;
  339. request.Mode = EMode::View;
  340. request.Filters.ConstructInPlace();
  341. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
  342. auto res = RunChecks(request);
  343. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  344. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
  345. UNIT_ASSERT(!res.Checks[0].Success);
  346. Cerr << res.Checks[0].Issues.ToString();
  347. UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
  348. }
  349. Y_UNIT_TEST(GoodYqlView) {
  350. TChecksRequest request;
  351. request.Program = "select 1";
  352. request.Syntax = ESyntax::YQL;
  353. request.Mode = EMode::View;
  354. request.Filters.ConstructInPlace();
  355. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
  356. auto res = RunChecks(request);
  357. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  358. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
  359. UNIT_ASSERT(res.Checks[0].Success);
  360. Cerr << res.Checks[0].Issues.ToString();
  361. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
  362. }
  363. Y_UNIT_TEST(BadYqlView) {
  364. TChecksRequest request;
  365. request.Program = "select 1;select 2";
  366. request.Syntax = ESyntax::YQL;
  367. request.Mode = EMode::View;
  368. request.Filters.ConstructInPlace();
  369. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"});
  370. auto res = RunChecks(request);
  371. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  372. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator");
  373. UNIT_ASSERT(!res.Checks[0].Success);
  374. Cerr << res.Checks[0].Issues.ToString();
  375. UNIT_ASSERT(res.Checks[0].Issues.Size() > 0);
  376. }
  377. Y_UNIT_TEST(AllChecks) {
  378. TChecksRequest request;
  379. request.Program = "SELECT\n 1\n;\n";
  380. request.Syntax = ESyntax::YQL;
  381. auto res = RunChecks(request);
  382. TSet<TString> passedChecks;
  383. for (const auto& r : res.Checks) {
  384. Cerr << r.CheckName << "\n";
  385. UNIT_ASSERT(r.Success);
  386. Cerr << r.Issues.ToString();
  387. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
  388. passedChecks.insert(r.CheckName);
  389. }
  390. UNIT_ASSERT_VALUES_EQUAL(passedChecks, ListChecks());
  391. }
  392. Y_UNIT_TEST(AllChecksByStar) {
  393. TChecksRequest request;
  394. request.Program = "SELECT\n 1\n;\n";
  395. request.Syntax = ESyntax::YQL;
  396. request.Filters.ConstructInPlace();
  397. request.Filters->push_back(TCheckFilter{.CheckNameGlob = "*"});
  398. auto res = RunChecks(request);
  399. TSet<TString> passedChecks;
  400. for (const auto& r : res.Checks) {
  401. Cerr << r.CheckName << "\n";
  402. UNIT_ASSERT(r.Success);
  403. Cerr << r.Issues.ToString();
  404. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0);
  405. passedChecks.insert(r.CheckName);
  406. }
  407. UNIT_ASSERT_VALUES_EQUAL(passedChecks, ListChecks());
  408. }
  409. Y_UNIT_TEST(NoChecksByStarWithSecondFilter) {
  410. TChecksRequest request;
  411. request.Program = "1";
  412. request.Syntax = ESyntax::YQL;
  413. request.Filters.ConstructInPlace();
  414. request.Filters->push_back(TCheckFilter{.Include = false, .CheckNameGlob = "*"});
  415. request.Filters->push_back(TCheckFilter{.Include = true, .CheckNameGlob = "lexer"});
  416. auto res = RunChecks(request);
  417. UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1);
  418. UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer");
  419. UNIT_ASSERT(res.Checks[0].Success);
  420. }
  421. }