unwrap.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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( 'unwrap', () => {
  14. describe( 'by unwrap', () => {
  15. it( 'element in different path', () => {
  16. john.setData(
  17. '<blockQuote>[<paragraph>Foo</paragraph>]</blockQuote>' +
  18. '<blockQuote><paragraph>Bar</paragraph></blockQuote>'
  19. );
  20. kate.setData(
  21. '<blockQuote><paragraph>Foo</paragraph></blockQuote>' +
  22. '<blockQuote>[<paragraph>Bar</paragraph>]</blockQuote>'
  23. );
  24. john.unwrap();
  25. kate.unwrap();
  26. syncClients();
  27. expectClients(
  28. '<paragraph>Foo</paragraph>' +
  29. '<paragraph>Bar</paragraph>'
  30. );
  31. } );
  32. it( 'text in different path', () => {
  33. john.setData(
  34. '<blockQuote><paragraph>[Foo]</paragraph></blockQuote>' +
  35. '<blockQuote><paragraph>Bar</paragraph></blockQuote>'
  36. );
  37. kate.setData(
  38. '<blockQuote><paragraph>Foo</paragraph></blockQuote>' +
  39. '<blockQuote><paragraph>[Bar]</paragraph></blockQuote>'
  40. );
  41. john.unwrap();
  42. kate.unwrap();
  43. syncClients();
  44. expectClients(
  45. '<blockQuote>Foo</blockQuote>' +
  46. '<blockQuote>Bar</blockQuote>'
  47. );
  48. } );
  49. it( 'the same element', () => {
  50. john.setData( '<blockQuote>[<paragraph>Foo</paragraph>]</blockQuote>' );
  51. kate.setData( '<blockQuote>[<paragraph>Foo</paragraph>]</blockQuote>' );
  52. john.unwrap();
  53. kate.unwrap();
  54. syncClients();
  55. expectClients( '<paragraph>Foo</paragraph>' );
  56. } );
  57. it.skip( 'the same element, then undo', () => {
  58. john.setData( '<blockQuote>[]<paragraph>Foo</paragraph></blockQuote>' );
  59. kate.setData( '<blockQuote>[]<paragraph>Foo</paragraph></blockQuote>' );
  60. john.unwrap();
  61. kate.unwrap();
  62. syncClients();
  63. expectClients( '<paragraph>Foo</paragraph>' );
  64. john.undo();
  65. syncClients();
  66. // Actual content for Kate:
  67. // <paragraph><paragraph>Foo</paragraph></paragraph>
  68. // Kate has a different order of nodes in graveyard after syncing.
  69. expectClients( '<blockQuote><paragraph>Foo</paragraph></blockQuote>' );
  70. } );
  71. it( 'the same text', () => {
  72. john.setData( '<blockQuote><paragraph>[Foo]</paragraph></blockQuote>' );
  73. kate.setData( '<blockQuote><paragraph>[Foo]</paragraph></blockQuote>' );
  74. john.unwrap();
  75. kate.unwrap();
  76. syncClients();
  77. expectClients( '<blockQuote>Foo</blockQuote>' );
  78. } );
  79. it( 'the same text, then undo', () => {
  80. john.setData( '<blockQuote><paragraph>[Foo]</paragraph></blockQuote>' );
  81. kate.setData( '<blockQuote><paragraph>[Foo]</paragraph></blockQuote>' );
  82. john.unwrap();
  83. kate.unwrap();
  84. syncClients();
  85. john.undo();
  86. syncClients();
  87. expectClients( '<blockQuote><paragraph>Foo</paragraph></blockQuote>' );
  88. } );
  89. } );
  90. describe( 'by delete', () => {
  91. it( 'text from two elements #1', () => {
  92. john.setData( '<blockQuote>[<paragraph>Foo</paragraph>]</blockQuote><paragraph>Bar</paragraph>' );
  93. kate.setData( '<blockQuote><paragraph>Fo[o</paragraph></blockQuote><paragraph>Ba]r</paragraph>' );
  94. john.unwrap();
  95. kate.delete();
  96. syncClients();
  97. expectClients( '<paragraph>For</paragraph>' );
  98. } );
  99. it( 'text in same path', () => {
  100. john.setData( '<blockQuote>[<paragraph>Foo</paragraph>]</blockQuote>' );
  101. kate.setData( '<blockQuote><paragraph>F[oo]</paragraph></blockQuote>' );
  102. john.unwrap();
  103. kate.delete();
  104. syncClients();
  105. expectClients( '<paragraph>F</paragraph>' );
  106. } );
  107. } );
  108. describe( 'by merge', () => {
  109. it( 'element into paragraph #1', () => {
  110. john.setData( '<blockQuote>[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph></blockQuote>' );
  111. kate.setData( '<blockQuote><paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph></blockQuote>' );
  112. john.unwrap();
  113. kate.merge();
  114. syncClients();
  115. expectClients( '<paragraph>FooBar</paragraph>' );
  116. } );
  117. it( 'element into paragraph #2', () => {
  118. john.setData( '<blockQuote>[<paragraph>Foo</paragraph><paragraph>Bar</paragraph>]</blockQuote>' );
  119. kate.setData( '<blockQuote><paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph></blockQuote>' );
  120. john.unwrap();
  121. kate.merge();
  122. syncClients();
  123. expectClients( '<paragraph>FooBar</paragraph>' );
  124. } );
  125. it( 'unwrapped element', () => {
  126. john.setData( '<paragraph>Foo</paragraph><blockQuote>[<paragraph>Bar</paragraph>]</blockQuote>' );
  127. kate.setData( '<paragraph>Foo</paragraph>[]<blockQuote><paragraph>Bar</paragraph></blockQuote>' );
  128. john.unwrap();
  129. kate.merge();
  130. syncClients();
  131. expectClients(
  132. '<paragraph>Foo</paragraph>' +
  133. '<paragraph>Bar</paragraph>'
  134. );
  135. } );
  136. } );
  137. } );
  138. } );