utils.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /**
  2. * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. 'use strict';
  6. /* global console:false */
  7. import EmitterMixin from '/ckeditor5/utils/emittermixin.js';
  8. const utils = {
  9. /**
  10. * Returns the number of elements return by the iterator.
  11. *
  12. * testUtils.getIteratorCount( [ 1, 2, 3, 4, 5 ] ); // 5;
  13. *
  14. * @param {Iterable.<*>} iterator Any iterator.
  15. * @returns {Number} Number of elements returned by that iterator.
  16. */
  17. getIteratorCount( iterator ) {
  18. let count = 0;
  19. for ( let _ of iterator ) { // jshint ignore:line
  20. count++;
  21. }
  22. return count;
  23. },
  24. /**
  25. * Creates an instance inheriting from {@link utils.EmitterMixin} with one additional method `observe()`.
  26. * It allows observing changes to attributes in objects being {@link utils.Observable observable}.
  27. *
  28. * The `observe()` method accepts:
  29. *
  30. * * `{String} observableName` – Identifier for the observable object. E.g. `"Editable"` when
  31. * you observe one of editor's editables. This name will be displayed on the console.
  32. * * `{utils.Observable observable} – The object to observe.
  33. *
  34. * Typical usage:
  35. *
  36. * const observer = utils.createObserver();
  37. * observer.observe( 'Editable', editor.editables.current );
  38. *
  39. * // Stop listening (method from the EmitterMixin):
  40. * observer.stopListening();
  41. *
  42. * @returns {Emitter} The observer.
  43. */
  44. createObserver() {
  45. const observer = Object.create( EmitterMixin, {
  46. observe: {
  47. value: function observe( observableName, observable ) {
  48. observer.listenTo( observable, 'change', ( evt, propertyName, value, oldValue ) => {
  49. console.log( `[Change in ${ observableName }] ${ propertyName } = '${ value }' (was '${ oldValue }')` );
  50. } );
  51. return observer;
  52. }
  53. }
  54. } );
  55. return observer;
  56. },
  57. /**
  58. * Checkes wether observable properties are properly bound to each other.
  59. *
  60. * Syntax given that observable `A` is bound to observables [`B`, `C`, ...]:
  61. *
  62. * assertBinding( A,
  63. * { initial `A` attributes },
  64. * [
  65. * [ B, { new `B` attributes } ],
  66. * [ C, { new `C` attributes } ],
  67. * ...
  68. * ],
  69. * { `A` attributes after [`B`, 'C', ...] changed }
  70. * );
  71. */
  72. assertBinding( observable, stateBefore, data, stateAfter ) {
  73. let key, pair;
  74. for ( key in stateBefore ) {
  75. expect( observable[ key ] ).to.be.equal( stateBefore[ key ] );
  76. }
  77. // Change attributes of bound observables.
  78. for ( pair of data ) {
  79. for ( key in pair[ 1 ] ) {
  80. pair[ 0 ][ key ] = pair[ 1 ][ key ];
  81. }
  82. }
  83. for ( key in stateAfter ) {
  84. expect( observable[ key ] ).to.be.equal( stateAfter[ key ] );
  85. }
  86. }
  87. };
  88. export default utils;