8
0

move.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  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( 'element in same path', () => {
  140. john.setData( '<paragraph>F[oo]</paragraph>' );
  141. kate.setData( '[<paragraph>Foo</paragraph>]' );
  142. john.move( [ 0, 0 ] );
  143. kate.wrap( 'blockQuote' );
  144. syncClients();
  145. expectClients(
  146. '<blockQuote>' +
  147. '<paragraph>ooF</paragraph>' +
  148. '</blockQuote>'
  149. );
  150. } );
  151. it( 'element while moving', () => {
  152. john.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
  153. kate.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
  154. john.move( [ 2 ] );
  155. kate.wrap( 'blockQuote' );
  156. syncClients();
  157. expectClients(
  158. '<paragraph>Bar</paragraph>' +
  159. '<blockQuote>' +
  160. '<paragraph>Foo</paragraph>' +
  161. '</blockQuote>'
  162. );
  163. } );
  164. } );
  165. describe( 'by unwrap', () => {
  166. it( 'element in different path #1', () => {
  167. john.setData( '<paragraph>F[oo]</paragraph><blockQuote><paragraph>Bar</paragraph></blockQuote>' );
  168. kate.setData( '<paragraph>Foo</paragraph><blockQuote>[<paragraph>Bar</paragraph>]</blockQuote>' );
  169. john.move( [ 0, 0 ] );
  170. kate.unwrap();
  171. syncClients();
  172. expectClients(
  173. '<paragraph>ooF</paragraph>' +
  174. '<paragraph>Bar</paragraph>'
  175. );
  176. } );
  177. it( 'element in different path #2', () => {
  178. john.setData( '<paragraph>[Foo]</paragraph><blockQuote><paragraph>Bar</paragraph></blockQuote>' );
  179. kate.setData( '<paragraph>Foo</paragraph><blockQuote>[<paragraph>Bar</paragraph>]</blockQuote>' );
  180. john.move( [ 1, 0, 0 ] );
  181. kate.unwrap();
  182. syncClients();
  183. expectClients(
  184. '<paragraph></paragraph>' +
  185. '<paragraph>FooBar</paragraph>'
  186. );
  187. } );
  188. it( 'text in different path', () => {
  189. john.setData( '<paragraph>F[oo]</paragraph><blockQuote><paragraph>Bar</paragraph></blockQuote>' );
  190. kate.setData( '<paragraph>Foo</paragraph><blockQuote><paragraph>[]Bar</paragraph></blockQuote>' );
  191. john.move( [ 0, 0 ] );
  192. kate.unwrap();
  193. syncClients();
  194. expectClients(
  195. '<paragraph>ooF</paragraph>' +
  196. '<blockQuote>Bar</blockQuote>'
  197. );
  198. } );
  199. it( 'element in same path', () => {
  200. john.setData( '<blockQuote><paragraph>F[oo]</paragraph></blockQuote>' );
  201. kate.setData( '<blockQuote>[<paragraph>Foo</paragraph>]</blockQuote>' );
  202. john.move( [ 0, 0, 0 ] );
  203. kate.unwrap();
  204. syncClients();
  205. expectClients( '<paragraph>ooF</paragraph>' );
  206. } );
  207. it( 'text in same path', () => {
  208. john.setData( '<blockQuote><paragraph>F[oo]</paragraph></blockQuote>' );
  209. kate.setData( '<blockQuote><paragraph>[]Foo</paragraph></blockQuote>' );
  210. john.move( [ 0, 0, 0 ] );
  211. kate.unwrap();
  212. syncClients();
  213. expectClients( '<blockQuote>ooF</blockQuote>' );
  214. } );
  215. } );
  216. describe( 'by split', () => {
  217. it( 'text in different path #1', () => {
  218. john.setData( '<paragraph>F[oo]</paragraph><paragraph>Bar</paragraph>' );
  219. kate.setData( '<paragraph>Foo</paragraph><paragraph>B[]ar</paragraph>' );
  220. john.move( [ 0, 0 ] );
  221. kate.split();
  222. syncClients();
  223. expectClients(
  224. '<paragraph>ooF</paragraph>' +
  225. '<paragraph>B</paragraph>' +
  226. '<paragraph>ar</paragraph>'
  227. );
  228. } );
  229. it( 'text in different path #2', () => {
  230. john.setData( '<paragraph>[Foo]</paragraph><paragraph>Bar</paragraph>' );
  231. kate.setData( '<paragraph>Foo</paragraph><paragraph>B[]ar</paragraph>' );
  232. john.move( [ 1, 1 ] );
  233. kate.split();
  234. syncClients();
  235. expectClients(
  236. '<paragraph></paragraph>' +
  237. '<paragraph>BFoo</paragraph>' +
  238. '<paragraph>ar</paragraph>'
  239. );
  240. } );
  241. it( 'text in same path', () => {
  242. john.setData( '<paragraph>F[oo] Bar</paragraph>' );
  243. kate.setData( '<paragraph>Foo B[]ar</paragraph>' );
  244. john.move( [ 0, 0 ] );
  245. kate.split();
  246. syncClients();
  247. expectClients(
  248. '<paragraph>ooF B</paragraph>' +
  249. '<paragraph>ar</paragraph>'
  250. );
  251. } );
  252. it( 'text in other user\'s selection', () => {
  253. john.setData( '<paragraph>[Foo] Bar</paragraph>' );
  254. kate.setData( '<paragraph>F[]oo Bar</paragraph>' );
  255. john.move( [ 0, 4 ] );
  256. kate.split();
  257. syncClients();
  258. expectClients(
  259. '<paragraph></paragraph>' +
  260. '<paragraph> FooBar</paragraph>'
  261. );
  262. } );
  263. it( 'moved element', () => {
  264. john.setData( '<paragraph>Foo</paragraph>[<paragraph>Bar</paragraph>]' );
  265. kate.setData( '<paragraph>Foo</paragraph><paragraph>Ba[]r</paragraph>' );
  266. john.move( [ 0 ] );
  267. kate.split();
  268. syncClients();
  269. expectClients(
  270. '<paragraph>Ba</paragraph>' +
  271. '<paragraph>r</paragraph>' +
  272. '<paragraph>Foo</paragraph>'
  273. );
  274. } );
  275. it( 'inside moved text', () => {
  276. john.setData( '<paragraph>F[oo Ba]r</paragraph><paragraph>Abc</paragraph>' );
  277. kate.setData( '<paragraph>Foo[] Bar</paragraph><paragraph>Abc</paragraph>' );
  278. john.move( [ 1, 0 ] );
  279. kate.split();
  280. syncClients();
  281. expectClients(
  282. '<paragraph>F</paragraph>' +
  283. '<paragraph>r</paragraph>' +
  284. '<paragraph>oo BaAbc</paragraph>'
  285. );
  286. } );
  287. } );
  288. describe( 'by remove', () => {
  289. it( 'text in same path #1', () => {
  290. john.setData( '<paragraph>[Foo] Bar</paragraph>' );
  291. kate.setData( '<paragraph>Foo [Bar]</paragraph>' );
  292. john.move( [ 0, 4 ] );
  293. kate.remove();
  294. syncClients();
  295. expectClients( '<paragraph> Foo</paragraph>' );
  296. } );
  297. it( 'text in same path #2', () => {
  298. john.setData( '<paragraph>F[oo] Bar</paragraph>' );
  299. kate.setData( '<paragraph>Foo B[ar]</paragraph>' );
  300. john.move( [ 0, 0 ] );
  301. kate.remove();
  302. syncClients();
  303. expectClients( '<paragraph>ooF B</paragraph>' );
  304. } );
  305. it( 'text in same path #3', () => {
  306. john.setData( '<paragraph>Foo [Bar]</paragraph>' );
  307. kate.setData( '<paragraph>Foo [Bar]</paragraph>' );
  308. john.move( [ 0, 0 ] );
  309. kate.remove();
  310. syncClients();
  311. expectClients( '<paragraph>Foo </paragraph>' );
  312. } );
  313. it( 'text at different paths #1', () => {
  314. john.setData( '<paragraph>F[oo]</paragraph><paragraph>Bar</paragraph>' );
  315. kate.setData( '<paragraph>Foo</paragraph><paragraph>B[ar]</paragraph>' );
  316. john.move( [ 0, 0 ] );
  317. kate.remove();
  318. syncClients();
  319. expectClients( '<paragraph>ooF</paragraph><paragraph>B</paragraph>' );
  320. } );
  321. it( 'text in different paths #2', () => {
  322. john.setData( '<paragraph>[Foo]</paragraph><paragraph>Bar</paragraph>' );
  323. kate.setData( '<paragraph>Foo</paragraph><paragraph>[Bar]</paragraph>' );
  324. john.move( [ 1, 0 ] );
  325. kate.remove();
  326. syncClients();
  327. expectClients( '<paragraph></paragraph><paragraph>Foo</paragraph>' );
  328. } );
  329. it( 'text in different paths #3', () => {
  330. john.setData( '<paragraph>F[oo]</paragraph><blockQuote><paragraph>Bar</paragraph></blockQuote>' );
  331. kate.setData( '<paragraph>Foo</paragraph><blockQuote><paragraph>B[ar]</paragraph></blockQuote>' );
  332. john.move( [ 1, 0, 0 ] );
  333. kate.remove();
  334. syncClients();
  335. expectClients(
  336. '<paragraph>F</paragraph>' +
  337. '<blockQuote>' +
  338. '<paragraph>ooB</paragraph>' +
  339. '</blockQuote>'
  340. );
  341. } );
  342. it( 'text in other user\'s selection, then undo', () => {
  343. john.setData( '<paragraph>Fo[o B]ar</paragraph>' );
  344. kate.setData( '<paragraph>[Foo B]ar</paragraph>' );
  345. john.move( [ 0, 0 ] );
  346. kate.remove();
  347. syncClients();
  348. john.undo();
  349. kate.undo();
  350. syncClients();
  351. expectClients( '<paragraph>Foo Bar</paragraph>' );
  352. } );
  353. } );
  354. describe( 'by merge', () => {
  355. it( 'element into paragraph #1', () => {
  356. john.setData( '<paragraph>F[oo]</paragraph><paragraph>Bar</paragraph>' );
  357. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  358. john.move( [ 0, 0 ] );
  359. kate.merge();
  360. syncClients();
  361. expectClients( '<paragraph>ooFBar</paragraph>' );
  362. } );
  363. it( 'element into paragraph #2', () => {
  364. john.setData( '<paragraph>Foo</paragraph><paragraph>B[ar]</paragraph>' );
  365. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  366. john.move( [ 0, 0 ] );
  367. kate.merge();
  368. syncClients();
  369. expectClients( '<paragraph>arFooB</paragraph>' );
  370. } );
  371. it( 'element into paragraph #3', () => {
  372. john.setData( '<paragraph>F[oo]</paragraph><paragraph>Bar</paragraph>' );
  373. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  374. john.move( [ 1, 0 ] );
  375. kate.merge();
  376. syncClients();
  377. expectClients( '<paragraph>FooBar</paragraph>' );
  378. } );
  379. it( 'wrapped element into wrapped paragraph #1', () => {
  380. john.setData( '<blockQuote><paragraph>F[oo]</paragraph><paragraph>Bar</paragraph></blockQuote>' );
  381. kate.setData( '<blockQuote><paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph></blockQuote>' );
  382. john.move( [ 0, 0, 0 ] );
  383. kate.merge();
  384. syncClients();
  385. expectClients( '<blockQuote><paragraph>ooFBar</paragraph></blockQuote>' );
  386. } );
  387. it( 'wrapped element into wrapped paragraph #2', () => {
  388. john.setData( '<blockQuote><paragraph>Foo</paragraph><paragraph>B[ar]</paragraph></blockQuote>' );
  389. kate.setData( '<blockQuote><paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph></blockQuote>' );
  390. john.move( [ 0, 0, 0 ] );
  391. kate.merge();
  392. syncClients();
  393. expectClients( '<blockQuote><paragraph>arFooB</paragraph></blockQuote>' );
  394. } );
  395. it( 'wrapped element into wrapped paragraph #3', () => {
  396. john.setData( '<blockQuote><paragraph>F[oo]</paragraph><paragraph>Bar</paragraph></blockQuote>' );
  397. kate.setData( '<blockQuote><paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph></blockQuote>' );
  398. john.move( [ 0, 1, 0 ] );
  399. kate.merge();
  400. syncClients();
  401. expectClients( '<blockQuote><paragraph>FooBar</paragraph></blockQuote>' );
  402. } );
  403. it( 'moved element', () => {
  404. john.setData( '<paragraph>Foo</paragraph>[<paragraph>Bar</paragraph>]' );
  405. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  406. john.move( [ 0 ] );
  407. kate.merge();
  408. syncClients();
  409. expectClients( '<paragraph>FooBar</paragraph>' );
  410. } );
  411. it( 'moved element, then undo', () => {
  412. john.setData( '<paragraph>Foo</paragraph>[<paragraph>Bar</paragraph>]' );
  413. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  414. john.move( [ 0 ] );
  415. kate.merge();
  416. syncClients();
  417. expectClients( '<paragraph>FooBar</paragraph>' );
  418. john.undo();
  419. syncClients();
  420. expectClients( '<paragraph>FooBar</paragraph>' );
  421. } );
  422. it( 'moved text', () => {
  423. john.setData( '<paragraph>Foo</paragraph><paragraph>B[ar]</paragraph>' );
  424. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  425. john.move( [ 0, 0 ] );
  426. kate.merge();
  427. syncClients();
  428. expectClients( '<paragraph>arFooB</paragraph>' );
  429. } );
  430. it( 'moved text, then undo', () => {
  431. john.setData( '<paragraph>Foo</paragraph><paragraph>B[ar]</paragraph>' );
  432. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  433. john.move( [ 0, 0 ] );
  434. kate.merge();
  435. syncClients();
  436. john.undo();
  437. syncClients();
  438. expectClients( '<paragraph>FooBar</paragraph>' );
  439. } );
  440. } );
  441. describe( 'by rename', () => {
  442. it( 'element in different path #1', () => {
  443. john.setData( '<paragraph>Foo</paragraph><paragraph>B[ar]</paragraph>' );
  444. kate.setData( '<paragraph>[]Foo</paragraph><paragraph>Bar</paragraph>' );
  445. john.move( [ 1, 0 ] );
  446. kate.rename( 'heading1' );
  447. syncClients();
  448. expectClients( '<heading1>Foo</heading1><paragraph>arB</paragraph>' );
  449. } );
  450. it( 'element in different path #2', () => {
  451. john.setData( '<blockQuote><paragraph>Foo</paragraph><paragraph>[Bar]</paragraph></blockQuote>' );
  452. kate.setData( '<blockQuote>[]<paragraph>Foo</paragraph><paragraph>Bar</paragraph></blockQuote>' );
  453. john.move( [ 0, 0, 0 ] );
  454. kate.rename( 'blockQuote2' );
  455. syncClients();
  456. expectClients(
  457. '<blockQuote2>' +
  458. '<paragraph>BarFoo</paragraph>' +
  459. '<paragraph></paragraph>' +
  460. '</blockQuote2>'
  461. );
  462. } );
  463. it( 'element in different path #3', () => {
  464. john.setData( '<blockQuote><paragraph>[Foo]</paragraph><paragraph>Bar</paragraph></blockQuote>' );
  465. kate.setData( '<blockQuote><paragraph>[]Foo</paragraph><paragraph>Bar</paragraph></blockQuote>' );
  466. john.move( [ 0, 1, 0 ] );
  467. kate.rename( 'heading1' );
  468. syncClients();
  469. expectClients(
  470. '<blockQuote>' +
  471. '<heading1></heading1>' +
  472. '<paragraph>FooBar</paragraph>' +
  473. '</blockQuote>'
  474. );
  475. } );
  476. it( 'element in same path', () => {
  477. john.setData( '<paragraph>Foo [Bar]</paragraph>' );
  478. kate.setData( '<paragraph>[]Foo Bar</paragraph>' );
  479. john.move( [ 0, 0 ] );
  480. kate.rename( 'heading1' );
  481. syncClients();
  482. expectClients( '<heading1>BarFoo </heading1>' );
  483. } );
  484. } );
  485. } );
  486. } );