text-editor-registry-spec.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  1. const TextEditorRegistry = require('../src/text-editor-registry');
  2. const TextEditor = require('../src/text-editor');
  3. const TextBuffer = require('text-buffer');
  4. const { Point, Range } = TextBuffer;
  5. const dedent = require('dedent');
  6. const NullGrammar = require('../src/null-grammar');
  7. function setupLanguageMode (editor) {
  8. let languageMode = editor.getBuffer().getLanguageMode();
  9. languageMode.useAsyncParsing = false;
  10. languageMode.useAsyncIndent = false;
  11. return languageMode;
  12. }
  13. describe('TextEditorRegistry', function() {
  14. let registry, editor, initialPackageActivation;
  15. beforeEach(function() {
  16. initialPackageActivation = Promise.resolve();
  17. registry = new TextEditorRegistry({
  18. assert: atom.assert,
  19. config: atom.config,
  20. grammarRegistry: atom.grammars,
  21. packageManager: {
  22. getActivatePromise() {
  23. return initialPackageActivation;
  24. }
  25. }
  26. });
  27. editor = new TextEditor({ autoHeight: false });
  28. expect(
  29. atom.grammars.assignLanguageMode(editor, 'text.plain.null-grammar')
  30. ).toBe(true);
  31. });
  32. afterEach(function() {
  33. registry.destroy();
  34. });
  35. describe('.add', function() {
  36. it('adds an editor to the list of registered editors', function() {
  37. registry.add(editor);
  38. expect(editor.registered).toBe(true);
  39. expect(registry.editors.size).toBe(1);
  40. expect(registry.editors.has(editor)).toBe(true);
  41. });
  42. it('returns a Disposable that can unregister the editor', function() {
  43. const disposable = registry.add(editor);
  44. expect(registry.editors.size).toBe(1);
  45. disposable.dispose();
  46. expect(registry.editors.size).toBe(0);
  47. expect(editor.registered).toBe(false);
  48. expect(retainedEditorCount(registry)).toBe(0);
  49. });
  50. });
  51. describe('.observe', function() {
  52. it('calls the callback for current and future editors until unsubscribed', function() {
  53. const spy = jasmine.createSpy();
  54. const [editor1, editor2, editor3] = [{}, {}, {}];
  55. registry.add(editor1);
  56. const subscription = registry.observe(spy);
  57. expect(spy.calls.length).toBe(1);
  58. registry.add(editor2);
  59. expect(spy.calls.length).toBe(2);
  60. expect(spy.argsForCall[0][0]).toBe(editor1);
  61. expect(spy.argsForCall[1][0]).toBe(editor2);
  62. subscription.dispose();
  63. registry.add(editor3);
  64. expect(spy.calls.length).toBe(2);
  65. });
  66. });
  67. describe('.build', function() {
  68. it('constructs a TextEditor with the right parameters based on its path and text', function() {
  69. atom.config.set('editor.tabLength', 8, { scope: '.source.js' });
  70. const languageMode = {
  71. grammar: NullGrammar,
  72. onDidChangeHighlighting: jasmine.createSpy()
  73. };
  74. const buffer = new TextBuffer({ filePath: 'test.js' });
  75. buffer.setLanguageMode(languageMode);
  76. const editor = registry.build({
  77. buffer
  78. });
  79. expect(editor.getTabLength()).toBe(8);
  80. expect(editor.getGrammar()).toEqual(NullGrammar);
  81. expect(languageMode.onDidChangeHighlighting.calls.length).toBe(1);
  82. });
  83. });
  84. describe('.getActiveTextEditor', function() {
  85. it('gets the currently focused text editor', function() {
  86. const disposable = registry.add(editor);
  87. var editorElement = editor.getElement();
  88. jasmine.attachToDOM(editorElement);
  89. editorElement.focus();
  90. expect(registry.getActiveTextEditor()).toBe(editor);
  91. disposable.dispose();
  92. });
  93. });
  94. describe('.maintainConfig(editor)', function() {
  95. it('does not update the editor when config settings change for unrelated scope selectors', async function() {
  96. await atom.packages.activatePackage('language-javascript');
  97. const editor2 = new TextEditor();
  98. atom.grammars.assignLanguageMode(editor2, 'source.js');
  99. registry.maintainConfig(editor);
  100. registry.maintainConfig(editor2);
  101. await initialPackageActivation;
  102. expect(editor.getRootScopeDescriptor().getScopesArray()).toEqual([
  103. 'text.plain.null-grammar'
  104. ]);
  105. expect(editor2.getRootScopeDescriptor().getScopesArray()).toEqual([
  106. 'source.js'
  107. ]);
  108. expect(editor.getEncoding()).toBe('utf8');
  109. expect(editor2.getEncoding()).toBe('utf8');
  110. atom.config.set('core.fileEncoding', 'utf16le', {
  111. scopeSelector: '.text.plain.null-grammar'
  112. });
  113. atom.config.set('core.fileEncoding', 'utf16be', {
  114. scopeSelector: '.source.js'
  115. });
  116. expect(editor.getEncoding()).toBe('utf16le');
  117. expect(editor2.getEncoding()).toBe('utf16be');
  118. });
  119. it('does not update the editor before the initial packages have loaded', async function() {
  120. let resolveActivatePromise;
  121. initialPackageActivation = new Promise(resolve => {
  122. resolveActivatePromise = resolve;
  123. });
  124. atom.config.set('core.fileEncoding', 'utf16le');
  125. registry.maintainConfig(editor);
  126. await Promise.resolve();
  127. expect(editor.getEncoding()).toBe('utf8');
  128. atom.config.set('core.fileEncoding', 'utf16be');
  129. await Promise.resolve();
  130. expect(editor.getEncoding()).toBe('utf8');
  131. resolveActivatePromise();
  132. await initialPackageActivation;
  133. expect(editor.getEncoding()).toBe('utf16be');
  134. });
  135. it("updates the editor's settings when its grammar changes", async function() {
  136. await atom.packages.activatePackage('language-javascript');
  137. registry.maintainConfig(editor);
  138. await initialPackageActivation;
  139. atom.config.set('core.fileEncoding', 'utf16be', {
  140. scopeSelector: '.source.js'
  141. });
  142. expect(editor.getEncoding()).toBe('utf8');
  143. atom.config.set('core.fileEncoding', 'utf16le', {
  144. scopeSelector: '.source.js'
  145. });
  146. expect(editor.getEncoding()).toBe('utf8');
  147. atom.grammars.assignLanguageMode(editor, 'source.js');
  148. await initialPackageActivation;
  149. expect(editor.getEncoding()).toBe('utf16le');
  150. atom.config.set('core.fileEncoding', 'utf16be', {
  151. scopeSelector: '.source.js'
  152. });
  153. expect(editor.getEncoding()).toBe('utf16be');
  154. atom.grammars.assignLanguageMode(editor, 'text.plain.null-grammar');
  155. await initialPackageActivation;
  156. expect(editor.getEncoding()).toBe('utf8');
  157. });
  158. it("preserves editor settings that haven't changed between previous and current language modes", async function() {
  159. await atom.packages.activatePackage('language-javascript');
  160. registry.maintainConfig(editor);
  161. await initialPackageActivation;
  162. expect(editor.getEncoding()).toBe('utf8');
  163. editor.setEncoding('utf16le');
  164. expect(editor.getEncoding()).toBe('utf16le');
  165. expect(editor.isSoftWrapped()).toBe(false);
  166. editor.setSoftWrapped(true);
  167. expect(editor.isSoftWrapped()).toBe(true);
  168. atom.grammars.assignLanguageMode(editor, 'source.js');
  169. await initialPackageActivation;
  170. expect(editor.getEncoding()).toBe('utf16le');
  171. expect(editor.isSoftWrapped()).toBe(true);
  172. });
  173. it('updates editor settings that have changed between previous and current language modes', async function() {
  174. await atom.packages.activatePackage('language-javascript');
  175. registry.maintainConfig(editor);
  176. await initialPackageActivation;
  177. expect(editor.getEncoding()).toBe('utf8');
  178. atom.config.set('core.fileEncoding', 'utf16be', {
  179. scopeSelector: '.text.plain.null-grammar'
  180. });
  181. atom.config.set('core.fileEncoding', 'utf16le', {
  182. scopeSelector: '.source.js'
  183. });
  184. expect(editor.getEncoding()).toBe('utf16be');
  185. editor.setEncoding('utf8');
  186. expect(editor.getEncoding()).toBe('utf8');
  187. atom.grammars.assignLanguageMode(editor, 'source.js');
  188. await initialPackageActivation;
  189. expect(editor.getEncoding()).toBe('utf16le');
  190. });
  191. it("returns a disposable that can be used to stop the registry from updating the editor's config", async function() {
  192. await atom.packages.activatePackage('language-javascript');
  193. const previousSubscriptionCount = getSubscriptionCount(editor);
  194. const disposable = registry.maintainConfig(editor);
  195. await initialPackageActivation;
  196. expect(getSubscriptionCount(editor)).toBeGreaterThan(
  197. previousSubscriptionCount
  198. );
  199. expect(registry.editorsWithMaintainedConfig.size).toBe(1);
  200. atom.config.set('core.fileEncoding', 'utf16be');
  201. expect(editor.getEncoding()).toBe('utf16be');
  202. atom.config.set('core.fileEncoding', 'utf8');
  203. expect(editor.getEncoding()).toBe('utf8');
  204. disposable.dispose();
  205. atom.config.set('core.fileEncoding', 'utf16be');
  206. expect(editor.getEncoding()).toBe('utf8');
  207. expect(getSubscriptionCount(editor)).toBe(previousSubscriptionCount);
  208. expect(retainedEditorCount(registry)).toBe(0);
  209. });
  210. it('sets the encoding based on the config', async function() {
  211. editor.update({ encoding: 'utf8' });
  212. expect(editor.getEncoding()).toBe('utf8');
  213. atom.config.set('core.fileEncoding', 'utf16le');
  214. registry.maintainConfig(editor);
  215. await initialPackageActivation;
  216. expect(editor.getEncoding()).toBe('utf16le');
  217. atom.config.set('core.fileEncoding', 'utf8');
  218. expect(editor.getEncoding()).toBe('utf8');
  219. });
  220. it('sets the tab length based on the config', async function() {
  221. editor.update({ tabLength: 4 });
  222. expect(editor.getTabLength()).toBe(4);
  223. atom.config.set('editor.tabLength', 8);
  224. registry.maintainConfig(editor);
  225. await initialPackageActivation;
  226. expect(editor.getTabLength()).toBe(8);
  227. atom.config.set('editor.tabLength', 4);
  228. expect(editor.getTabLength()).toBe(4);
  229. });
  230. it('enables soft tabs when the tabType config setting is "soft"', async function() {
  231. atom.config.set('editor.tabType', 'soft');
  232. registry.maintainConfig(editor);
  233. await initialPackageActivation;
  234. expect(editor.getSoftTabs()).toBe(true);
  235. });
  236. it('disables soft tabs when the tabType config setting is "hard"', async function() {
  237. atom.config.set('editor.tabType', 'hard');
  238. registry.maintainConfig(editor);
  239. await initialPackageActivation;
  240. expect(editor.getSoftTabs()).toBe(false);
  241. });
  242. describe('when the "tabType" config setting is "auto"', function() {
  243. it("enables or disables soft tabs based on the editor's content", async function() {
  244. await initialPackageActivation;
  245. await atom.packages.activatePackage('language-javascript');
  246. atom.grammars.assignLanguageMode(editor, 'source.js');
  247. let languageMode = setupLanguageMode(editor);
  248. atom.config.set('editor.tabType', 'auto');
  249. await initialPackageActivation;
  250. await languageMode.ready;
  251. editor.setText(dedent`
  252. {
  253. hello;
  254. }
  255. `);
  256. let disposable = registry.maintainConfig(editor);
  257. expect(editor.getSoftTabs()).toBe(true);
  258. /* eslint-disable no-tabs */
  259. editor.setText(dedent`
  260. {
  261. hello;
  262. }
  263. `);
  264. /* eslint-enable no-tabs */
  265. disposable.dispose();
  266. disposable = registry.maintainConfig(editor);
  267. expect(editor.getSoftTabs()).toBe(false);
  268. editor.setTextInBufferRange(
  269. new Range(Point.ZERO, Point.ZERO),
  270. dedent`
  271. /*
  272. * Comment with a leading space.
  273. */
  274. ` + '\n'
  275. );
  276. disposable.dispose();
  277. disposable = registry.maintainConfig(editor);
  278. expect(editor.getSoftTabs()).toBe(false);
  279. /* eslint-disable no-tabs */
  280. editor.setText(dedent`
  281. /*
  282. * Comment with a leading space.
  283. */
  284. {
  285. hello;
  286. }
  287. `);
  288. /* eslint-enable no-tabs */
  289. disposable.dispose();
  290. disposable = registry.maintainConfig(editor);
  291. expect(editor.getSoftTabs()).toBe(false);
  292. editor.setText(dedent`
  293. /*
  294. * Comment with a leading space.
  295. */
  296. {
  297. hello;
  298. }
  299. `);
  300. disposable.dispose();
  301. disposable = registry.maintainConfig(editor);
  302. expect(editor.getSoftTabs()).toBe(true);
  303. });
  304. });
  305. describe('when the "tabType" config setting is "auto"', function() {
  306. it('enables or disables soft tabs based on the "softTabs" config setting', async function() {
  307. registry.maintainConfig(editor);
  308. await initialPackageActivation;
  309. editor.setText('abc\ndef');
  310. atom.config.set('editor.softTabs', true);
  311. atom.config.set('editor.tabType', 'auto');
  312. expect(editor.getSoftTabs()).toBe(true);
  313. atom.config.set('editor.softTabs', false);
  314. expect(editor.getSoftTabs()).toBe(false);
  315. });
  316. });
  317. it('enables or disables soft tabs based on the config', async function() {
  318. editor.update({ softTabs: true });
  319. expect(editor.getSoftTabs()).toBe(true);
  320. atom.config.set('editor.tabType', 'hard');
  321. registry.maintainConfig(editor);
  322. await initialPackageActivation;
  323. expect(editor.getSoftTabs()).toBe(false);
  324. atom.config.set('editor.tabType', 'soft');
  325. expect(editor.getSoftTabs()).toBe(true);
  326. atom.config.set('editor.tabType', 'auto');
  327. atom.config.set('editor.softTabs', true);
  328. expect(editor.getSoftTabs()).toBe(true);
  329. });
  330. it('enables or disables atomic soft tabs based on the config', async function() {
  331. editor.update({ atomicSoftTabs: true });
  332. expect(editor.hasAtomicSoftTabs()).toBe(true);
  333. atom.config.set('editor.atomicSoftTabs', false);
  334. registry.maintainConfig(editor);
  335. await initialPackageActivation;
  336. expect(editor.hasAtomicSoftTabs()).toBe(false);
  337. atom.config.set('editor.atomicSoftTabs', true);
  338. expect(editor.hasAtomicSoftTabs()).toBe(true);
  339. });
  340. it('enables or disables cursor on selection visibility based on the config', async function() {
  341. editor.update({ showCursorOnSelection: true });
  342. expect(editor.getShowCursorOnSelection()).toBe(true);
  343. atom.config.set('editor.showCursorOnSelection', false);
  344. registry.maintainConfig(editor);
  345. await initialPackageActivation;
  346. expect(editor.getShowCursorOnSelection()).toBe(false);
  347. atom.config.set('editor.showCursorOnSelection', true);
  348. expect(editor.getShowCursorOnSelection()).toBe(true);
  349. });
  350. it('enables or disables line numbers based on the config', async function() {
  351. editor.update({ showLineNumbers: true });
  352. expect(editor.showLineNumbers).toBe(true);
  353. atom.config.set('editor.showLineNumbers', false);
  354. registry.maintainConfig(editor);
  355. await initialPackageActivation;
  356. expect(editor.showLineNumbers).toBe(false);
  357. atom.config.set('editor.showLineNumbers', true);
  358. expect(editor.showLineNumbers).toBe(true);
  359. });
  360. it('sets the invisibles based on the config', async function() {
  361. const invisibles1 = { tab: 'a', cr: false, eol: false, space: false };
  362. const invisibles2 = { tab: 'b', cr: false, eol: false, space: false };
  363. editor.update({
  364. showInvisibles: true,
  365. invisibles: invisibles1
  366. });
  367. expect(editor.getInvisibles()).toEqual(invisibles1);
  368. atom.config.set('editor.showInvisibles', true);
  369. atom.config.set('editor.invisibles', invisibles2);
  370. registry.maintainConfig(editor);
  371. await initialPackageActivation;
  372. expect(editor.getInvisibles()).toEqual(invisibles2);
  373. atom.config.set('editor.invisibles', invisibles1);
  374. expect(editor.getInvisibles()).toEqual(invisibles1);
  375. atom.config.set('editor.showInvisibles', false);
  376. expect(editor.getInvisibles()).toEqual({});
  377. });
  378. it('enables or disables the indent guide based on the config', async function() {
  379. editor.update({ showIndentGuide: true });
  380. expect(editor.doesShowIndentGuide()).toBe(true);
  381. atom.config.set('editor.showIndentGuide', false);
  382. registry.maintainConfig(editor);
  383. await initialPackageActivation;
  384. expect(editor.doesShowIndentGuide()).toBe(false);
  385. atom.config.set('editor.showIndentGuide', true);
  386. expect(editor.doesShowIndentGuide()).toBe(true);
  387. });
  388. it('enables or disables soft wrap based on the config', async function() {
  389. editor.update({ softWrapped: true });
  390. expect(editor.isSoftWrapped()).toBe(true);
  391. atom.config.set('editor.softWrap', false);
  392. registry.maintainConfig(editor);
  393. await initialPackageActivation;
  394. expect(editor.isSoftWrapped()).toBe(false);
  395. atom.config.set('editor.softWrap', true);
  396. expect(editor.isSoftWrapped()).toBe(true);
  397. });
  398. it('sets the soft wrap indent length based on the config', async function() {
  399. editor.update({ softWrapHangingIndentLength: 4 });
  400. expect(editor.getSoftWrapHangingIndentLength()).toBe(4);
  401. atom.config.set('editor.softWrapHangingIndent', 2);
  402. registry.maintainConfig(editor);
  403. await initialPackageActivation;
  404. expect(editor.getSoftWrapHangingIndentLength()).toBe(2);
  405. atom.config.set('editor.softWrapHangingIndent', 4);
  406. expect(editor.getSoftWrapHangingIndentLength()).toBe(4);
  407. });
  408. it('enables or disables preferred line length-based soft wrap based on the config', async function() {
  409. editor.update({
  410. softWrapped: true,
  411. preferredLineLength: 80,
  412. editorWidthInChars: 120,
  413. softWrapAtPreferredLineLength: true
  414. });
  415. expect(editor.getSoftWrapColumn()).toBe(80);
  416. atom.config.set('editor.softWrap', true);
  417. atom.config.set('editor.softWrapAtPreferredLineLength', false);
  418. registry.maintainConfig(editor);
  419. await initialPackageActivation;
  420. expect(editor.getSoftWrapColumn()).toBe(120);
  421. atom.config.set('editor.softWrapAtPreferredLineLength', true);
  422. expect(editor.getSoftWrapColumn()).toBe(80);
  423. });
  424. it('allows for custom definition of maximum soft wrap based on config', async function() {
  425. editor.update({
  426. softWrapped: false,
  427. maxScreenLineLength: 1500
  428. });
  429. expect(editor.getSoftWrapColumn()).toBe(1500);
  430. atom.config.set('editor.softWrap', false);
  431. atom.config.set('editor.maxScreenLineLength', 500);
  432. registry.maintainConfig(editor);
  433. await initialPackageActivation;
  434. expect(editor.getSoftWrapColumn()).toBe(500);
  435. });
  436. it('sets the preferred line length based on the config', async function() {
  437. editor.update({ preferredLineLength: 80 });
  438. expect(editor.getPreferredLineLength()).toBe(80);
  439. atom.config.set('editor.preferredLineLength', 110);
  440. registry.maintainConfig(editor);
  441. await initialPackageActivation;
  442. expect(editor.getPreferredLineLength()).toBe(110);
  443. atom.config.set('editor.preferredLineLength', 80);
  444. expect(editor.getPreferredLineLength()).toBe(80);
  445. });
  446. it('enables or disables auto-indent based on the config', async function() {
  447. editor.update({ autoIndent: true });
  448. expect(editor.shouldAutoIndent()).toBe(true);
  449. atom.config.set('editor.autoIndent', false);
  450. registry.maintainConfig(editor);
  451. await initialPackageActivation;
  452. expect(editor.shouldAutoIndent()).toBe(false);
  453. atom.config.set('editor.autoIndent', true);
  454. expect(editor.shouldAutoIndent()).toBe(true);
  455. });
  456. it('enables or disables auto-indent-on-paste based on the config', async function() {
  457. editor.update({ autoIndentOnPaste: true });
  458. expect(editor.shouldAutoIndentOnPaste()).toBe(true);
  459. atom.config.set('editor.autoIndentOnPaste', false);
  460. registry.maintainConfig(editor);
  461. await initialPackageActivation;
  462. expect(editor.shouldAutoIndentOnPaste()).toBe(false);
  463. atom.config.set('editor.autoIndentOnPaste', true);
  464. expect(editor.shouldAutoIndentOnPaste()).toBe(true);
  465. });
  466. it('enables or disables scrolling past the end of the buffer based on the config', async function() {
  467. editor.update({ scrollPastEnd: true });
  468. expect(editor.getScrollPastEnd()).toBe(true);
  469. atom.config.set('editor.scrollPastEnd', false);
  470. registry.maintainConfig(editor);
  471. await initialPackageActivation;
  472. expect(editor.getScrollPastEnd()).toBe(false);
  473. atom.config.set('editor.scrollPastEnd', true);
  474. expect(editor.getScrollPastEnd()).toBe(true);
  475. });
  476. it('sets the undo grouping interval based on the config', async function() {
  477. editor.update({ undoGroupingInterval: 300 });
  478. expect(editor.getUndoGroupingInterval()).toBe(300);
  479. atom.config.set('editor.undoGroupingInterval', 600);
  480. registry.maintainConfig(editor);
  481. await initialPackageActivation;
  482. expect(editor.getUndoGroupingInterval()).toBe(600);
  483. atom.config.set('editor.undoGroupingInterval', 300);
  484. expect(editor.getUndoGroupingInterval()).toBe(300);
  485. });
  486. it('sets the scroll sensitivity based on the config', async function() {
  487. editor.update({ scrollSensitivity: 50 });
  488. expect(editor.getScrollSensitivity()).toBe(50);
  489. atom.config.set('editor.scrollSensitivity', 60);
  490. registry.maintainConfig(editor);
  491. await initialPackageActivation;
  492. expect(editor.getScrollSensitivity()).toBe(60);
  493. atom.config.set('editor.scrollSensitivity', 70);
  494. expect(editor.getScrollSensitivity()).toBe(70);
  495. });
  496. describe('when called twice with a given editor', function() {
  497. it('does nothing the second time', async function() {
  498. editor.update({ scrollSensitivity: 50 });
  499. const disposable1 = registry.maintainConfig(editor);
  500. const disposable2 = registry.maintainConfig(editor);
  501. await initialPackageActivation;
  502. atom.config.set('editor.scrollSensitivity', 60);
  503. expect(editor.getScrollSensitivity()).toBe(60);
  504. disposable2.dispose();
  505. atom.config.set('editor.scrollSensitivity', 70);
  506. expect(editor.getScrollSensitivity()).toBe(70);
  507. disposable1.dispose();
  508. atom.config.set('editor.scrollSensitivity', 80);
  509. expect(editor.getScrollSensitivity()).toBe(70);
  510. });
  511. });
  512. });
  513. });
  514. function getSubscriptionCount(editor) {
  515. return (
  516. editor.emitter.getTotalListenerCount() +
  517. editor.tokenizedBuffer.emitter.getTotalListenerCount() +
  518. editor.buffer.emitter.getTotalListenerCount() +
  519. editor.displayLayer.emitter.getTotalListenerCount()
  520. );
  521. }
  522. function retainedEditorCount(registry) {
  523. const editors = new Set();
  524. registry.editors.forEach(e => editors.add(e));
  525. registry.editorsWithMaintainedConfig.forEach(e => editors.add(e));
  526. registry.editorsWithMaintainedGrammar.forEach(e => editors.add(e));
  527. return editors.size;
  528. }