wrap.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  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( 'wrap', () => {
  14. describe( 'by wrap', () => {
  15. it( 'element in different path', () => {
  16. john.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
  17. kate.setData( '<paragraph>Foo</paragraph>[<paragraph>Bar</paragraph>]' );
  18. john.wrap( 'blockQuote' );
  19. kate.wrap( 'blockQuote2' );
  20. syncClients();
  21. expectClients(
  22. '<blockQuote><paragraph>Foo</paragraph></blockQuote>' +
  23. '<blockQuote2><paragraph>Bar</paragraph></blockQuote2>'
  24. );
  25. } );
  26. it( 'text in different path', () => {
  27. john.setData( '<paragraph>[Foo]</paragraph><paragraph>Bar</paragraph>' );
  28. kate.setData( '<paragraph>Foo</paragraph><paragraph>[Bar]</paragraph>' );
  29. john.wrap( 'div' );
  30. kate.wrap( 'div2' );
  31. syncClients();
  32. expectClients(
  33. '<paragraph><div>Foo</div></paragraph>' +
  34. '<paragraph><div2>Bar</div2></paragraph>'
  35. );
  36. } );
  37. it( 'the same element', () => {
  38. john.setData( '[<paragraph>Foo</paragraph>]' );
  39. kate.setData( '[<paragraph>Foo</paragraph>]' );
  40. john.wrap( 'blockQuote' );
  41. kate.wrap( 'blockQuote2' );
  42. syncClients();
  43. expectClients( '<blockQuote><paragraph>Foo</paragraph></blockQuote>' );
  44. } );
  45. it( 'intersecting wrap #1', () => {
  46. john.setData( '[<paragraph>Foo</paragraph><paragraph>Bar</paragraph>]<paragraph>Abc</paragraph>' );
  47. kate.setData( '<paragraph>Foo</paragraph>[<paragraph>Bar</paragraph><paragraph>Abc</paragraph>]' );
  48. john.wrap( 'blockQuote' );
  49. kate.wrap( 'div' );
  50. syncClients();
  51. expectClients(
  52. '<blockQuote>' +
  53. '<paragraph>Foo</paragraph>' +
  54. '<paragraph>Bar</paragraph>' +
  55. '</blockQuote>' +
  56. '<div>' +
  57. '<paragraph>Abc</paragraph>' +
  58. '</div>'
  59. );
  60. } );
  61. it.skip( 'intersecting wrap #2', () => {
  62. john.setData( '<paragraph>[Foo]</paragraph>' );
  63. kate.setData( '<paragraph>F[o]o</paragraph>' );
  64. john.wrap( 'div' );
  65. kate.wrap( 'div' );
  66. syncClients();
  67. expectClients( '<paragraph><div>Foo</div></pragraph>' );
  68. } );
  69. it.skip( 'intersecting wrap, then undo #1', () => {
  70. john.setData( '[<paragraph>Foo</paragraph><paragraph>Bar</paragraph>]<paragraph>Abc</paragraph>' );
  71. kate.setData( '<paragraph>Foo</paragraph>[<paragraph>Bar</paragraph><paragraph>Abc</paragraph>]' );
  72. john.wrap( 'blockQuote' );
  73. kate.wrap( 'div' );
  74. syncClients();
  75. john.undo();
  76. kate.undo();
  77. syncClients();
  78. expectClients(
  79. '<paragraph>Foo</paragraph>' +
  80. '<paragraph>Bar</paragraph>' +
  81. '<paragraph>Abc</paragraph>'
  82. );
  83. } );
  84. it.skip( 'intersecting wrap, then undo #2', () => {
  85. john.setData( '<paragraph>[Foo]</paragraph>' );
  86. kate.setData( '<paragraph>F[o]o</paragraph>' );
  87. john.wrap( 'div' );
  88. kate.wrap( 'div' );
  89. syncClients();
  90. john.undo();
  91. kate.undo();
  92. syncClients();
  93. expectClients( '<paragraph><div>Foo</div></pragraph>' );
  94. } );
  95. it( 'element and text', () => {
  96. john.setData( '[<paragraph>Foo</paragraph>]' );
  97. kate.setData( '<paragraph>[Foo]</paragraph>' );
  98. john.wrap( 'blockQuote' );
  99. kate.wrap( 'div' );
  100. syncClients();
  101. expectClients( '<blockQuote><paragraph><div>Foo</div></paragraph></blockQuote>' );
  102. } );
  103. } );
  104. describe( 'by unwrap', () => {
  105. it( 'element in different path', () => {
  106. john.setData( '[<paragraph>Foo</paragraph>]<blockQuote><paragraph>Bar</paragraph></blockQuote>' );
  107. kate.setData( '<paragraph>Foo</paragraph><blockQuote>[<paragraph>Bar</paragraph>]</blockQuote>' );
  108. john.wrap( 'blockQuote' );
  109. kate.unwrap();
  110. syncClients();
  111. expectClients(
  112. '<blockQuote><paragraph>Foo</paragraph></blockQuote>' +
  113. '<paragraph>Bar</paragraph>'
  114. );
  115. } );
  116. it( 'text in different path', () => {
  117. john.setData( '<paragraph>[Foo]</paragraph><blockQuote><paragraph>Bar</paragraph></blockQuote>' );
  118. kate.setData( '<paragraph>Foo</paragraph><blockQuote><paragraph>[Bar]</paragraph></blockQuote>' );
  119. john.wrap( 'div' );
  120. kate.unwrap();
  121. syncClients();
  122. expectClients(
  123. '<paragraph><div>Foo</div></paragraph>' +
  124. '<blockQuote>Bar</blockQuote>'
  125. );
  126. } );
  127. it( 'the same element', () => {
  128. john.setData( '<blockQuote>[<paragraph>Foo</paragraph>]</blockQuote>' );
  129. kate.setData( '<blockQuote>[<paragraph>Foo</paragraph>]</blockQuote>' );
  130. john.wrap( 'blockQuote2' );
  131. kate.unwrap();
  132. syncClients();
  133. expectClients( '<blockQuote2><paragraph>Foo</paragraph></blockQuote2>' );
  134. } );
  135. it( 'the same element, then undo', () => {
  136. john.setData( '<blockQuote>[<paragraph>Foo</paragraph>]</blockQuote>' );
  137. kate.setData( '<blockQuote>[<paragraph>Foo</paragraph>]</blockQuote>' );
  138. john.wrap( 'blockQuote2' );
  139. kate.unwrap();
  140. syncClients();
  141. kate.undo();
  142. syncClients();
  143. expectClients( '<blockQuote><paragraph>Foo</paragraph></blockQuote>' );
  144. } );
  145. it( 'the same text', () => {
  146. john.setData( '<blockQuote><paragraph>[Foo]</paragraph></blockQuote>' );
  147. kate.setData( '<blockQuote><paragraph>[Foo]</paragraph></blockQuote>' );
  148. john.wrap( 'div' );
  149. kate.unwrap();
  150. syncClients();
  151. expectClients( '<blockQuote><div>Foo</div></blockQuote>' );
  152. } );
  153. } );
  154. describe( 'by delete', () => {
  155. it( 'text in two elements', () => {
  156. john.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
  157. kate.setData( '<paragraph>Fo[o</paragraph><paragraph>Ba]r</paragraph>' );
  158. john.wrap( 'blockQuote' );
  159. kate.delete();
  160. syncClients();
  161. expectClients(
  162. '<blockQuote>' +
  163. '<paragraph>For</paragraph>' +
  164. '</blockQuote>'
  165. );
  166. } );
  167. } );
  168. describe( 'by merge', () => {
  169. it( 'element into paragraph #1', () => {
  170. john.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
  171. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  172. john.wrap( 'blockQuote' );
  173. kate.merge();
  174. syncClients();
  175. expectClients( '<blockQuote><paragraph>FooBar</paragraph></blockQuote>' );
  176. } );
  177. it( 'element into paragraph #2', () => {
  178. john.setData( '<paragraph>[Foo]</paragraph><paragraph>Bar</paragraph>' );
  179. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  180. john.wrap( 'div' );
  181. kate.merge();
  182. syncClients();
  183. john.undo();
  184. kate.undo();
  185. syncClients();
  186. expectClients( '<paragraph>Foo</paragraph><paragraph>Bar</paragraph>' );
  187. } );
  188. it.skip( 'element into paragraph, then undo', () => {
  189. john.setData( '<paragraph>Foo</paragraph>[<paragraph>Bar</paragraph>]' );
  190. kate.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
  191. john.wrap( 'blockQuote' );
  192. kate.merge();
  193. syncClients();
  194. expectClients( '<blockQuote><paragraph>FooBar</paragraph></blockQuote>' );
  195. john.undo();
  196. kate.undo();
  197. syncClients();
  198. expectClients( '<paragraph>Foo</paragraph><paragraph>Bar</paragraph>' );
  199. } );
  200. } );
  201. } );
  202. } );