move.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. import { Client, syncClients, expectClients } from './utils.js';
  2. describe( 'transform', () => {
  3. let john, kate;
  4. beforeEach( () => {
  5. return Promise.all( [
  6. Client.get( 'john' ).then( client => ( john = client ) ),
  7. Client.get( 'kate' ).then( client => ( kate = client ) )
  8. ] );
  9. } );
  10. afterEach( () => {
  11. return Promise.all( [ john.destroy(), kate.destroy() ] );
  12. } );
  13. describe( 'move', () => {
  14. describe( 'by move', () => {
  15. it( 'elements in different paths', () => {
  16. john.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
  17. kate.setData( '<paragraph>Foo</paragraph>[<paragraph>Bar</paragraph>]' );
  18. john.move( [ 2 ] );
  19. kate.move( [ 0 ] );
  20. syncClients();
  21. expectClients(
  22. '<paragraph>Bar</paragraph>' +
  23. '<paragraph>Foo</paragraph>'
  24. );
  25. } );
  26. it( 'text in same path #1', () => {
  27. john.setData( '<paragraph>[Foo] Bar</paragraph>' );
  28. kate.setData( '<paragraph>Foo [Bar]</paragraph>' );
  29. john.move( [ 0, 4 ] );
  30. kate.move( [ 0, 0 ] );
  31. syncClients();
  32. expectClients( '<paragraph>Bar Foo</paragraph>' );
  33. } );
  34. it( 'text in same path #2', () => {
  35. john.setData( '<paragraph>F[oo] Bar</paragraph>' );
  36. kate.setData( '<paragraph>Foo B[ar]</paragraph>' );
  37. john.move( [ 0, 0 ] );
  38. kate.move( [ 0, 4 ] );
  39. syncClients();
  40. expectClients( '<paragraph>ooF arB</paragraph>' );
  41. } );
  42. it( 'text in same path #3', () => {
  43. john.setData( '<paragraph>Foo [Bar]</paragraph>' );
  44. kate.setData( '<paragraph>Foo [Bar]</paragraph>' );
  45. john.move( [ 0, 0 ] );
  46. kate.move( [ 0, 0 ] );
  47. syncClients();
  48. expectClients( '<paragraph>BarFoo </paragraph>' );
  49. } );
  50. it( 'text in same path #4', () => {
  51. john.setData( '<paragraph>F[oo] Bar</paragraph>' );
  52. kate.setData( '<paragraph>Foo B[ar]</paragraph>' );
  53. john.move( [ 0, 6 ] );
  54. kate.move( [ 0, 2 ] );
  55. syncClients();
  56. expectClients( '<paragraph>Foo Bar</paragraph>' );
  57. } );
  58. it( 'text at different paths #1', () => {
  59. john.setData( '<paragraph>F[oo]</paragraph><paragraph>Bar</paragraph>' );
  60. kate.setData( '<paragraph>Foo</paragraph><paragraph>B[ar]</paragraph>' );
  61. john.move( [ 0, 0 ] );
  62. kate.move( [ 1, 0 ] );
  63. syncClients();
  64. expectClients( '<paragraph>ooF</paragraph><paragraph>arB</paragraph>' );
  65. } );
  66. it( 'text in different paths #2', () => {
  67. john.setData( '<paragraph>[Foo]</paragraph><paragraph>Bar</paragraph>' );
  68. kate.setData( '<paragraph>Foo</paragraph><paragraph>[Bar]</paragraph>' );
  69. john.move( [ 1, 0 ] );
  70. kate.move( [ 0, 0 ] );
  71. syncClients();
  72. expectClients( '<paragraph>Bar</paragraph><paragraph>Foo</paragraph>' );
  73. } );
  74. it( 'text in different paths #3', () => {
  75. john.setData( '<paragraph>F[oo]</paragraph><blockQuote><paragraph>Bar</paragraph></blockQuote>' );
  76. kate.setData( '<paragraph>Foo</paragraph><blockQuote><paragraph>B[ar]</paragraph></blockQuote>' );
  77. john.move( [ 1, 0, 0 ] );
  78. kate.move( [ 0, 0 ] );
  79. syncClients();
  80. expectClients(
  81. '<paragraph>arF</paragraph>' +
  82. '<blockQuote>' +
  83. '<paragraph>ooB</paragraph>' +
  84. '</blockQuote>'
  85. );
  86. } );
  87. it( 'text inside other client\'s range #1', () => {
  88. john.setData( '<paragraph>F[oo Ba]r</paragraph>' );
  89. kate.setData( '<paragraph>Fo[o B]ar</paragraph>' );
  90. john.move( [ 0, 0 ] );
  91. kate.move( [ 0, 7 ] );
  92. syncClients();
  93. expectClients( '<paragraph>oo BaFr</paragraph>' );
  94. } );
  95. it( 'text inside other client\'s range #2', () => {
  96. john.setData( '<paragraph>F[oo Ba]r</paragraph>' );
  97. kate.setData( '<paragraph>Fo[o B]ar</paragraph>' );
  98. john.move( [ 0, 0 ] );
  99. kate.move( [ 0, 2 ] );
  100. syncClients();
  101. expectClients( '<paragraph>oo BaFr</paragraph>' );
  102. } );
  103. it( 'text inside other client\'s range #3', () => {
  104. john.setData( '<paragraph>F[oo Ba]r</paragraph>' );
  105. kate.setData( '<paragraph>[Foo B]ar</paragraph>' );
  106. john.move( [ 0, 0 ] );
  107. kate.move( [ 0, 7 ] );
  108. syncClients();
  109. expectClients( '<paragraph>oo BarF</paragraph>' );
  110. } );
  111. } );
  112. describe( 'by wrap', () => {
  113. it( 'element in different path', () => {
  114. john.setData( '<paragraph>F[oo]</paragraph><paragraph>Bar</paragraph>' );
  115. kate.setData( '<paragraph>Foo</paragraph>[<paragraph>Bar</paragraph>]' );
  116. john.move( [ 0, 0 ] );
  117. kate.wrap( 'blockQuote' );
  118. syncClients();
  119. expectClients(
  120. '<paragraph>ooF</paragraph>' +
  121. '<blockQuote>' +
  122. '<paragraph>Bar</paragraph>' +
  123. '</blockQuote>'
  124. );
  125. } );
  126. it( 'element in different path #2', () => {
  127. john.setData( '<paragraph>[Foo]</paragraph><paragraph>Bar</paragraph>' );
  128. kate.setData( '<paragraph>Foo</paragraph>[<paragraph>Bar</paragraph>]' );
  129. john.move( [ 1, 0 ] );
  130. kate.wrap( 'blockQuote' );
  131. syncClients();
  132. expectClients(
  133. '<paragraph></paragraph>' +
  134. '<blockQuote>' +
  135. '<paragraph>FooBar</paragraph>' +
  136. '</blockQuote>'
  137. );
  138. } );
  139. it( 'text in different path', () => {
  140. john.setData( '<paragraph>F[oo]</paragraph><paragraph>Bar</paragraph>' );
  141. kate.setData( '<paragraph>Foo</paragraph><paragraph>[Bar]</paragraph>' );
  142. john.move( [ 0, 0 ] );
  143. kate.wrap( 'div' );
  144. syncClients();
  145. expectClients(
  146. '<paragraph>ooF</paragraph>' +
  147. '<paragraph><div>Bar</div></paragraph>'
  148. );
  149. } );
  150. it( 'element in same path', () => {
  151. john.setData( '<paragraph>F[oo]</paragraph>' );
  152. kate.setData( '[<paragraph>Foo</paragraph>]' );
  153. john.move( [ 0, 0 ] );
  154. kate.wrap( 'blockQuote' );
  155. syncClients();
  156. expectClients(
  157. '<blockQuote>' +
  158. '<paragraph>ooF</paragraph>' +
  159. '</blockQuote>'
  160. );
  161. } );
  162. it( 'text in same path', () => {
  163. john.setData( '<paragraph>F[oo]</paragraph>' );
  164. kate.setData( '<paragraph>[Foo]</paragraph>' );
  165. john.move( [ 0, 0 ] );
  166. kate.wrap( 'div' );
  167. syncClients();
  168. expectClients( '<paragraph>oo<div>F</div></paragraph>' );
  169. } );
  170. it( 'element while moving', () => {
  171. john.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
  172. kate.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
  173. john.move( [ 2 ] );
  174. kate.wrap( 'blockQuote' );
  175. syncClients();
  176. expectClients(
  177. '<paragraph>Bar</paragraph>' +
  178. '<blockQuote>' +
  179. '<paragraph>Foo</paragraph>' +
  180. '</blockQuote>'
  181. );
  182. } );
  183. it( 'text while moving', () => {
  184. john.setData( '<paragraph>[Foo]</paragraph><paragraph>Bar</paragraph>' );
  185. kate.setData( '<paragraph>[Foo]</paragraph><paragraph>Bar</paragraph>' );
  186. john.move( [ 1, 0 ] );
  187. kate.wrap( 'div' );
  188. syncClients();
  189. expectClients(
  190. '<paragraph><div></div></paragraph>' +
  191. '<paragraph>FooBar</paragraph>'
  192. );
  193. } );
  194. it( 'intersecting wrap', () => {
  195. john.setData( '<paragraph>F[oo]</paragraph><paragraph>Bar</paragraph>' );
  196. kate.setData( '<paragraph>[Foo]</paragraph><paragraph>Bar</paragraph>' );
  197. john.move( [ 1, 0 ] );
  198. kate.wrap( 'div' );
  199. syncClients();
  200. expectClients(
  201. '<paragraph><div>F</div></paragraph>' +
  202. '<paragraph>ooBar</paragraph>'
  203. );
  204. } );
  205. } );
  206. describe( 'by unwrap', () => {
  207. it( 'element in different path #1', () => {
  208. john.setData( '<paragraph>F[oo]</paragraph><blockQuote><paragraph>Bar</paragraph></blockQuote>' );
  209. kate.setData( '<paragraph>Foo</paragraph><blockQuote>[<paragraph>Bar</paragraph>]</blockQuote>' );
  210. john.move( [ 0, 0 ] );
  211. kate.unwrap();
  212. syncClients();
  213. expectClients(
  214. '<paragraph>ooF</paragraph>' +
  215. '<paragraph>Bar</paragraph>'
  216. );
  217. } );
  218. it( 'element in different path #2', () => {
  219. john.setData( '<paragraph>[Foo]</paragraph><blockQuote><paragraph>Bar</paragraph></blockQuote>' );
  220. kate.setData( '<paragraph>Foo</paragraph><blockQuote>[<paragraph>Bar</paragraph>]</blockQuote>' );
  221. john.move( [ 1, 0, 0 ] );
  222. kate.unwrap();
  223. syncClients();
  224. expectClients(
  225. '<paragraph></paragraph>' +
  226. '<paragraph>FooBar</paragraph>'
  227. );
  228. } );
  229. it( 'text in different path', () => {
  230. john.setData( '<paragraph>F[oo]</paragraph><blockQuote><paragraph>Bar</paragraph></blockQuote>' );
  231. kate.setData( '<paragraph>Foo</paragraph><blockQuote><paragraph>[Bar]</paragraph></blockQuote>' );
  232. john.move( [ 0, 0 ] );
  233. kate.unwrap();
  234. syncClients();
  235. expectClients(
  236. '<paragraph>ooF</paragraph>' +
  237. '<blockQuote>Bar</blockQuote>'
  238. );
  239. } );
  240. it( 'element in same path', () => {
  241. john.setData( '<blockQuote><paragraph>F[oo]</paragraph></blockQuote>' );
  242. kate.setData( '<blockQuote>[<paragraph>Foo</paragraph>]</blockQuote>' );
  243. john.move( [ 0, 0, 0 ] );
  244. kate.unwrap();
  245. syncClients();
  246. expectClients( '<paragraph>ooF</paragraph>' );
  247. } );
  248. it( 'text in same path', () => {
  249. john.setData( '<blockQuote><paragraph>F[oo]</paragraph></blockQuote>' );
  250. kate.setData( '<blockQuote><paragraph>[Foo]</paragraph></blockQuote>' );
  251. john.move( [ 0, 0, 0 ] );
  252. kate.unwrap();
  253. syncClients();
  254. expectClients( '<blockQuote>ooF</blockQuote>' );
  255. } );
  256. } );
  257. describe( 'by split', () => {
  258. it( 'text in different path #1', () => {
  259. john.setData( '<paragraph>F[oo]</paragraph><paragraph>Bar</paragraph>' );
  260. kate.setData( '<paragraph>Foo</paragraph><paragraph>B[]ar</paragraph>' );
  261. john.move( [ 0, 0 ] );
  262. kate.split();
  263. syncClients();
  264. expectClients(
  265. '<paragraph>ooF</paragraph>' +
  266. '<paragraph>B</paragraph>' +
  267. '<paragraph>ar</paragraph>'
  268. );
  269. } );
  270. it( 'text in different path #2', () => {
  271. john.setData( '<paragraph>[Foo]</paragraph><paragraph>Bar</paragraph>' );
  272. kate.setData( '<paragraph>Foo</paragraph><paragraph>B[]ar</paragraph>' );
  273. john.move( [ 1, 1 ] );
  274. kate.split();
  275. syncClients();
  276. expectClients(
  277. '<paragraph></paragraph>' +
  278. '<paragraph>BFoo</paragraph>' +
  279. '<paragraph>ar</paragraph>'
  280. );
  281. } );
  282. it( 'text in same path', () => {
  283. john.setData( '<paragraph>F[oo] Bar</paragraph>' );
  284. kate.setData( '<paragraph>Foo B[]ar</paragraph>' );
  285. john.move( [ 0, 0 ] );
  286. kate.split();
  287. syncClients();
  288. expectClients(
  289. '<paragraph>ooF B</paragraph>' +
  290. '<paragraph>ar</paragraph>'
  291. );
  292. } );
  293. it.skip( 'text in other user\'s selection', () => {
  294. john.setData( '<paragraph>[Foo] Bar</paragraph>' );
  295. kate.setData( '<paragraph>F[]oo Bar</paragraph>' );
  296. john.move( [ 0, 4 ] );
  297. kate.split();
  298. syncClients();
  299. expectClients(
  300. '<paragraph></paragraph>' +
  301. '<paragraph> FooBar</paragraph>'
  302. );
  303. } );
  304. it( 'moved element', () => {
  305. john.setData( '<paragraph>Foo</paragraph>[<paragraph>Bar</paragraph>]' );
  306. kate.setData( '<paragraph>Foo</paragraph><paragraph>Ba[]r</paragraph>' );
  307. john.move( [ 0 ] );
  308. kate.split();
  309. syncClients();
  310. expectClients(
  311. '<paragraph>Ba</paragraph>' +
  312. '<paragraph>r</paragraph>' +
  313. '<paragraph>Foo</paragraph>'
  314. );
  315. } );
  316. it.skip( 'inside moved text', () => {
  317. john.setData( '<paragraph>F[oo Ba]r</paragraph><paragraph>Abc</paragraph>' );
  318. kate.setData( '<paragraph>Foo[] Bar</paragraph><paragraph>Abc</paragraph>' );
  319. john.move( [ 1, 0 ] );
  320. kate.split();
  321. syncClients();
  322. // Actual result for Kate:
  323. // <paragraph>F</paragraph><paragraph>r</paragraph><paragraph> BaooAbc</paragraph>
  324. // Move operations have wrong targets when they target at same place.
  325. expectClients(
  326. '<paragraph>F</paragraph>' +
  327. '<paragraph>r</paragraph>' +
  328. '<paragraph>oo BaAbc</paragraph>'
  329. );
  330. } );
  331. } );
  332. describe( 'by remove', () => {
  333. it( 'text in same path #1', () => {
  334. john.setData( '<paragraph>[Foo] Bar</paragraph>' );
  335. kate.setData( '<paragraph>Foo [Bar]</paragraph>' );
  336. john.move( [ 0, 4 ] );
  337. kate.remove();
  338. syncClients();
  339. expectClients( '<paragraph> Foo</paragraph>' );
  340. } );
  341. it( 'text in same path #2', () => {
  342. john.setData( '<paragraph>F[oo] Bar</paragraph>' );
  343. kate.setData( '<paragraph>Foo B[ar]</paragraph>' );
  344. john.move( [ 0, 0 ] );
  345. kate.remove();
  346. syncClients();
  347. expectClients( '<paragraph>ooF B</paragraph>' );
  348. } );
  349. it( 'text in same path #3', () => {
  350. john.setData( '<paragraph>Foo [Bar]</paragraph>' );
  351. kate.setData( '<paragraph>Foo [Bar]</paragraph>' );
  352. john.move( [ 0, 0 ] );
  353. kate.remove();
  354. syncClients();
  355. expectClients( '<paragraph>Foo </paragraph>' );
  356. } );
  357. it( 'text at different paths #1', () => {
  358. john.setData( '<paragraph>F[oo]</paragraph><paragraph>Bar</paragraph>' );
  359. kate.setData( '<paragraph>Foo</paragraph><paragraph>B[ar]</paragraph>' );
  360. john.move( [ 0, 0 ] );
  361. kate.remove();
  362. syncClients();
  363. expectClients( '<paragraph>ooF</paragraph><paragraph>B</paragraph>' );
  364. } );
  365. it( 'text in different paths #2', () => {
  366. john.setData( '<paragraph>[Foo]</paragraph><paragraph>Bar</paragraph>' );
  367. kate.setData( '<paragraph>Foo</paragraph><paragraph>[Bar]</paragraph>' );
  368. john.move( [ 1, 0 ] );
  369. kate.remove();
  370. syncClients();
  371. expectClients( '<paragraph></paragraph><paragraph>Foo</paragraph>' );
  372. } );
  373. it( 'text in different paths #3', () => {
  374. john.setData( '<paragraph>F[oo]</paragraph><blockQuote><paragraph>Bar</paragraph></blockQuote>' );
  375. kate.setData( '<paragraph>Foo</paragraph><blockQuote><paragraph>B[ar]</paragraph></blockQuote>' );
  376. john.move( [ 1, 0, 0 ] );
  377. kate.remove();
  378. syncClients();
  379. expectClients(
  380. '<paragraph>F</paragraph>' +
  381. '<blockQuote>' +
  382. '<paragraph>ooB</paragraph>' +
  383. '</blockQuote>'
  384. );
  385. } );
  386. it( 'text in other user\'s selection, then undo', () => {
  387. john.setData( '<paragraph>Fo[o B]ar</paragraph>' );
  388. kate.setData( '<paragraph>[Foo B]ar</paragraph>' );
  389. john.move( [ 0, 0 ] );
  390. kate.remove();
  391. syncClients();
  392. john.undo();
  393. kate.undo();
  394. syncClients();
  395. expectClients( '<paragraph>Foo Bar</paragraph>' );
  396. } );
  397. } );
  398. describe( 'by merge', () => {
  399. it( 'element into paragraph #1', () => {
  400. john.setData( '<paragraph>F[oo]</paragraph><paragraph>Bar</paragraph>' );
  401. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  402. john.move( [ 0, 0 ] );
  403. kate.merge();
  404. syncClients();
  405. expectClients( '<paragraph>ooFBar</paragraph>' );
  406. } );
  407. it( 'element into paragraph #2', () => {
  408. john.setData( '<paragraph>Foo</paragraph><paragraph>B[ar]</paragraph>' );
  409. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  410. john.move( [ 0, 0 ] );
  411. kate.merge();
  412. syncClients();
  413. expectClients( '<paragraph>arFooB</paragraph>' );
  414. } );
  415. it( 'element into paragraph #3', () => {
  416. john.setData( '<paragraph>F[oo]</paragraph><paragraph>Bar</paragraph>' );
  417. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  418. john.move( [ 1, 0 ] );
  419. kate.merge();
  420. syncClients();
  421. expectClients( '<paragraph>FooBar</paragraph>' );
  422. } );
  423. it( 'wrapped element into wrapped paragraph #1', () => {
  424. john.setData( '<blockQuote><paragraph>F[oo]</paragraph><paragraph>Bar</paragraph></blockQuote>' );
  425. kate.setData( '<blockQuote><paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph></blockQuote>' );
  426. john.move( [ 0, 0, 0 ] );
  427. kate.merge();
  428. syncClients();
  429. expectClients( '<blockQuote><paragraph>ooFBar</paragraph></blockQuote>' );
  430. } );
  431. it( 'wrapped element into wrapped paragraph #2', () => {
  432. john.setData( '<blockQuote><paragraph>Foo</paragraph><paragraph>B[ar]</paragraph></blockQuote>' );
  433. kate.setData( '<blockQuote><paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph></blockQuote>' );
  434. john.move( [ 0, 0, 0 ] );
  435. kate.merge();
  436. syncClients();
  437. expectClients( '<blockQuote><paragraph>arFooB</paragraph></blockQuote>' );
  438. } );
  439. it( 'wrapped element into wrapped paragraph #3', () => {
  440. john.setData( '<blockQuote><paragraph>F[oo]</paragraph><paragraph>Bar</paragraph></blockQuote>' );
  441. kate.setData( '<blockQuote><paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph></blockQuote>' );
  442. john.move( [ 0, 1, 0 ] );
  443. kate.merge();
  444. syncClients();
  445. expectClients( '<blockQuote><paragraph>FooBar</paragraph></blockQuote>' );
  446. } );
  447. it( 'moved element', () => {
  448. john.setData( '<paragraph>Foo</paragraph>[<paragraph>Bar</paragraph>]' );
  449. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  450. john.move( [ 0 ] );
  451. kate.merge();
  452. syncClients();
  453. expectClients( '<paragraph>FooBar</paragraph>' );
  454. } );
  455. it( 'moved element, then undo', () => {
  456. john.setData( '<paragraph>Foo</paragraph>[<paragraph>Bar</paragraph>]' );
  457. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  458. john.move( [ 0 ] );
  459. kate.merge();
  460. syncClients();
  461. expectClients( '<paragraph>FooBar</paragraph>' );
  462. john.undo();
  463. syncClients();
  464. expectClients( '<paragraph>FooBar</paragraph>' );
  465. } );
  466. it( 'moved text', () => {
  467. john.setData( '<paragraph>Foo</paragraph><paragraph>B[ar]</paragraph>' );
  468. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  469. john.move( [ 0, 0 ] );
  470. kate.merge();
  471. syncClients();
  472. expectClients( '<paragraph>arFooB</paragraph>' );
  473. } );
  474. it( 'moved text, then undo', () => {
  475. john.setData( '<paragraph>Foo</paragraph><paragraph>B[ar]</paragraph>' );
  476. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  477. john.move( [ 0, 0 ] );
  478. kate.merge();
  479. syncClients();
  480. john.undo();
  481. syncClients();
  482. expectClients( '<paragraph>FooBar</paragraph>' );
  483. } );
  484. } );
  485. describe( 'by rename', () => {
  486. it( 'element in different path #1', () => {
  487. john.setData( '<paragraph>Foo</paragraph><paragraph>B[ar]</paragraph>' );
  488. kate.setData( '<paragraph>[]Foo</paragraph><paragraph>Bar</paragraph>' );
  489. john.move( [ 1, 0 ] );
  490. kate.rename( 'heading1' );
  491. syncClients();
  492. expectClients( '<heading1>Foo</heading1><paragraph>arB</paragraph>' );
  493. } );
  494. it( 'element in different path #2', () => {
  495. john.setData( '<blockQuote><paragraph>Foo</paragraph><paragraph>[Bar]</paragraph></blockQuote>' );
  496. kate.setData( '<blockQuote>[]<paragraph>Foo</paragraph><paragraph>Bar</paragraph></blockQuote>' );
  497. john.move( [ 0, 0, 0 ] );
  498. kate.rename( 'blockQuote2' );
  499. syncClients();
  500. expectClients(
  501. '<blockQuote2>' +
  502. '<paragraph>BarFoo</paragraph>' +
  503. '<paragraph></paragraph>' +
  504. '</blockQuote2>'
  505. );
  506. } );
  507. it( 'element in different path #3', () => {
  508. john.setData( '<blockQuote><paragraph>[Foo]</paragraph><paragraph>Bar</paragraph></blockQuote>' );
  509. kate.setData( '<blockQuote><paragraph>[]Foo</paragraph><paragraph>Bar</paragraph></blockQuote>' );
  510. john.move( [ 0, 1, 0 ] );
  511. kate.rename( 'heading1' );
  512. syncClients();
  513. expectClients(
  514. '<blockQuote>' +
  515. '<heading1></heading1>' +
  516. '<paragraph>FooBar</paragraph>' +
  517. '</blockQuote>'
  518. );
  519. } );
  520. it( 'element in same path', () => {
  521. john.setData( '<paragraph>Foo [Bar]</paragraph>' );
  522. kate.setData( '<paragraph>[]Foo Bar</paragraph>' );
  523. john.move( [ 0, 0 ] );
  524. kate.rename( 'heading1' );
  525. syncClients();
  526. expectClients( '<heading1>BarFoo </heading1>' );
  527. } );
  528. } );
  529. } );
  530. } );