UNPKG

jodit

Version:

Jodit is awesome and usefully wysiwyg editor with filebrowser

409 lines (320 loc) 8.94 kB
/*! * Jodit Editor (https://xdsoft.net/jodit/) * Released under MIT see LICENSE.txt in the project root for license information. * Copyright (c) 2013-2020 Valeriy Chupurnov. All rights reserved. https://xdsoft.net */ describe('Test object observer', function() { function getTestObject() { return { editable: true, disabled: false, some: { element: { enable: true, one: 1, two: 2 } } }; } const get = Jodit.modules.Helpers.get; const stringify = Jodit.modules.Helpers.stringify; const isEqual = Jodit.modules.Helpers.isEqual; const A = function(result, keyA, keyB) { function A() { this.setStatus('ready'); } function __() { this.constructor = A; } __.prototype = Jodit.modules.Component.prototype; A.prototype = new __(); A.prototype.methodA = function() { result.push(['A', get(keyA, this)]); }; A.prototype.methodB = function() { result.push(['B', get(keyB || keyA, this)]); }; A.prototype.methodC = function(key, oldValue, newValue) { result.push(['C', oldValue, newValue]); }; A.prototype.state = getTestObject(); return A; }; describe('Test watch decorator', function() { it('Should add watcher to whole field object', function() { const result = [], AClass = A(result, 'state.editable'); Jodit.decorators.watch('state')(AClass.prototype, 'methodA'); const a = new AClass(); a.state = Object.assign({}, a.state, { editable: false }); a.state = Object.assign({}, a.state, { editable: true }); expect(result).to.deep.equal([ ['A', false], ['A', true] ]); }); it('Should add watcher to some field in Component', function() { const result = [], AClass = A(result, 'state.some.element.enable'); Jodit.decorators.watch('state.some.element.enable')( AClass.prototype, 'methodA' ); const a = new AClass(); a.state.some.element.enable = false; a.state.some.element.enable = true; expect(result).to.deep.equal([ ['A', false], ['A', true] ]); }); describe('Add several watchers', function() { describe('on same fields', function() { it('Should call all handlers', function() { const result = [], AClass = A(result, 'state.some.element.enable'); Jodit.decorators.watch('state.some.element.enable')( AClass.prototype, 'methodA' ); Jodit.decorators.watch('state.some.element.enable')( AClass.prototype, 'methodB' ); const a = new AClass(); a.state.some.element.enable = false; a.state.some.element.enable = true; expect(result).to.deep.equal([ ['A', false], ['B', false], ['A', true], ['B', true] ]); }); }); describe('on different fields', function() { it('Should call only matched handlers', function() { const result = [], AClass = A( result, 'state.some.element.one', 'state.some.element.two' ); Jodit.decorators.watch('state.some.element.one')( AClass.prototype, 'methodA' ); Jodit.decorators.watch('state.some.element.two')( AClass.prototype, 'methodB' ); const a = new AClass(); a.state.some.element.enable = false; // indifferent a.state.some.element.one = 2; // call methodA a.state.some.element.two = 3; // call methodB expect(result).to.deep.equal([ ['A', 2], ['B', 3] ]); }); }); }); describe('On change field', function() { it('Should fire change all parent field', function() { const result = [], AClass = A(result, 'state.some.element.one'); Jodit.decorators.watch('state.some')( AClass.prototype, 'methodA' ); const a = new AClass(); a.state.some.element.one = 5; a.state.some.element.one = 15; a.state.some.element.one = 15; expect(result).to.deep.equal([ ['A', 5], ['A', 15] ]); }); it('Should add in handler - old value as first argument', function() { const result = [], AClass = A(result, 'state.some.element.one'); Jodit.decorators.watch('state.some')( AClass.prototype, 'methodC' ); const a = new AClass(); a.state.some.element.one = 5; a.state.some.element.one = 15; expect(result).to.deep.equal([ ['C', 1, 5], ['C', 5, 15] ]); }); }); }); describe('Test safe stringify', function() { it('Should safe stringify any circular object to string', function() { const a = {}, b = getTestObject(); expect(stringify(a)).equals('{}'); expect(stringify(b)).equals( '{"editable":true,"disabled":false,"some":{"element":{"enable":true,"one":1,"two":2}}}' ); b.b = b; expect(stringify(b)).equals( '{"editable":true,"disabled":false,"some":{"element":{"enable":true,"one":1,"two":2}},"b":"[refObject]"}' ); }); }); describe('Test equal checker', function() { describe('Two object', function() { describe('Check one object', function() { it('Should check that is one object', function() { const a = {}, b = []; expect(isEqual(a, a)).is.true; expect(isEqual(b, b)).is.true; expect(isEqual(a, b)).is.false; }); }); describe('Check scalar value', function() { it('Should check normal', function() { expect( isEqual( function() {}, function() {} ) ).is.true; expect( isEqual( function() { return 1; }, function() {} ) ).is.false; expect(isEqual(1, 1)).is.true; expect(isEqual(1, 2)).is.false; expect(isEqual(true, true)).is.true; expect(isEqual(1.0, 1)).is.true; expect(isEqual('1', 1)).is.true; }); }); describe('Check array', function() { it('Should deep check', function() { expect(isEqual([1], [1])).is.true; expect(isEqual([1], [2])).is.false; expect(isEqual(['test'], ['test'])).is.true; expect(isEqual(['test'], ['test', 1])).is.false; }); }); describe('Check ref object', function() { it('Should deep check and add instead ref some const', function() { const a = getTestObject(), b = getTestObject(); expect(isEqual(a, b)).is.true; a.b = b; b.b = a; expect(isEqual(a, b)).is.true; a.b = 1; b.b = 2; expect(isEqual(a, b)).is.false; expect(isEqual(window, document)).is.false; }); }); }); }); describe('Event on change', function() { it('Should fire event when field value was changed', function() { const counter = []; const data = Jodit.modules.ObserveObject.create(getTestObject()); data.on('change', function(key) { counter.push(key); }); data.editable = false; data.editable = false; data.some.element.two = 2; data.some.element.one = 2; expect(counter).to.deep.equal(['editable', 'some.element.one']); }); describe('Key change event', function() { it('Should fire event.key when field value was changed', function() { const counter = []; const data = Jodit.modules.ObserveObject.create( getTestObject() ); data.on('change.some.element.one', function(key) { counter.push(key); }); data.editable = false; data.editable = false; data.some.element.two = 2; data.some.element.one = 2; expect(counter).to.deep.equal(['some.element.one']); }); it('Should fire event with old and new Value', function() { const counter = []; const data = Jodit.modules.ObserveObject.create( getTestObject() ); data.on('change.some.element.one', function(key, oldValue, newValue) { counter.push(key, oldValue, newValue); }); data.some.element.one = 2; data.some.element.one = 3; expect(counter).to.deep.equal([ 'some.element.one', 1, 2, 'some.element.one', 2, 3 ]); }); }); describe('Change watched property', function() { it('Should fire handler', function() { const counter = [], obj = { mode: 'top', methodA: function () { counter.push(obj.mode); } }; Jodit.decorators.watch('mode')(obj, 'methodA'); expect(obj.mode).equals('top'); obj.mode = 'left'; expect(obj.mode).equals('left'); expect(obj.mode).equals('left'); expect(counter).to.deep.equal([ 'left' ]); }); }); describe('Change whole branch', function() { it('Should fire event.key when field value was changed', function() { const counter = []; const data = Jodit.modules.ObserveObject.create( getTestObject() ); data.on(['change.some.element.test', 'change.some'], function( key ) { counter.push(key); }); data.some = { element: { test: 1 } }; data.some.element.test = 2; expect(counter).to.deep.equal([ 'some', 'some.element.test', 'some.element.test' ]); }); }); }); });