positioniterator.js 4.5 KB

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