model.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. /**
  2. * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. import Model from '../../src/model/model';
  6. describe( 'Model', () => {
  7. let model;
  8. let changes = '';
  9. beforeEach( () => {
  10. model = new Model();
  11. changes = '';
  12. } );
  13. describe( 'change & enqueueChange', () => {
  14. it( 'should execute changes immediately', () => {
  15. model.change( () => {
  16. changes += 'A';
  17. } );
  18. expect( changes ).to.equal( 'A' );
  19. } );
  20. it( 'should pass returned value', () => {
  21. const ret = model.change( () => {
  22. changes += 'A';
  23. return 'B';
  24. } );
  25. changes += ret;
  26. expect( changes ).to.equal( 'AB' );
  27. } );
  28. it( 'should not mixed the order when nested change is called', () => {
  29. const ret = model.change( () => {
  30. changes += 'A';
  31. nested();
  32. return 'D';
  33. } );
  34. changes += ret;
  35. expect( changes ).to.equal( 'ABCD' );
  36. function nested() {
  37. const ret = model.change( () => {
  38. changes += 'B';
  39. return 'C';
  40. } );
  41. changes += ret;
  42. }
  43. } );
  44. it( 'should execute enqueueChanges immediately if its the first block', () => {
  45. model.enqueueChange( () => {
  46. changes += 'A';
  47. nested();
  48. } );
  49. expect( changes ).to.equal( 'ABC' );
  50. function nested() {
  51. const ret = model.change( () => {
  52. changes += 'B';
  53. return 'C';
  54. } );
  55. changes += ret;
  56. }
  57. } );
  58. it( 'should be possible to enqueueChanges immediately if its the first block', () => {
  59. model.enqueueChange( () => {
  60. changes += 'A';
  61. nested();
  62. } );
  63. expect( changes ).to.equal( 'AB' );
  64. function nested() {
  65. model.change( () => {
  66. changes += 'B';
  67. } );
  68. }
  69. } );
  70. it( 'should be possible to nest change in enqueueChanges', () => {
  71. model.enqueueChange( () => {
  72. changes += 'A';
  73. nested();
  74. changes += 'D';
  75. } );
  76. expect( changes ).to.equal( 'ABCD' );
  77. function nested() {
  78. const ret = model.change( () => {
  79. changes += 'B';
  80. return 'C';
  81. } );
  82. changes += ret;
  83. }
  84. } );
  85. it( 'should be possible to nest enqueueChanges in enqueueChanges', () => {
  86. model.enqueueChange( () => {
  87. changes += 'A';
  88. nestedEnqueue();
  89. changes += 'B';
  90. } );
  91. expect( changes ).to.equal( 'ABC' );
  92. function nestedEnqueue() {
  93. model.enqueueChange( () => {
  94. changes += 'C';
  95. } );
  96. }
  97. } );
  98. it( 'should be possible to nest enqueueChanges in changes', () => {
  99. const ret = model.change( () => {
  100. changes += 'A';
  101. nestedEnqueue();
  102. changes += 'B';
  103. return 'D';
  104. } );
  105. changes += ret;
  106. expect( changes ).to.equal( 'ABCD' );
  107. function nestedEnqueue() {
  108. model.enqueueChange( () => {
  109. changes += 'C';
  110. } );
  111. }
  112. } );
  113. it( 'should be possible to nest enqueueChanges in enqueueChanges event', () => {
  114. model.once( 'change', () => {
  115. model.enqueueChange( () => {
  116. changes += 'C';
  117. } );
  118. changes += 'B';
  119. } );
  120. model.on( 'changesDone', () => {
  121. changes += 'D';
  122. } );
  123. model.enqueueChange( () => {
  124. changes += 'A';
  125. } );
  126. expect( changes ).to.equal( 'ABCD' );
  127. } );
  128. it( 'should be possible to nest enqueueChanges in changes event', () => {
  129. model.once( 'change', () => {
  130. model.enqueueChange( () => {
  131. changes += 'C';
  132. } );
  133. changes += 'B';
  134. } );
  135. model.on( 'changesDone', () => {
  136. changes += 'D';
  137. } );
  138. model.change( () => {
  139. changes += 'A';
  140. } );
  141. expect( changes ).to.equal( 'ABCD' );
  142. } );
  143. it( 'should be possible to nest changes in enqueueChanges event', () => {
  144. model.once( 'change', () => {
  145. model.change( () => {
  146. changes += 'B';
  147. } );
  148. changes += 'C';
  149. } );
  150. model.on( 'changesDone', () => {
  151. changes += 'D';
  152. } );
  153. model.enqueueChange( () => {
  154. changes += 'A';
  155. } );
  156. expect( changes ).to.equal( 'ABCD' );
  157. } );
  158. it( 'should be possible to nest changes in changes event', () => {
  159. model.once( 'change', () => {
  160. model.change( () => {
  161. changes += 'B';
  162. } );
  163. changes += 'C';
  164. } );
  165. model.on( 'changesDone', () => {
  166. changes += 'D';
  167. } );
  168. model.change( () => {
  169. changes += 'A';
  170. } );
  171. expect( changes ).to.equal( 'ABCD' );
  172. } );
  173. it( 'should let mix blocks', () => {
  174. model.once( 'change', () => {
  175. model.change( () => {
  176. changes += 'B';
  177. nestedEnqueue();
  178. } );
  179. model.change( () => {
  180. changes += 'C';
  181. } );
  182. changes += 'D';
  183. } );
  184. model.on( 'changesDone', () => {
  185. changes += 'F';
  186. } );
  187. model.change( () => {
  188. changes += 'A';
  189. } );
  190. expect( changes ).to.equal( 'ABCDEF' );
  191. function nestedEnqueue() {
  192. model.enqueueChange( () => {
  193. changes += 'E';
  194. } );
  195. }
  196. } );
  197. it( 'should use the same writer in all change blocks (change & change)', () => {
  198. model.change( outerWriter => {
  199. model.change( innerWriter => {
  200. expect( innerWriter ).to.equal( outerWriter );
  201. } );
  202. } );
  203. } );
  204. it( 'should create new writer in enqueue block', () => {
  205. model.change( outerWriter => {
  206. model.enqueueChange( innerWriter => {
  207. expect( innerWriter ).to.not.equal( outerWriter );
  208. expect( innerWriter.batch ).to.not.equal( outerWriter.batch );
  209. } );
  210. } );
  211. } );
  212. it( 'should let you pass batch', () => {
  213. let outerBatch;
  214. model.change( outerWriter => {
  215. outerBatch = outerWriter.batch;
  216. model.enqueueChange( outerBatch, innerWriter => {
  217. expect( innerWriter.batch ).to.equal( outerBatch );
  218. } );
  219. } );
  220. } );
  221. it( 'should let you create transparent batch', () => {
  222. model.enqueueChange( 'transparent', writer => {
  223. expect( writer.batch.type ).to.equal( 'transparent' );
  224. } );
  225. } );
  226. } );
  227. } );