positioniterator.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /**
  2. * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. /* bender-tags: document */
  6. 'use strict';
  7. const modules = bender.amd.require(
  8. 'document/document',
  9. 'document/element',
  10. 'document/character',
  11. 'document/positioniterator',
  12. 'document/position',
  13. 'document/range'
  14. );
  15. describe( 'range iterator', function() {
  16. let Document, Element, Character, PositionIterator, Position, Range;
  17. let ELEMENT_ENTER, ELEMENT_LEAVE, CHARACTER;
  18. var doc, expectedItems, root, img1, paragraph, b, a, r, img2, x;
  19. before( function() {
  20. Document = modules[ 'document/document' ];
  21. Element = modules[ 'document/element' ];
  22. Character = modules[ 'document/character' ];
  23. PositionIterator = modules[ 'document/positioniterator' ];
  24. Position = modules[ 'document/position' ];
  25. Range = modules[ 'document/range' ];
  26. ELEMENT_ENTER = PositionIterator.ELEMENT_ENTER;
  27. ELEMENT_LEAVE = PositionIterator.ELEMENT_LEAVE;
  28. CHARACTER = PositionIterator.CHARACTER;
  29. doc = new Document();
  30. root = doc.createRoot( 'root' );
  31. // root
  32. // |- img1
  33. // |- p
  34. // |- B
  35. // |- A
  36. // |- R
  37. // |
  38. // |- img2
  39. // |
  40. // |- X
  41. b = new Character( 'b' );
  42. a = new Character( 'a' );
  43. r = new Character( 'r' );
  44. img2 = new Element( 'img2' );
  45. x = new Character( 'x' );
  46. paragraph = new Element( 'p', [], [ b, a, r, img2, x ] );
  47. img1 = new Element( 'img1' );
  48. root.insertChildren( 0, [ img1, paragraph ] );
  49. expectedItems = [
  50. { type: ELEMENT_ENTER, node: img1 },
  51. { type: ELEMENT_LEAVE, node: img1 },
  52. { type: ELEMENT_ENTER, node: paragraph },
  53. { type: CHARACTER, node: b },
  54. { type: CHARACTER, node: a },
  55. { type: CHARACTER, node: r },
  56. { type: ELEMENT_ENTER, node: img2 },
  57. { type: ELEMENT_LEAVE, node: img2 },
  58. { type: CHARACTER, node: x },
  59. { type: ELEMENT_LEAVE, node: paragraph }
  60. ];
  61. } );
  62. it( 'should return next position', function() {
  63. var iterator = new PositionIterator( new Position( [ 0 ], root ) ); // beginning of root
  64. var i, len;
  65. for ( i = 0, len = expectedItems.length; i < len; i++ ) {
  66. expect( iterator.next() ).to.deep.equal( { done: false, value: expectedItems[ i ] } );
  67. }
  68. expect( iterator.next() ).to.have.property( 'done' ).that.is.true;
  69. } );
  70. it( 'should return previous position', function() {
  71. var iterator = new PositionIterator( new Position( [ 2 ], root ) ); // ending of root
  72. for ( var i = expectedItems.length - 1; i >= 0; i-- ) {
  73. expect( iterator.previous() ).to.deep.equal( { done: false, value: expectedItems[ i ] } );
  74. }
  75. expect( iterator.previous() ).to.have.property( 'done' ).that.is.true;
  76. } );
  77. it( 'should return next position in the boundaries', function() {
  78. var start = new Position( [ 1, 0 ], root ); // p, 0
  79. var end = new Position( [ 1, 3, 0 ], root ); // img, 0
  80. var iterator = new PositionIterator( new Range( start, end ) );
  81. var i, len;
  82. for ( i = 3, len = expectedItems.length; i < 7; i++ ) {
  83. expect( iterator.next() ).to.deep.equal( { done: false, value: expectedItems[ i ] } );
  84. }
  85. expect( iterator.next() ).to.have.property( 'done' ).that.is.true;
  86. } );
  87. it( 'should return previous position in the boundaries', function() {
  88. var start = new Position( [ 1, 0 ], root ); // p, 0
  89. var end = new Position( [ 1, 3, 0 ], root ); // img, 0
  90. var iterator = new PositionIterator( new Range( start, end ), end );
  91. var i, len;
  92. for ( i = 6, len = expectedItems.length; i > 2; i-- ) {
  93. expect( iterator.previous() ).to.deep.equal( { done: false, value: expectedItems[ i ] } );
  94. }
  95. expect( iterator.previous() ).to.have.property( 'done' ).that.is.true;
  96. } );
  97. it( 'should return iterate over the range', function() {
  98. var start = new Position( [ 0 ], root ); // begging of root
  99. var end = new Position( [ 2 ], root ); // ending of root
  100. var range = new Range( start, end );
  101. var i = 0;
  102. var value;
  103. for ( value of range ) {
  104. expect( value ).to.deep.equal( expectedItems[ i ] );
  105. i++;
  106. }
  107. expect( i ).to.equal( expectedItems.length );
  108. } );
  109. } );