8
0

positioniterator.js 4.0 KB

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