8
0

utils.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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 moduleUtils from '/tests/_utils/module.js';
  8. import EmitterMixin from '/ckeditor5/core/emittermixin.js';
  9. const utils = {
  10. /**
  11. * Defines CKEditor plugin which is a mock of an editor creator.
  12. *
  13. * The mocked creator is available under:
  14. *
  15. * editor.plugins.get( 'creator-thename' );
  16. *
  17. * @param {String} creatorName Name of the creator.
  18. * @param {Object} [proto] Prototype of the creator. Properties from the proto param will
  19. * be copied to the prototype of the creator.
  20. */
  21. defineEditorCreatorMock( creatorName, proto ) {
  22. moduleUtils.define( 'creator-' + creatorName, [ 'core/creator' ], ( Creator ) => {
  23. class TestCreator extends Creator {}
  24. if ( proto ) {
  25. for ( let propName in proto ) {
  26. TestCreator.prototype[ propName ] = proto[ propName ];
  27. }
  28. }
  29. return TestCreator;
  30. } );
  31. },
  32. /**
  33. * Creates an instance inheriting from {@link core.EmitterMixin} with one additional method `observe()`.
  34. * It allows observing changes to attributes in objects being {@link core.Observable observable}.
  35. *
  36. * The `observe()` method accepts:
  37. *
  38. * * `{String} observableName` – Identifier for the observable object. E.g. `"Editable"` when
  39. * you observe one of editor's editables. This name will be displayed on the console.
  40. * * `{core.Observable observable} – The object to observe.
  41. *
  42. * Typical usage:
  43. *
  44. * const observer = utils.createObserver();
  45. * observer.observe( 'Editable', editor.editables.current );
  46. *
  47. * // Stop listening (method from the EmitterMixin):
  48. * observer.stopListening();
  49. *
  50. * @returns {Emitter} The observer.
  51. */
  52. createObserver() {
  53. const observer = Object.create( EmitterMixin, {
  54. observe: {
  55. value: function observe( observableName, observable ) {
  56. observer.listenTo( observable, 'change', ( evt, propertyName, value, oldValue ) => {
  57. console.log( `[ Change in $ { observableName } ] $ { propertyName } = '${ value }' ( was '${ oldValue }' )` );
  58. } );
  59. return observer;
  60. }
  61. }
  62. } );
  63. return observer;
  64. },
  65. /**
  66. * Checkes wether observable properties are properly bound to each other.
  67. *
  68. * Syntax given that observable `A` is bound to observables [`B`, `C`, ...]:
  69. *
  70. * assertBinding( A,
  71. * { initial `A` attributes },
  72. * [
  73. * [ B, { new `B` attributes } ],
  74. * [ C, { new `C` attributes } ],
  75. * ...
  76. * ],
  77. * { `A` attributes after [`B`, 'C', ...] changed }
  78. * );
  79. */
  80. assertBinding( observable, stateBefore, data, stateAfter ) {
  81. let key, pair;
  82. for ( key in stateBefore ) {
  83. expect( observable[ key ] ).to.be.equal( stateBefore[ key ] );
  84. }
  85. // Change attributes of bound observables.
  86. for ( pair of data ) {
  87. for ( key in pair[ 1 ] ) {
  88. pair[ 0 ][ key ] = pair[ 1 ][ key ];
  89. }
  90. }
  91. for ( key in stateAfter ) {
  92. expect( observable[ key ] ).to.be.equal( stateAfter[ key ] );
  93. }
  94. }
  95. };
  96. export default utils;