wrap.js 6.1 KB

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