extension.test.ts 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. // SPDX-License-Identifier: Apache-2.0
  2. import * as assert from 'assert';
  3. import * as vscode from 'vscode';
  4. import { getDocUri, activate, doc } from './helper';
  5. // You can import and use all API from the 'vscode' module
  6. // as well as import your extension to test it
  7. // import * as myExtension from '../../extension';
  8. suite('Extension Test Suite', function () {
  9. vscode.window.showInformationMessage('Start all tests.');
  10. this.timeout(20000);
  11. const diagnosdoc1 = getDocUri('one.sol');
  12. test('Testing for Row and Col pos.', async () => {
  13. await testdiagnos(diagnosdoc1, [
  14. {
  15. message: `unrecognised token 'aa', expected "(", ";", "="`,
  16. range: toRange(5, 0, 5, 2),
  17. severity: vscode.DiagnosticSeverity.Error,
  18. source: 'solidity',
  19. },
  20. ]);
  21. });
  22. this.timeout(20000);
  23. const diagnosdoc2 = getDocUri('two.sol');
  24. test('Testing for diagnostic errors.', async () => {
  25. await testdiagnos(diagnosdoc2, [
  26. {
  27. message:
  28. `unrecognised token '}', expected "!", "(", "+", "++", "-", "--", "[", "address", "bool", "byte", "bytes", "case", "default", "delete", "false", "function", "leave", "mapping", "new", "payable", "revert", "string", "switch", "true", "type", "~", Bytes, Int, Uint, address, hexnumber, hexstring, identifier, number, rational, string`,
  29. range: toRange(13, 1, 13, 2),
  30. severity: vscode.DiagnosticSeverity.Error,
  31. source: 'solidity',
  32. },
  33. ]);
  34. });
  35. this.timeout(20000);
  36. const diagnosdoc3 = getDocUri('three.sol');
  37. test('Testing for diagnostic info.', async () => {
  38. await testdiagnos(diagnosdoc3, []);
  39. });
  40. this.timeout(20000);
  41. const diagnosdoc4 = getDocUri('four.sol');
  42. test('Testing for diagnostics warnings.', async () => {
  43. await testdiagnos(diagnosdoc4, [
  44. {
  45. message: `function can be declared 'pure'`,
  46. range: toRange(1, 5, 1, 48),
  47. severity: vscode.DiagnosticSeverity.Warning,
  48. source: `solidity`,
  49. },
  50. {
  51. message: `function parameter 'b' is unused`,
  52. range: toRange(1, 22, 1, 23),
  53. severity: vscode.DiagnosticSeverity.Warning,
  54. source: `solidity`,
  55. },
  56. ]);
  57. });
  58. // Tests for hover.
  59. this.timeout(20000);
  60. const hoverdoc1 = getDocUri('hover1.sol');
  61. test('Testing for Hover', async () => {
  62. await testhover(hoverdoc1);
  63. });
  64. // Tests for goto-definitions.
  65. this.timeout(20000);
  66. const defdoc1 = getDocUri('defs.sol');
  67. test('Testing for GotoDefinitions', async () => {
  68. await testdefs(defdoc1);
  69. });
  70. // Tests for goto-type-definitions.
  71. this.timeout(20000);
  72. const typedefdoc1 = getDocUri('defs.sol');
  73. test('Testing for GotoTypeDefinitions', async () => {
  74. await testtypedefs(typedefdoc1);
  75. });
  76. // Tests for goto-declaration
  77. this.timeout(20000);
  78. const declsdoc1 = getDocUri('impls.sol');
  79. test('Testing for GoToDeclaration', async () => {
  80. await testdecls(declsdoc1);
  81. });
  82. // Tests for goto-impls
  83. this.timeout(20000);
  84. const implsdoc1 = getDocUri('impls.sol');
  85. test('Testing for GotoImplementations', async () => {
  86. await testimpls(implsdoc1);
  87. });
  88. // Tests for goto-references
  89. this.timeout(20000);
  90. const refsdoc1 = getDocUri('defs.sol');
  91. test('Testing for GotoReferences', async () => {
  92. await testrefs(refsdoc1);
  93. });
  94. // Tests for rename
  95. this.timeout(20000);
  96. const renamedoc1 = getDocUri('rename.sol');
  97. test('Testing for Rename', async () => {
  98. await testrename(renamedoc1);
  99. });
  100. // Tests for formatting
  101. this.timeout(20000);
  102. const formatdoc1 = getDocUri('format.sol');
  103. test('Testing for Formatting', async () => {
  104. await testformat(formatdoc1);
  105. });
  106. // Tests for completion suggestions
  107. this.timeout(20000);
  108. const compldoc1 = getDocUri('completion.sol');
  109. test('Testing for Completion', async () => {
  110. await testcompletion(compldoc1);
  111. });
  112. });
  113. function toRange(lineno1: number, charno1: number, lineno2: number, charno2: number) {
  114. const start = new vscode.Position(lineno1, charno1);
  115. const end = new vscode.Position(lineno2, charno2);
  116. return new vscode.Range(start, end);
  117. }
  118. async function testdefs(docUri: vscode.Uri) {
  119. await activate(docUri);
  120. const pos1 = new vscode.Position(38, 16);
  121. const actualdef1 = (await vscode.commands.executeCommand(
  122. 'vscode.executeDefinitionProvider',
  123. docUri,
  124. pos1
  125. )) as vscode.Location[];
  126. const loc1 = actualdef1[0];
  127. assert.strictEqual(loc1.range.start.line, 27);
  128. assert.strictEqual(loc1.range.start.character, 24);
  129. assert.strictEqual(loc1.range.end.line, 27);
  130. assert.strictEqual(loc1.range.end.character, 25);
  131. assert.strictEqual(loc1.uri.path, docUri.path);
  132. const pos2 = new vscode.Position(33, 18);
  133. const actualdef2 = (await vscode.commands.executeCommand(
  134. 'vscode.executeDefinitionProvider',
  135. docUri,
  136. pos2
  137. )) as vscode.Location[];
  138. const loc2 = actualdef2[0];
  139. assert.strictEqual(loc2.range.start.line, 27);
  140. assert.strictEqual(loc2.range.start.character, 50);
  141. assert.strictEqual(loc2.range.end.line, 27);
  142. assert.strictEqual(loc2.range.end.character, 55);
  143. assert.strictEqual(loc2.uri.path, docUri.path);
  144. const pos3 = new vscode.Position(32, 31);
  145. const actualdef3 = (await vscode.commands.executeCommand(
  146. 'vscode.executeDefinitionProvider',
  147. docUri,
  148. pos3
  149. )) as vscode.Location[];
  150. const loc3 = actualdef3[0];
  151. assert.strictEqual(loc3.range.start.line, 19);
  152. assert.strictEqual(loc3.range.start.character, 8);
  153. assert.strictEqual(loc3.range.end.line, 19);
  154. assert.strictEqual(loc3.range.end.character, 12);
  155. assert.strictEqual(loc3.uri.path, docUri.path);
  156. const pos4 = new vscode.Position(29, 18);
  157. const actualdef4 = (await vscode.commands.executeCommand(
  158. 'vscode.executeDefinitionProvider',
  159. docUri,
  160. pos4
  161. )) as vscode.Location[];
  162. const loc4 = actualdef4[0];
  163. assert.strictEqual(loc4.range.start.line, 23);
  164. assert.strictEqual(loc4.range.start.character, 14);
  165. assert.strictEqual(loc4.range.end.line, 23);
  166. assert.strictEqual(loc4.range.end.character, 15);
  167. assert.strictEqual(loc4.uri.path, docUri.path);
  168. const pos5 = new vscode.Position(28, 14);
  169. const actualdef5 = (await vscode.commands.executeCommand(
  170. 'vscode.executeDefinitionProvider',
  171. docUri,
  172. pos5
  173. )) as vscode.Location[];
  174. const loc5 = actualdef5[0];
  175. assert.strictEqual(loc5.range.start.line, 24);
  176. assert.strictEqual(loc5.range.start.character, 13);
  177. assert.strictEqual(loc5.range.end.line, 24);
  178. assert.strictEqual(loc5.range.end.character, 14);
  179. assert.strictEqual(loc5.uri.path, docUri.path);
  180. }
  181. async function testtypedefs(docUri: vscode.Uri) {
  182. await activate(docUri);
  183. const pos0 = new vscode.Position(28, 12);
  184. const actualtypedef0 = (await vscode.commands.executeCommand(
  185. 'vscode.executeTypeDefinitionProvider',
  186. docUri,
  187. pos0,
  188. )) as vscode.Location[];
  189. const loc0 = actualtypedef0[0];
  190. assert.strictEqual(loc0.range.start.line, 22);
  191. assert.strictEqual(loc0.range.start.character, 11);
  192. assert.strictEqual(loc0.range.end.line, 22);
  193. assert.strictEqual(loc0.range.end.character, 15);
  194. assert.strictEqual(loc0.uri.path, docUri.path);
  195. const pos1 = new vscode.Position(32, 18);
  196. const actualtypedef1 = (await vscode.commands.executeCommand(
  197. 'vscode.executeTypeDefinitionProvider',
  198. docUri,
  199. pos1,
  200. )) as vscode.Location[];
  201. const loc1 = actualtypedef1[0];
  202. assert.strictEqual(loc1.range.start.line, 7);
  203. assert.strictEqual(loc1.range.start.character, 9);
  204. assert.strictEqual(loc1.range.end.line, 7);
  205. assert.strictEqual(loc1.range.end.character, 14);
  206. assert.strictEqual(loc1.uri.path, docUri.path);
  207. }
  208. async function testdecls(docUri: vscode.Uri) {
  209. await activate(docUri);
  210. const pos0 = new vscode.Position(6, 14);
  211. const actualdecl0 = (await vscode.commands.executeCommand(
  212. 'vscode.executeDeclarationProvider',
  213. docUri,
  214. pos0,
  215. )) as vscode.Location[];
  216. assert.strictEqual(actualdecl0.length, 2);
  217. const loc00 = actualdecl0[0];
  218. assert.strictEqual(loc00.range.start.line, 12);
  219. assert.strictEqual(loc00.range.start.character, 13);
  220. assert.strictEqual(loc00.range.end.line, 12);
  221. assert.strictEqual(loc00.range.end.character, 16);
  222. assert.strictEqual(loc00.uri.path, docUri.path);
  223. const loc01 = actualdecl0[1];
  224. assert.strictEqual(loc01.range.start.line, 22);
  225. assert.strictEqual(loc01.range.start.character, 13);
  226. assert.strictEqual(loc01.range.end.line, 22);
  227. assert.strictEqual(loc01.range.end.character, 16);
  228. assert.strictEqual(loc01.uri.path, docUri.path);
  229. const pos1 = new vscode.Position(12, 14);
  230. const actualdecl1 = (await vscode.commands.executeCommand(
  231. 'vscode.executeDeclarationProvider',
  232. docUri,
  233. pos1,
  234. )) as vscode.Location[];
  235. assert.strictEqual(actualdecl1.length, 1);
  236. const loc10 = actualdecl1[0];
  237. assert.strictEqual(loc10.range.start.line, 32);
  238. assert.strictEqual(loc10.range.start.character, 13);
  239. assert.strictEqual(loc10.range.end.line, 32);
  240. assert.strictEqual(loc10.range.end.character, 16);
  241. assert.strictEqual(loc10.uri.path, docUri.path);
  242. const pos2 = new vscode.Position(22, 14);
  243. const actualdecl2 = (await vscode.commands.executeCommand(
  244. 'vscode.executeDeclarationProvider',
  245. docUri,
  246. pos2,
  247. )) as vscode.Location[];
  248. assert.strictEqual(actualdecl2.length, 1);
  249. const loc20 = actualdecl2[0];
  250. assert.strictEqual(loc20.range.start.line, 32);
  251. assert.strictEqual(loc20.range.start.character, 13);
  252. assert.strictEqual(loc20.range.end.line, 32);
  253. assert.strictEqual(loc20.range.end.character, 16);
  254. assert.strictEqual(loc20.uri.path, docUri.path);
  255. }
  256. async function testimpls(docUri: vscode.Uri) {
  257. await activate(docUri);
  258. const pos0 = new vscode.Position(0, 9);
  259. const actualimpl0 = (await vscode.commands.executeCommand(
  260. 'vscode.executeImplementationProvider',
  261. docUri,
  262. pos0,
  263. )) as vscode.Location[];
  264. assert.strictEqual(actualimpl0.length, 2);
  265. const loc00 = actualimpl0[0];
  266. assert.strictEqual(loc00.range.start.line, 1);
  267. assert.strictEqual(loc00.range.start.character, 13);
  268. assert.strictEqual(loc00.range.end.line, 1);
  269. assert.strictEqual(loc00.range.end.character, 16);
  270. assert.strictEqual(loc00.uri.path, docUri.path);
  271. const loc01 = actualimpl0[1];
  272. assert.strictEqual(loc01.range.start.line, 6);
  273. assert.strictEqual(loc01.range.start.character, 13);
  274. assert.strictEqual(loc01.range.end.line, 6);
  275. assert.strictEqual(loc01.range.end.character, 16);
  276. assert.strictEqual(loc01.uri.path, docUri.path);
  277. const pos1 = new vscode.Position(0, 14);
  278. const actualimpl1 = (await vscode.commands.executeCommand(
  279. 'vscode.executeImplementationProvider',
  280. docUri,
  281. pos1,
  282. )) as vscode.Location[];
  283. assert.strictEqual(actualimpl1.length, 2);
  284. const loc10 = actualimpl1[0];
  285. assert.strictEqual(loc10.range.start.line, 12);
  286. assert.strictEqual(loc10.range.start.character, 13);
  287. assert.strictEqual(loc10.range.end.line, 12);
  288. assert.strictEqual(loc10.range.end.character, 16);
  289. assert.strictEqual(loc10.uri.path, docUri.path);
  290. const loc11 = actualimpl1[1];
  291. assert.strictEqual(loc11.range.start.line, 16);
  292. assert.strictEqual(loc11.range.start.character, 13);
  293. assert.strictEqual(loc11.range.end.line, 16);
  294. assert.strictEqual(loc11.range.end.character, 16);
  295. assert.strictEqual(loc11.uri.path, docUri.path);
  296. const pos2 = new vscode.Position(21, 19);
  297. const actualimpl2 = (await vscode.commands.executeCommand(
  298. 'vscode.executeImplementationProvider',
  299. docUri,
  300. pos2,
  301. )) as vscode.Location[];
  302. assert.strictEqual(actualimpl2.length, 2);
  303. const loc20 = actualimpl2[0];
  304. assert.strictEqual(loc20.range.start.line, 22);
  305. assert.strictEqual(loc20.range.start.character, 13);
  306. assert.strictEqual(loc20.range.end.line, 22);
  307. assert.strictEqual(loc20.range.end.character, 16);
  308. assert.strictEqual(loc20.uri.path, docUri.path);
  309. const loc21 = actualimpl2[1];
  310. assert.strictEqual(loc21.range.start.line, 26);
  311. assert.strictEqual(loc21.range.start.character, 13);
  312. assert.strictEqual(loc21.range.end.line, 26);
  313. assert.strictEqual(loc21.range.end.character, 17);
  314. assert.strictEqual(loc21.uri.path, docUri.path);
  315. }
  316. async function testrefs(docUri: vscode.Uri) {
  317. await activate(docUri);
  318. const pos0 = new vscode.Position(27, 52);
  319. const actualref0 = (await vscode.commands.executeCommand(
  320. 'vscode.executeReferenceProvider',
  321. docUri,
  322. pos0,
  323. )) as vscode.Location[];
  324. assert.strictEqual(actualref0.length, 5);
  325. const loc00 = actualref0[0];
  326. assert.strictEqual(loc00.range.start.line, 27);
  327. assert.strictEqual(loc00.range.start.character, 50);
  328. assert.strictEqual(loc00.range.end.line, 27);
  329. assert.strictEqual(loc00.range.end.character, 55);
  330. assert.strictEqual(loc00.uri.path, docUri.path);
  331. const loc01 = actualref0[1];
  332. assert.strictEqual(loc01.range.start.line, 30);
  333. assert.strictEqual(loc01.range.start.character, 16);
  334. assert.strictEqual(loc01.range.end.line, 30);
  335. assert.strictEqual(loc01.range.end.character, 21);
  336. assert.strictEqual(loc01.uri.path, docUri.path);
  337. const loc02 = actualref0[2];
  338. assert.strictEqual(loc02.range.start.line, 33);
  339. assert.strictEqual(loc02.range.start.character, 16);
  340. assert.strictEqual(loc02.range.end.line, 33);
  341. assert.strictEqual(loc02.range.end.character, 21);
  342. assert.strictEqual(loc02.uri.path, docUri.path);
  343. const loc03 = actualref0[3];
  344. assert.strictEqual(loc03.range.start.line, 36);
  345. assert.strictEqual(loc03.range.start.character, 16);
  346. assert.strictEqual(loc03.range.end.line, 36);
  347. assert.strictEqual(loc03.range.end.character, 21);
  348. assert.strictEqual(loc03.uri.path, docUri.path);
  349. const loc04 = actualref0[4];
  350. assert.strictEqual(loc04.range.start.line, 39);
  351. assert.strictEqual(loc04.range.start.character, 16);
  352. assert.strictEqual(loc04.range.end.line, 39);
  353. assert.strictEqual(loc04.range.end.character, 21);
  354. assert.strictEqual(loc04.uri.path, docUri.path);
  355. const pos1 = new vscode.Position(28, 12);
  356. const actualref1 = (await vscode.commands.executeCommand(
  357. 'vscode.executeReferenceProvider',
  358. docUri,
  359. pos1,
  360. )) as vscode.Location[];
  361. assert.strictEqual(actualref1.length, 6);
  362. const loc10 = actualref1[0];
  363. assert.strictEqual(loc10.range.start.line, 27);
  364. assert.strictEqual(loc10.range.start.character, 24);
  365. assert.strictEqual(loc10.range.end.line, 27);
  366. assert.strictEqual(loc10.range.end.character, 25);
  367. assert.strictEqual(loc10.uri.path, docUri.path);
  368. const loc11 = actualref1[1];
  369. assert.strictEqual(loc11.range.start.line, 28);
  370. assert.strictEqual(loc11.range.start.character, 12);
  371. assert.strictEqual(loc11.range.end.line, 28);
  372. assert.strictEqual(loc11.range.end.character, 13);
  373. assert.strictEqual(loc11.uri.path, docUri.path);
  374. const loc12 = actualref1[2];
  375. assert.strictEqual(loc12.range.start.line, 29);
  376. assert.strictEqual(loc12.range.start.character, 16);
  377. assert.strictEqual(loc12.range.end.line, 29);
  378. assert.strictEqual(loc12.range.end.character, 17);
  379. assert.strictEqual(loc12.uri.path, docUri.path);
  380. const loc13 = actualref1[3];
  381. assert.strictEqual(loc13.range.start.line, 32);
  382. assert.strictEqual(loc13.range.start.character, 16);
  383. assert.strictEqual(loc13.range.end.line, 32);
  384. assert.strictEqual(loc13.range.end.character, 17);
  385. assert.strictEqual(loc13.uri.path, docUri.path);
  386. const loc14 = actualref1[4];
  387. assert.strictEqual(loc14.range.start.line, 35);
  388. assert.strictEqual(loc14.range.start.character, 16);
  389. assert.strictEqual(loc14.range.end.line, 35);
  390. assert.strictEqual(loc14.range.end.character, 17);
  391. assert.strictEqual(loc14.uri.path, docUri.path);
  392. const loc15 = actualref1[5];
  393. assert.strictEqual(loc15.range.start.line, 38);
  394. assert.strictEqual(loc15.range.start.character, 16);
  395. assert.strictEqual(loc15.range.end.line, 38);
  396. assert.strictEqual(loc15.range.end.character, 17);
  397. assert.strictEqual(loc15.uri.path, docUri.path);
  398. const pos2 = new vscode.Position(21, 6);
  399. const actualref2 = (await vscode.commands.executeCommand(
  400. 'vscode.executeReferenceProvider',
  401. docUri,
  402. pos2,
  403. )) as vscode.Location[];
  404. assert.strictEqual(actualref2.length, 0);
  405. }
  406. async function testrename(docUri: vscode.Uri) {
  407. await activate(docUri);
  408. const pos0 = new vscode.Position(9, 8);
  409. const newname0 = "changed";
  410. const rename0 = (await vscode.commands.executeCommand(
  411. 'vscode.executeDocumentRenameProvider',
  412. docUri,
  413. pos0,
  414. newname0,
  415. )) as vscode.WorkspaceEdit;
  416. assert(rename0.has(docUri));
  417. const loc0 = rename0.get(docUri);
  418. const loc00 = loc0[0] as vscode.TextEdit;
  419. assert.strictEqual(loc00.range.start.line, 0);
  420. assert.strictEqual(loc00.range.start.character, 41);
  421. assert.strictEqual(loc00.range.end.line, 0);
  422. assert.strictEqual(loc00.range.end.character, 42);
  423. assert.strictEqual(loc00.newText, newname0);
  424. const loc01 = loc0[1] as vscode.TextEdit;
  425. assert.strictEqual(loc01.range.start.line, 1);
  426. assert.strictEqual(loc01.range.start.character, 4);
  427. assert.strictEqual(loc01.range.end.line, 1);
  428. assert.strictEqual(loc01.range.end.character, 5);
  429. assert.strictEqual(loc01.newText, newname0);
  430. const loc02 = loc0[2] as vscode.TextEdit;
  431. assert.strictEqual(loc02.range.start.line, 9);
  432. assert.strictEqual(loc02.range.start.character, 8);
  433. assert.strictEqual(loc02.range.end.line, 9);
  434. assert.strictEqual(loc02.range.end.character, 9);
  435. assert.strictEqual(loc02.newText, newname0);
  436. const loc03 = loc0[3] as vscode.TextEdit;
  437. assert.strictEqual(loc03.range.start.line, 9);
  438. assert.strictEqual(loc03.range.start.character, 12);
  439. assert.strictEqual(loc03.range.end.line, 9);
  440. assert.strictEqual(loc03.range.end.character, 13);
  441. assert.strictEqual(loc03.newText, newname0);
  442. }
  443. async function testformat(docUri: vscode.Uri) {
  444. await activate(docUri);
  445. const options = {
  446. tabSize: 4,
  447. insertSpaces: false,
  448. };
  449. const textedits = (await vscode.commands.executeCommand(
  450. 'vscode.executeFormatDocumentProvider',
  451. docUri,
  452. options,
  453. )) as vscode.TextEdit[];
  454. // make sure that the input file is not already formatted
  455. assert(textedits.length > 0);
  456. // undo the changes done during the test
  457. const undochanges = async () => {
  458. for (let i = 0; i < textedits.length; i++) {
  459. await vscode.commands.executeCommand('undo');
  460. }
  461. };
  462. try {
  463. const workedits = new vscode.WorkspaceEdit();
  464. workedits.set(docUri, textedits);
  465. const done = await vscode.workspace.applyEdit(workedits);
  466. assert(done);
  467. const actualtext = doc.getText();
  468. const expectedtext = "contract deck {\n enum suit {\n club,\n diamonds,\n hearts,\n spades\n }\n enum value {\n two,\n three,\n four,\n five,\n six,\n seven,\n eight,\n nine,\n ten,\n jack,\n queen,\n king,\n ace\n }\n\n struct card {\n value v;\n suit s;\n }\n\n function score(card c) public returns (uint32 score) {\n if (c.s == suit.hearts) {\n if (c.v == value.ace) {\n score = 14;\n }\n if (c.v == value.king) {\n score = 13;\n }\n if (c.v == value.queen) {\n score = 12;\n }\n if (c.v == value.jack) {\n score = 11;\n }\n }\n // all others score 0\n }\n}\n";
  469. assert.strictEqual(actualtext, expectedtext);
  470. } catch (error) {
  471. await undochanges();
  472. throw error;
  473. }
  474. await undochanges();
  475. }
  476. async function testcompletion(docUri: vscode.Uri) {
  477. await activate(docUri);
  478. const get_labels = (list: vscode.CompletionList) => list.items.map(item => item.label);
  479. const pos0 = new vscode.Position(6, 30);
  480. const suggestions0 = (await vscode.commands.executeCommand(
  481. 'vscode.executeCompletionItemProvider',
  482. docUri,
  483. pos0
  484. )) as vscode.CompletionList;
  485. const labels0 = get_labels(suggestions0);
  486. assert.ok(labels0.includes('VAL') && labels0.includes('value') && labels0.includes('first') && !labels0.includes('second'));
  487. const pos1 = new vscode.Position(10, 30);
  488. const suggestions1 = (await vscode.commands.executeCommand(
  489. 'vscode.executeCompletionItemProvider',
  490. docUri,
  491. pos1
  492. )) as vscode.CompletionList;
  493. const labels1 = get_labels(suggestions1);
  494. labels1.includes('second');
  495. assert.ok(labels1.includes('VAL') && labels1.includes('value') && !labels1.includes('first') && labels1.includes('second'));
  496. const pos2 = new vscode.Position(11, 10);
  497. const suggestions2 = (await vscode.commands.executeCommand(
  498. 'vscode.executeCompletionItemProvider',
  499. docUri,
  500. pos2
  501. )) as vscode.CompletionList;
  502. const labels2 = get_labels(suggestions2);
  503. assert.ok(labels2.includes('VAL') && labels2.includes('value') && !labels2.includes('first') && !labels2.includes('second'));
  504. const pos3 = new vscode.Position(14, 28);
  505. const suggestions3 = (await vscode.commands.executeCommand(
  506. 'vscode.executeCompletionItemProvider',
  507. docUri,
  508. pos3,
  509. '.'
  510. )) as vscode.CompletionList;
  511. const labels3 = get_labels(suggestions3);
  512. assert.ok(labels3.includes('field1') && labels3.includes('field2') && !labels3.includes('value') && !labels3.includes('first') && !labels3.includes('second') && !labels3.includes('VAL'));
  513. const pos4 = new vscode.Position(18, 36);
  514. const suggestions4 = (await vscode.commands.executeCommand(
  515. 'vscode.executeCompletionItemProvider',
  516. docUri,
  517. pos4,
  518. '.'
  519. )) as vscode.CompletionList;
  520. const labels4 = get_labels(suggestions4);
  521. assert.ok(labels4.includes('aaa') && labels4.includes('bbbb') && !labels4.includes('field1') && !labels4.includes('field2') && !labels4.includes('value') && !labels4.includes('first') && !labels4.includes('second') && !labels4.includes('VAL'));
  522. }
  523. async function testhover(docUri: vscode.Uri) {
  524. await activate(docUri);
  525. const pos1 = new vscode.Position(74, 14);
  526. const actualhover = (await vscode.commands.executeCommand(
  527. 'vscode.executeHoverProvider',
  528. docUri,
  529. pos1
  530. )) as vscode.Hover[];
  531. const contentarr1 = actualhover[0].contents as vscode.MarkdownString[];
  532. assert.strictEqual(contentarr1[0].value, '```solidity\nmapping(address => uint256) storage SimpleAuction.pendingReturns\n```');
  533. const pos2 = new vscode.Position(78, 19);
  534. const actualhover2 = (await vscode.commands.executeCommand(
  535. 'vscode.executeHoverProvider',
  536. docUri,
  537. pos2
  538. )) as vscode.Hover[];
  539. const contentarr2 = actualhover2[0].contents as vscode.MarkdownString[];
  540. assert.strictEqual(
  541. contentarr2[0].value,
  542. '```solidity\nevent SimpleAuction.HighestBidIncreased {\n\taddress bidder,\n\tuint256 amount\n}\n```'
  543. );
  544. const pos3 = new vscode.Position(53, 13);
  545. const actualhover3 = (await vscode.commands.executeCommand(
  546. 'vscode.executeHoverProvider',
  547. docUri,
  548. pos3
  549. )) as vscode.Hover[];
  550. const contentarr3 = actualhover3[0].contents as vscode.MarkdownString[];
  551. assert.strictEqual(contentarr3[0].value, 'Abort execution if argument evaulates to false\n\n```solidity\n[built-in] void require (bool)\n```');
  552. const pos4 = new vscode.Position(32, 13);
  553. const actualhover4 = (await vscode.commands.executeCommand(
  554. 'vscode.executeHoverProvider',
  555. docUri,
  556. pos4
  557. )) as vscode.Hover[];
  558. assert.strictEqual(actualhover4.length, 0);
  559. const pos5 = new vscode.Position(134, 73);
  560. const actualhover5 = (await vscode.commands.executeCommand(
  561. 'vscode.executeHoverProvider',
  562. docUri,
  563. pos5
  564. )) as vscode.Hover[];
  565. const contentarr5 = actualhover5[0].contents as vscode.MarkdownString[];
  566. assert.strictEqual(contentarr5[0].value, '```solidity\nfunction foo.sum(uint64 a, uint64 b) returns (uint64)\n\n```');
  567. }
  568. async function testdiagnos(docUri: vscode.Uri, expecteddiag: vscode.Diagnostic[]) {
  569. await activate(docUri);
  570. const actualDiagnostics = vscode.languages.getDiagnostics(docUri);
  571. if (actualDiagnostics) {
  572. expecteddiag.forEach((expectedDiagnostic, i) => {
  573. const actualDiagnostic = actualDiagnostics[i];
  574. assert.strictEqual(actualDiagnostic.message, expectedDiagnostic.message);
  575. assert.deepStrictEqual(actualDiagnostic.range, expectedDiagnostic.range);
  576. assert.strictEqual(actualDiagnostic.severity, expectedDiagnostic.severity);
  577. });
  578. } else {
  579. console.error('the diagnostics are incorrect', actualDiagnostics);
  580. }
  581. }