tars2case.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717
  1. /**
  2. * Tencent is pleased to support the open source community by making Tars available.
  3. *
  4. * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
  5. *
  6. * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
  7. * in compliance with the License. You may obtain a copy of the License at
  8. *
  9. * https://opensource.org/licenses/BSD-3-Clause
  10. *
  11. * Unless required by applicable law or agreed to in writing, software distributed
  12. * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  13. * CONDITIONS OF ANY KIND, either express or implied. See the License for the
  14. * specific language governing permissions and limitations under the License.
  15. */
  16. #include "tars2case.h"
  17. #include "util/tc_md5.h"
  18. #include "util/tc_file.h"
  19. #include "util/tc_common.h"
  20. #include <string>
  21. //////////////////////////////////////////////////////////////////////////////////
  22. //
  23. Tars2Case::Tars2Case() : _jsonCase(false), _webCase(false)
  24. {
  25. }
  26. string Tars2Case::toDescStr(const TypePtr &pPtr) const
  27. {
  28. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  29. if (bPtr)
  30. {
  31. switch (bPtr->kind())
  32. {
  33. case Builtin::KindByte: return bPtr->isUnsigned() ? "byte_u" : "byte"; break;
  34. case Builtin::KindShort: return bPtr->isUnsigned() ? "short_u" : "short"; break;
  35. case Builtin::KindInt: return bPtr->isUnsigned() ? "int_u" : "int"; break;
  36. case Builtin::KindLong: return "long"; break;
  37. case Builtin::KindBool: return "bool"; break;
  38. case Builtin::KindFloat: return "float"; break;
  39. case Builtin::KindDouble: return "double"; break;
  40. case Builtin::KindString: return "string"; break;
  41. default: assert(false); break;
  42. }
  43. }
  44. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr);
  45. if (vPtr) return "vector";
  46. MapPtr mPtr = MapPtr::dynamicCast(pPtr);
  47. if (mPtr) return "map";
  48. StructPtr sPtr = StructPtr::dynamicCast(pPtr);
  49. if (sPtr) return "struct";
  50. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  51. if (ePtr) return "int";
  52. return "void";
  53. }
  54. string Tars2Case::toStr(const TypePtr &pPtr) const
  55. {
  56. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  57. if (bPtr) return tostrBuiltin(bPtr);
  58. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr);
  59. if (vPtr) return tostrVector(vPtr);
  60. MapPtr mPtr = MapPtr::dynamicCast(pPtr);
  61. if (mPtr) return tostrMap(mPtr);
  62. StructPtr sPtr = StructPtr::dynamicCast(pPtr);
  63. if (sPtr) return tostrStruct(sPtr);
  64. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  65. if (ePtr) return tostrEnum(ePtr);
  66. if (!pPtr) return "void";
  67. assert(false);
  68. return "";
  69. }
  70. string Tars2Case::toCase(const TypePtr &pPtr, const string& varName) const
  71. {
  72. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  73. if (bPtr) return tocaseBuiltin(bPtr, varName);
  74. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr);
  75. if (vPtr) return tocaseVector(vPtr, varName);
  76. MapPtr mPtr = MapPtr::dynamicCast(pPtr);
  77. if (mPtr) return tocaseMap(mPtr, varName);
  78. StructPtr sPtr = StructPtr::dynamicCast(pPtr);
  79. if (sPtr) return tocaseStruct(sPtr, varName);
  80. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  81. if (ePtr) return tocaseEnum(ePtr, varName);
  82. if (!pPtr) return "void";
  83. assert(false);
  84. return "";
  85. }
  86. /*******************************BuiltinPtr********************************/
  87. string Tars2Case::tostrBuiltin(const BuiltinPtr &pPtr) const
  88. {
  89. string s;
  90. switch (pPtr->kind())
  91. {
  92. case Builtin::KindBool:
  93. s = "bool";
  94. break;
  95. case Builtin::KindByte:
  96. s = pPtr->isUnsigned() ? "short" : "byte";
  97. break;
  98. case Builtin::KindShort:
  99. s = pPtr->isUnsigned() ? "int" : "short";
  100. break;
  101. case Builtin::KindInt:
  102. s = pPtr->isUnsigned() ? "long" : "int";
  103. break;
  104. case Builtin::KindLong:
  105. s = "long";
  106. break;
  107. case Builtin::KindFloat:
  108. s = "float";
  109. break;
  110. case Builtin::KindDouble:
  111. s = "double";
  112. break;
  113. case Builtin::KindString:
  114. s = "string";
  115. break;
  116. case Builtin::KindVector:
  117. s = "vector";
  118. break;
  119. case Builtin::KindMap:
  120. s = "map";
  121. break;
  122. default:
  123. assert(false);
  124. break;
  125. }
  126. return s;
  127. }
  128. string Tars2Case::tocaseBuiltin(const BuiltinPtr &pPtr, const string& varName) const
  129. {
  130. string s;
  131. switch (pPtr->kind())
  132. {
  133. case Builtin::KindBool:
  134. s = "true";
  135. break;
  136. case Builtin::KindByte:
  137. s = "0";
  138. break;
  139. case Builtin::KindShort:
  140. s = "0";
  141. break;
  142. case Builtin::KindInt:
  143. s = "0";
  144. break;
  145. case Builtin::KindLong:
  146. s = "0";
  147. break;
  148. case Builtin::KindFloat:
  149. s = "0.0";
  150. break;
  151. case Builtin::KindDouble:
  152. s = "0.00";
  153. break;
  154. case Builtin::KindString:
  155. s = "key";
  156. break;
  157. /*
  158. case Builtin::KindVector:
  159. s = "vector";
  160. break;
  161. case Builtin::KindMap:
  162. s = "map";
  163. break;
  164. */
  165. default:
  166. assert(false);
  167. break;
  168. }
  169. return s;
  170. }
  171. /*******************************VectorPtr********************************/
  172. string Tars2Case::tostrVector(const VectorPtr &pPtr) const
  173. {
  174. string s;
  175. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr());
  176. s = "vector" + string("<") + toStr(pPtr->getTypePtr()) + ">";
  177. return s;
  178. }
  179. string Tars2Case::tocaseVector(const VectorPtr &pPtr, const string& varName) const
  180. {
  181. string s;
  182. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr());
  183. s = string("<");
  184. for(int i = 0; i < 2; i++) {
  185. if(i != 0) {
  186. s += ",";
  187. }
  188. s += toCase(pPtr->getTypePtr(), varName);
  189. }
  190. s += ">";
  191. return s;
  192. }
  193. string Tars2Case::tostrMap(const MapPtr &pPtr, bool bNew) const
  194. {
  195. string s = "map";
  196. s += string("<") + toStr(pPtr->getLeftTypePtr()) + "," + toStr(pPtr->getRightTypePtr()) + ">";
  197. return s;
  198. }
  199. string Tars2Case::tocaseMap(const MapPtr &pPtr, const string& varName) const
  200. {
  201. string s = string("[");
  202. for(int i = 0; i < 2; i++) {
  203. if(i != 0) {
  204. s += ",";
  205. }
  206. s += toCase(pPtr->getLeftTypePtr(), varName) + "=" + toCase(pPtr->getRightTypePtr(), varName);
  207. }
  208. s += "]";
  209. return s;
  210. }
  211. string Tars2Case::tostrStruct(const StructPtr &pPtr) const
  212. {
  213. vector<TypeIdPtr>& members = pPtr->getAllMemberPtr();
  214. string s;
  215. //是否生成tag和require等信息
  216. bool genTag = false;
  217. for(size_t i = 0; i < members.size(); i++) {
  218. TypeIdPtr typeId = members[i];
  219. if(!s.empty()) {
  220. s += ",";
  221. }
  222. if(i == 0) {
  223. if(typeId->getTag() == 0) {
  224. genTag = false;
  225. }
  226. else {
  227. genTag = true;
  228. }
  229. }
  230. else {
  231. //检查tag是否连续
  232. if(typeId->getTag() == members[i-1]->getTag() + 1) {
  233. genTag = false;
  234. }
  235. else {
  236. genTag = true;
  237. }
  238. }
  239. if(genTag) {
  240. s+=genratePrefix(typeId) + " ";
  241. }
  242. s += toStr(typeId->getTypePtr());
  243. }
  244. return "struct<" + s + ">";
  245. }
  246. string Tars2Case::tocaseStruct(const StructPtr &pPtr, const string& varName) const
  247. {
  248. vector<TypeIdPtr>& members = pPtr->getAllMemberPtr();
  249. string s = string("<");
  250. for(size_t i = 0; i < members.size(); i++) {
  251. if(i != 0) {
  252. s += ",";
  253. }
  254. s += toCase(members[i]->getTypePtr(), varName);
  255. }
  256. s += ">";
  257. return s;
  258. }
  259. string Tars2Case::genratePrefix(const TypeIdPtr &ptr) const
  260. {
  261. string s = TC_Common::tostr(ptr->getTag()) + " ";
  262. if(ptr->isRequire()) {
  263. s += "require";
  264. }
  265. else {
  266. s += "optional";
  267. }
  268. return s;
  269. }
  270. string Tars2Case::tostrEnum(const EnumPtr &pPtr) const
  271. {
  272. return "int";
  273. }
  274. string Tars2Case::tocaseEnum(const EnumPtr &pPtr, const string& varName) const
  275. {
  276. return "19";
  277. }
  278. string Tars2Case::generateTest(const ParamDeclPtr &pPtr) const
  279. {
  280. ostringstream s;
  281. TypePtr typePtr = pPtr->getTypeIdPtr()->getTypePtr();
  282. s << toStr(typePtr);
  283. return s.str();
  284. }
  285. string Tars2Case::generateCase(const ParamDeclPtr &pPtr) const
  286. {
  287. ostringstream s;
  288. TypePtr typePtr = pPtr->getTypeIdPtr()->getTypePtr();
  289. string varName = pPtr->getTypeIdPtr()->getId();
  290. s << toCase(typePtr, varName);
  291. return s.str();
  292. }
  293. struct SortOperation
  294. {
  295. bool operator()(const OperationPtr &o1, const OperationPtr &o2)
  296. {
  297. return o1->getId() < o2->getId();
  298. }
  299. };
  300. string Tars2Case::generateTest(const InterfacePtr &pPtr, const string& outfile) const
  301. {
  302. ostringstream s;
  303. vector<OperationPtr>& vOperation = pPtr->getAllOperationPtr();
  304. std::sort(vOperation.begin(), vOperation.end(), SortOperation());
  305. //生成客户端接口的声明
  306. TC_File::makeDirRecursive(_baseDir);
  307. for (size_t i = 0; i < vOperation.size(); i++)
  308. {
  309. string sCase = "";
  310. string sInParams = "";
  311. string sOutParams = "";
  312. vector<ParamDeclPtr>& vParamDecl = vOperation[i]->getAllParamDeclPtr();
  313. for (size_t j = 0; j < vParamDecl.size(); j++)
  314. {
  315. if(vParamDecl[j]->isOut()) {
  316. sOutParams += (sOutParams.empty() ? "" : "|") + generateTest(vParamDecl[j]);
  317. }
  318. else {
  319. sCase += (sCase.empty() ? "" : "\r\n") + generateCase(vParamDecl[j]);
  320. sInParams += (sInParams.empty() ? "" : "|") + generateTest(vParamDecl[j]);
  321. }
  322. }
  323. ostringstream sc;
  324. sc << sInParams << endl << "#### 隔离符 ####" << endl << sCase << endl;
  325. string filecase = _baseDir + "/" + vOperation[i]->getId() + ".case";
  326. TC_File::save2file(filecase, sc.str());
  327. }
  328. return s.str();
  329. }
  330. JsonValuePtr Tars2Case::toJsonBuiltin(const BuiltinPtr &pPtr) const
  331. {
  332. JsonValuePtr p;
  333. switch (pPtr->kind())
  334. {
  335. case Builtin::KindBool:
  336. p = JsonOutput::writeJson(true);
  337. break;
  338. case Builtin::KindByte:
  339. p = JsonOutput::writeJson(8);
  340. break;
  341. case Builtin::KindShort:
  342. p = JsonOutput::writeJson(16);
  343. break;
  344. case Builtin::KindInt:
  345. p = JsonOutput::writeJson(32);
  346. break;
  347. case Builtin::KindLong:
  348. p = JsonOutput::writeJson(64);
  349. break;
  350. case Builtin::KindFloat:
  351. p = JsonOutput::writeJson(1.01);
  352. break;
  353. case Builtin::KindDouble:
  354. p = JsonOutput::writeJson((double)2.0000005);
  355. break;
  356. case Builtin::KindString:
  357. p = JsonOutput::writeJson(string("string"));
  358. break;
  359. default:
  360. assert(false);
  361. break;
  362. }
  363. return p;
  364. }
  365. JsonValuePtr Tars2Case::toJsonEnum(const EnumPtr &pPtr) const
  366. {
  367. return JsonOutput::writeJson(string("int32"));
  368. }
  369. JsonValueArrayPtr Tars2Case::toJsonVector(const VectorPtr &pPtr) const
  370. {
  371. JsonValueArrayPtr p = new JsonValueArray();
  372. JsonValuePtr p1 = generateJson(pPtr->getTypePtr());
  373. p->push_back(p1);
  374. p->push_back(p1);
  375. return p;
  376. }
  377. JsonValueObjPtr Tars2Case::toJsonMap(const MapPtr &pPtr) const
  378. {
  379. JsonValueObjPtr p = new JsonValueObj();
  380. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getLeftTypePtr());
  381. if (bPtr)
  382. {
  383. p->value["key"] = generateJson(pPtr->getRightTypePtr());
  384. // p->value[tocaseBuiltin(bPtr, "")] = generateJson(pPtr->getRightTypePtr());
  385. }
  386. return p;
  387. }
  388. JsonValueObjPtr Tars2Case::toJsonStruct(const StructPtr &pPtr) const
  389. {
  390. JsonValueObjPtr p = new JsonValueObj();
  391. vector<TypeIdPtr>& members = pPtr->getAllMemberPtr();
  392. //是否生成tag和require等信息
  393. for(size_t i = 0; i < members.size(); i++)
  394. {
  395. TypeIdPtr typeId = members[i];
  396. string keyName = typeId->getId();
  397. p->value[keyName] = generateJson(typeId->getTypePtr());
  398. }
  399. return p;
  400. }
  401. JsonValuePtr Tars2Case::generateJson(const TypePtr &pPtr) const
  402. {
  403. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  404. if (bPtr) return toJsonBuiltin(bPtr);
  405. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr);
  406. if (vPtr) return toJsonVector(vPtr);
  407. MapPtr mPtr = MapPtr::dynamicCast(pPtr);
  408. if (mPtr) return toJsonMap(mPtr);
  409. StructPtr sPtr = StructPtr::dynamicCast(pPtr);
  410. if (sPtr) return toJsonStruct(sPtr);
  411. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  412. if (ePtr) return toJsonEnum(ePtr);
  413. assert(false);
  414. return NULL;
  415. }
  416. JsonValuePtr Tars2Case::toJsonDescEnum(const EnumPtr &pPtr) const
  417. {
  418. return JsonOutput::writeJson(string("0"));
  419. }
  420. JsonValuePtr Tars2Case::toJsonDescVector(const VectorPtr &pPtr) const
  421. {
  422. JsonValueObjPtr p = new JsonValueObj();
  423. string name = "0_vector_" + toDescStr(pPtr->getTypePtr());
  424. p->value[name] = generateJsonDesc(pPtr->getTypePtr());
  425. return p;
  426. }
  427. JsonValuePtr Tars2Case::toJsonDescMap(const MapPtr &pPtr) const
  428. {
  429. string name;
  430. JsonValueObjPtr p = new JsonValueObj();
  431. name = "0_map_" + toDescStr(pPtr->getLeftTypePtr());
  432. p->value[name] = generateJsonDesc(pPtr->getLeftTypePtr());
  433. name = "1_map_" + toDescStr(pPtr->getRightTypePtr());
  434. p->value[name] = generateJsonDesc(pPtr->getRightTypePtr());
  435. return p;
  436. }
  437. JsonValuePtr Tars2Case::toJsonDescStruct(const StructPtr &pPtr) const
  438. {
  439. JsonValueObjPtr p = new JsonValueObj();
  440. vector<TypeIdPtr>& members = pPtr->getAllMemberPtr();
  441. //是否生成tag和require等信息
  442. for(size_t i = 0; i < members.size(); i++)
  443. {
  444. ostringstream osd;
  445. osd << members[i]->getTag() << "_" << members[i]->getId() << "_" << toDescStr(members[i]->getTypePtr());
  446. p->value[osd.str()] = generateJsonDesc(members[i]);
  447. }
  448. return p;
  449. }
  450. JsonValuePtr Tars2Case::generateJsonDesc(const TypePtr &pPtr) const
  451. {
  452. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr);
  453. if (bPtr) return JsonOutput::writeJson(bPtr->def());
  454. VectorPtr vPtr = VectorPtr::dynamicCast(pPtr);
  455. if (vPtr) return toJsonDescVector(vPtr);
  456. MapPtr mPtr = MapPtr::dynamicCast(pPtr);
  457. if (mPtr) return toJsonDescMap(mPtr);
  458. StructPtr sPtr = StructPtr::dynamicCast(pPtr);
  459. if (sPtr) return toJsonDescStruct(sPtr);
  460. EnumPtr ePtr = EnumPtr::dynamicCast(pPtr);
  461. if (ePtr) return toJsonDescEnum(ePtr);
  462. assert(false);
  463. return NULL;
  464. }
  465. JsonValuePtr Tars2Case::generateJsonDesc(const TypeIdPtr &pPtr) const
  466. {
  467. BuiltinPtr bPtr = BuiltinPtr::dynamicCast(pPtr->getTypePtr());
  468. if (bPtr) return JsonOutput::writeJson(pPtr->hasDefault() ? pPtr->def() : bPtr->def());
  469. return generateJsonDesc(pPtr->getTypePtr());
  470. }
  471. string Tars2Case::generateDesc(const InterfacePtr &pPtr, const string& outfile) const
  472. {
  473. ostringstream s;
  474. vector<OperationPtr>& vOperation = pPtr->getAllOperationPtr();
  475. std::sort(vOperation.begin(), vOperation.end(), SortOperation());
  476. //生成客户端接口的声明
  477. TC_File::makeDirRecursive(_baseDir);
  478. for (size_t i = 0; i < vOperation.size(); i++)
  479. {
  480. JsonValueObjPtr inDesc = new JsonValueObj();
  481. JsonValueObjPtr inParam = new JsonValueObj();
  482. vector<ParamDeclPtr>& vParamDecl = vOperation[i]->getAllParamDeclPtr();
  483. for (size_t j = 0; j < vParamDecl.size(); j++)
  484. {
  485. ostringstream osd;
  486. TypeIdPtr& p = vParamDecl[j]->getTypeIdPtr();
  487. osd << p->getTag() << "_" << p->getId() << "_" << toDescStr(p->getTypePtr());
  488. if(!vParamDecl[j]->isOut())
  489. {
  490. inDesc->value[osd.str()] = generateJsonDesc(p);
  491. inParam->value[p->getId()] = generateJson(vParamDecl[j]->getTypeIdPtr()->getTypePtr());
  492. }
  493. }
  494. string filedesc = _baseDir + "/" + vOperation[i]->getId() + ".desc";
  495. string filecase = _baseDir + "/" + vOperation[i]->getId() + ".case";
  496. TC_File::save2file(filedesc, TC_Json::writeValue(inDesc));
  497. TC_File::save2file(filecase, TC_Json::writeValue(inParam));
  498. }
  499. return s.str();
  500. }
  501. string Tars2Case::generateJson(const InterfacePtr &pPtr, const string& outfile) const
  502. {
  503. ostringstream s;
  504. vector<OperationPtr>& vOperation = pPtr->getAllOperationPtr();
  505. std::sort(vOperation.begin(), vOperation.end(), SortOperation());
  506. // 生成客户端接口的声明
  507. JsonValueObjPtr v = new JsonValueObj();
  508. // JsonValueArrayPtr v = new JsonValueArray();
  509. for (size_t i = 0; i < vOperation.size(); i++)
  510. {
  511. string intCaseValues = "";
  512. string intCaseParams = "";
  513. string outCaseParams = "";
  514. JsonValueObjPtr inDesc = new JsonValueObj();
  515. JsonValueObjPtr outDesc = new JsonValueObj();
  516. JsonValueObjPtr inParam = new JsonValueObj();
  517. JsonValueObjPtr outParam = new JsonValueObj();
  518. vector<ParamDeclPtr>& vParamDecl = vOperation[i]->getAllParamDeclPtr();
  519. for (size_t j = 0; j < vParamDecl.size(); j++)
  520. {
  521. ostringstream osd;
  522. TypeIdPtr& p = vParamDecl[j]->getTypeIdPtr();
  523. osd << p->getTag() << "_" << p->getId() << "_" << toDescStr(p->getTypePtr());
  524. if(vParamDecl[j]->isOut())
  525. {
  526. outCaseParams += (outCaseParams.empty() ? "" : "|") + generateTest(vParamDecl[j]);
  527. outDesc->value[osd.str()] = generateJsonDesc(p->getTypePtr());
  528. outParam->value[p->getId()] = generateJson(p->getTypePtr());
  529. }
  530. else
  531. {
  532. intCaseValues += (intCaseValues.empty() ? "" : "<br>") + generateCase(vParamDecl[j]);
  533. intCaseParams += (intCaseParams.empty() ? "" : "|") + generateTest(vParamDecl[j]);
  534. inDesc->value[osd.str()] = generateJsonDesc(p->getTypePtr());
  535. inParam->value[p->getId()] = generateJson(vParamDecl[j]->getTypeIdPtr()->getTypePtr());
  536. }
  537. }
  538. JsonValueObjPtr p = new JsonValueObj();
  539. p->value["funinput"] = inParam;
  540. p->value["funoutput"] = outParam;
  541. p->value["descinput"] = inDesc;
  542. p->value["descoutput"] = outDesc;
  543. p->value["rettype"] = JsonOutput::writeJson(toStr(vOperation[i]->getReturnPtr()->getTypePtr()));
  544. p->value["funintpara"] = JsonOutput::writeJson(intCaseParams);
  545. p->value["funintvals"] = JsonOutput::writeJson(intCaseValues);
  546. p->value["funoutpara"] = JsonOutput::writeJson(outCaseParams);
  547. v->value[vOperation[i]->getId()] = JsonValuePtr::dynamicCast(p);
  548. }
  549. if (_baseDir.empty())
  550. {
  551. cout << TC_Json::writeValue(v) << endl;
  552. }
  553. else
  554. {
  555. string filetest = _baseDir + "/" + (outfile.empty() ? pPtr->getId() : outfile) + ".json";
  556. TC_File::makeDirRecursive(_baseDir);
  557. TC_File::save2file(filetest, TC_Json::writeValue(v));
  558. }
  559. return TC_Json::writeValue(v);
  560. }
  561. /******************************Tars2Case***************************************/
  562. void Tars2Case::generateFile(const ContextPtr &pPtr, const string& outfile) const
  563. {
  564. ostringstream s;
  565. vector<NamespacePtr> namespaces = pPtr->getNamespaces();
  566. for (size_t i = 0; i < namespaces.size(); i++)
  567. {
  568. vector<InterfacePtr> &is = namespaces[i]->getAllInterfacePtr();
  569. for (size_t j = 0; j < is.size(); j++)
  570. {
  571. if (_webCase)
  572. {
  573. // 生成TarsWeb需要的用例
  574. generateJson(is[j], outfile);
  575. }
  576. else if (_jsonCase)
  577. {
  578. generateDesc(is[j], outfile);
  579. }
  580. else
  581. {
  582. // 生成Tars压测用例的文件
  583. generateTest(is[j], outfile);
  584. }
  585. }
  586. }
  587. }
  588. void Tars2Case::createFile(const string &tarsfile, const string& outfile)
  589. {
  590. std::vector<ContextPtr> contexts = g_parse->getContexts();
  591. for (size_t i = 0; i < contexts.size(); i++)
  592. {
  593. if (tarsfile == contexts[i]->getFileName())
  594. {
  595. generateFile(contexts[i], outfile);
  596. }
  597. }
  598. }
  599. void Tars2Case::setBaseDir(const string &dir)
  600. {
  601. _baseDir = dir;
  602. }
  603. void Tars2Case::setJsonCase(bool jsonCase)
  604. {
  605. _jsonCase = jsonCase;
  606. }
  607. void Tars2Case::setWebSupport(bool webCase)
  608. {
  609. _webCase = webCase;
  610. }
  611. string Tars2Case::getFilePath(const string &ns) const
  612. {
  613. return _baseDir + "/" + ns + "/";
  614. }