rename.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  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( 'rename', () => {
  14. describe( 'by remove attribute', () => {
  15. it( 'from element in different path', () => {
  16. john.setData( '<paragraph>F[]oo</paragraph><paragraph bold="true">Bar</paragraph>' );
  17. kate.setData( '<paragraph>Foo</paragraph>[<paragraph bold="true">Bar</paragraph>]' );
  18. john.rename( 'heading1' );
  19. kate.removeAttribute( 'bold' );
  20. syncClients();
  21. expectClients(
  22. '<heading1>Foo</heading1>' +
  23. '<paragraph>Bar</paragraph>'
  24. );
  25. } );
  26. it( 'from text in different path', () => {
  27. john.setData( '<paragraph>F[]oo</paragraph><paragraph>Bar</paragraph>' );
  28. kate.setData( '<paragraph>Foo</paragraph><paragraph>[Bar]</paragraph>' );
  29. john.rename( 'heading1' );
  30. kate.removeAttribute( 'bold' );
  31. syncClients();
  32. expectClients(
  33. '<heading1>Foo</heading1>' +
  34. '<paragraph>Bar</paragraph>'
  35. );
  36. } );
  37. it( 'from text in same path', () => {
  38. john.setData( '<paragraph>F[]o<$text bold="true">o</$text></paragraph>' );
  39. kate.setData( '<paragraph>Fo<$text bold="true">[o]</$text></paragraph>' );
  40. john.rename( 'heading1' );
  41. kate.removeAttribute( 'bold' );
  42. syncClients();
  43. expectClients(
  44. '<heading1>Foo</heading1>'
  45. );
  46. } );
  47. it( 'from element in same path', () => {
  48. john.setData( '<paragraph bold="true">F[]oo</paragraph>' );
  49. kate.setData( '[<paragraph bold="true">Foo</paragraph>]' );
  50. john.rename( 'heading1' );
  51. kate.removeAttribute( 'bold' );
  52. syncClients();
  53. expectClients(
  54. '<heading1>Foo</heading1>'
  55. );
  56. } );
  57. it( 'from text with 2 attributes in same path', () => {
  58. john.setData( '<paragraph>F[o]<$text bold="true" italic="true">o</$text></paragraph>' );
  59. kate.setData( '<paragraph>Fo<$text bold="true" italic="true">[o]</$text></paragraph>' );
  60. john.rename( 'heading1' );
  61. kate.removeAttribute( 'bold' );
  62. syncClients();
  63. expectClients(
  64. '<heading1>Fo<$text italic="true">o</$text></heading1>'
  65. );
  66. } );
  67. it( 'from text in other user\'s selection', () => {
  68. john.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph>' );
  69. kate.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph>' );
  70. john.rename( 'heading1' );
  71. kate.removeAttribute( 'bold' );
  72. syncClients();
  73. expectClients(
  74. '<heading1>Foo</heading1>'
  75. );
  76. } );
  77. } );
  78. describe( 'by rename', () => {
  79. it( 'elements in different paths #1', () => {
  80. john.setData( '<paragraph>[]Foo</paragraph><paragraph>Bar</paragraph>' );
  81. kate.setData( '<paragraph>Foo</paragraph><paragraph>[]Bar</paragraph>' );
  82. john.rename( 'heading1' );
  83. kate.rename( 'heading2' );
  84. syncClients();
  85. expectClients( '<heading1>Foo</heading1><heading2>Bar</heading2>' );
  86. } );
  87. it( 'elements in different paths #2', () => {
  88. john.setData( '<blockQuote>[]<paragraph>Foo Bar</paragraph></blockQuote>' );
  89. kate.setData( '<blockQuote><paragraph>[]Foo Bar</paragraph></blockQuote>' );
  90. john.rename( 'blockQuote2' );
  91. kate.rename( 'heading2' );
  92. syncClients();
  93. expectClients( '<blockQuote2><heading2>Foo Bar</heading2></blockQuote2>' );
  94. } );
  95. it( 'the same element', () => {
  96. john.setData( '<blockQuote>[]<paragraph>Foo Bar</paragraph></blockQuote>' );
  97. kate.setData( '<blockQuote>[]<paragraph>Foo Bar</paragraph></blockQuote>' );
  98. john.rename( 'blockQuote2' );
  99. kate.rename( 'blockQuote3' );
  100. syncClients();
  101. expectClients( '<blockQuote2><paragraph>Foo Bar</paragraph></blockQuote2>' );
  102. } );
  103. } );
  104. describe( 'by split', () => {
  105. it( 'element in different path', () => {
  106. john.setData( '<paragraph>F[]oo</paragraph><paragraph>Bar</paragraph>' );
  107. kate.setData( '<paragraph>Foo</paragraph><paragraph>B[]ar</paragraph>' );
  108. john.rename( 'heading1' );
  109. kate.split();
  110. syncClients();
  111. expectClients(
  112. '<heading1>Foo</heading1>' +
  113. '<paragraph>B</paragraph>' +
  114. '<paragraph>ar</paragraph>'
  115. );
  116. } );
  117. it( 'element in same path', () => {
  118. john.setData( '<paragraph>[]Foo Bar</paragraph>' );
  119. kate.setData( '<paragraph>Foo []Bar</paragraph>' );
  120. john.rename( 'heading1' );
  121. kate.split();
  122. syncClients();
  123. expectClients( '<heading1>Foo </heading1><heading1>Bar</heading1>' );
  124. } );
  125. it( 'element in same path, then undo', () => {
  126. john.setData( '<paragraph>[]Foo Bar</paragraph>' );
  127. kate.setData( '<paragraph>Foo []Bar</paragraph>' );
  128. john.rename( 'heading1' );
  129. john.undo();
  130. kate.split();
  131. syncClients();
  132. expectClients( '<paragraph>Foo </paragraph><paragraph>Bar</paragraph>' );
  133. } );
  134. it( 'element in other user\'s selection', () => {
  135. john.setData( '<paragraph>[Foo]</paragraph>' );
  136. kate.setData( '<paragraph>F[]oo</paragraph>' );
  137. john.rename( 'heading1' );
  138. kate.split();
  139. syncClients();
  140. expectClients(
  141. '<heading1>F</heading1>' +
  142. '<heading1>oo</heading1>'
  143. );
  144. } );
  145. } );
  146. describe( 'by wrap', () => {
  147. it( 'element in different path', () => {
  148. john.setData( '<paragraph>[]Foo</paragraph><paragraph>Bar</paragraph>' );
  149. kate.setData( '<paragraph>Foo</paragraph>[<paragraph>Bar</paragraph>]' );
  150. john.rename( 'heading1' );
  151. kate.wrap( 'blockQuote' );
  152. syncClients();
  153. expectClients(
  154. '<heading1>Foo</heading1>' +
  155. '<blockQuote>' +
  156. '<paragraph>Bar</paragraph>' +
  157. '</blockQuote>'
  158. );
  159. } );
  160. it( 'element in same path', () => {
  161. john.setData( '<paragraph>[]Foo</paragraph>' );
  162. kate.setData( '[<paragraph>Foo</paragraph>]' );
  163. john.rename( 'heading1' );
  164. kate.wrap( 'blockQuote' );
  165. syncClients();
  166. expectClients( '<blockQuote><heading1>Foo</heading1></blockQuote>' );
  167. } );
  168. } );
  169. describe( 'by unwrap', () => {
  170. it( 'element in different path', () => {
  171. john.setData( '<paragraph>F[]oo</paragraph><blockQuote><paragraph>Bar</paragraph></blockQuote>' );
  172. kate.setData( '<paragraph>Foo</paragraph><blockQuote>[<paragraph>Bar</paragraph>]</blockQuote>' );
  173. john.rename( 'heading1' );
  174. kate.unwrap();
  175. syncClients();
  176. expectClients(
  177. '<heading1>Foo</heading1>' +
  178. '<paragraph>Bar</paragraph>'
  179. );
  180. } );
  181. it( 'element in same path', () => {
  182. john.setData( '<blockQuote><paragraph>F[]oo</paragraph></blockQuote>' );
  183. kate.setData( '<blockQuote>[<paragraph>Foo</paragraph>]</blockQuote>' );
  184. john.rename( 'heading1' );
  185. kate.unwrap();
  186. syncClients();
  187. expectClients(
  188. '<heading1>Foo</heading1>'
  189. );
  190. } );
  191. } );
  192. describe( 'by merge', () => {
  193. it( 'element into paragraph #1', () => {
  194. john.setData( '<paragraph>F[]oo</paragraph><paragraph>Bar</paragraph>' );
  195. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  196. john.rename( 'heading1' );
  197. kate.merge();
  198. syncClients();
  199. expectClients(
  200. '<heading1>FooBar</heading1>'
  201. );
  202. } );
  203. it( 'element into paragraph #2', () => {
  204. john.setData( '<paragraph>Foo</paragraph><paragraph>B[]ar</paragraph>' );
  205. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  206. john.rename( 'heading1' );
  207. kate.merge();
  208. syncClients();
  209. expectClients(
  210. '<paragraph>FooBar</paragraph>'
  211. );
  212. } );
  213. it( 'wrapped element into wrapped paragraph #1', () => {
  214. john.setData( '<blockQuote><paragraph>F[]oo</paragraph><paragraph>Bar</paragraph></blockQuote>' );
  215. kate.setData( '<blockQuote><paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph></blockQuote>' );
  216. john.rename( 'heading1' );
  217. kate.merge();
  218. syncClients();
  219. expectClients(
  220. '<blockQuote><heading1>FooBar</heading1></blockQuote>'
  221. );
  222. } );
  223. it( 'wrapped element into wrapped paragraph #2', () => {
  224. john.setData( '<blockQuote><paragraph>Foo</paragraph><paragraph>B[]ar</paragraph></blockQuote>' );
  225. kate.setData( '<blockQuote><paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph></blockQuote>' );
  226. john.rename( 'heading1' );
  227. kate.merge();
  228. syncClients();
  229. expectClients(
  230. '<blockQuote><paragraph>FooBar</paragraph></blockQuote>'
  231. );
  232. } );
  233. } );
  234. } );
  235. } );