Chart.js/test/specs/core.registry.tests.js
Jukka Kurkela 8d6e87881a
Relocate chart type and dataset type defaults (#8563)
* Relocate chart type and dataset type defaults

* Update types

* Separate overrides and descriptors

* Update derived sample, use merge for inherit

* Don't merge overrides

* Review update
2021-03-06 10:34:52 -05:00

270 lines
9.5 KiB
JavaScript

describe('Chart.registry', function() {
it('should handle an ES6 controller extension', function() {
class CustomController extends Chart.DatasetController {}
CustomController.id = 'custom';
CustomController.defaults = {
foo: 'bar'
};
CustomController.overrides = {
bar: 'foo'
};
Chart.register(CustomController);
expect(Chart.registry.getController('custom')).toEqual(CustomController);
expect(Chart.defaults.datasets.custom).toEqual(CustomController.defaults);
expect(Chart.overrides.custom).toEqual(CustomController.overrides);
Chart.unregister(CustomController);
expect(function() {
Chart.registry.getController('custom');
}).toThrow(new Error('"custom" is not a registered controller.'));
expect(Chart.overrides.custom).not.toBeDefined();
expect(Chart.defaults.datasets.custom).not.toBeDefined();
});
it('should handle an ES6 scale extension', function() {
class CustomScale extends Chart.Scale {}
CustomScale.id = 'es6Scale';
CustomScale.defaults = {
foo: 'bar'
};
Chart.register(CustomScale);
expect(Chart.registry.getScale('es6Scale')).toEqual(CustomScale);
expect(Chart.defaults.scales.es6Scale).toEqual(CustomScale.defaults);
Chart.unregister(CustomScale);
expect(function() {
Chart.registry.getScale('es6Scale');
}).toThrow(new Error('"es6Scale" is not a registered scale.'));
expect(Chart.defaults.scales.es6Scale).not.toBeDefined();
});
it('should handle an ES6 element extension', function() {
class CustomElement extends Chart.Element {}
CustomElement.id = 'es6element';
CustomElement.defaults = {
foo: 'bar'
};
Chart.register(CustomElement);
expect(Chart.registry.getElement('es6element')).toEqual(CustomElement);
expect(Chart.defaults.elements.es6element).toEqual(CustomElement.defaults);
Chart.unregister(CustomElement);
expect(function() {
Chart.registry.getElement('es6element');
}).toThrow(new Error('"es6element" is not a registered element.'));
expect(Chart.defaults.elements.es6element).not.toBeDefined();
});
it('should handle an ES6 plugin', function() {
class CustomPlugin {}
CustomPlugin.id = 'es6plugin';
CustomPlugin.defaults = {
foo: 'bar'
};
Chart.register(CustomPlugin);
expect(Chart.registry.getPlugin('es6plugin')).toEqual(CustomPlugin);
expect(Chart.defaults.plugins.es6plugin).toEqual(CustomPlugin.defaults);
Chart.unregister(CustomPlugin);
expect(function() {
Chart.registry.getPlugin('es6plugin');
}).toThrow(new Error('"es6plugin" is not a registered plugin.'));
expect(Chart.defaults.plugins.es6plugin).not.toBeDefined();
});
it('should not accept an object without id', function() {
expect(function() {
Chart.register({foo: 'bar'});
}).toThrow(new Error('class does not have id: bar'));
class FaultyPlugin {}
expect(function() {
Chart.register(FaultyPlugin);
}).toThrow(new Error('class does not have id: class FaultyPlugin {}'));
});
it('should not fail when unregistering an object that is not registered', function() {
expect(function() {
Chart.unregister({id: 'foo'});
}).not.toThrow();
});
describe('Should allow registering explicitly', function() {
class customExtension {}
customExtension.id = 'custom';
customExtension.defaults = {
prop: true
};
it('as controller', function() {
Chart.registry.addControllers(customExtension);
expect(Chart.registry.getController('custom')).toEqual(customExtension);
expect(Chart.defaults.datasets.custom).toEqual(customExtension.defaults);
Chart.registry.removeControllers(customExtension);
expect(function() {
Chart.registry.getController('custom');
}).toThrow(new Error('"custom" is not a registered controller.'));
expect(Chart.defaults.datasets.custom).not.toBeDefined();
});
it('as scale', function() {
Chart.registry.addScales(customExtension);
expect(Chart.registry.getScale('custom')).toEqual(customExtension);
expect(Chart.defaults.scales.custom).toEqual(customExtension.defaults);
Chart.registry.removeScales(customExtension);
expect(function() {
Chart.registry.getScale('custom');
}).toThrow(new Error('"custom" is not a registered scale.'));
expect(Chart.defaults.scales.custom).not.toBeDefined();
});
it('as element', function() {
Chart.registry.addElements(customExtension);
expect(Chart.registry.getElement('custom')).toEqual(customExtension);
expect(Chart.defaults.elements.custom).toEqual(customExtension.defaults);
Chart.registry.removeElements(customExtension);
expect(function() {
Chart.registry.getElement('custom');
}).toThrow(new Error('"custom" is not a registered element.'));
expect(Chart.defaults.elements.custom).not.toBeDefined();
});
it('as plugin', function() {
Chart.registry.addPlugins(customExtension);
expect(Chart.registry.getPlugin('custom')).toEqual(customExtension);
expect(Chart.defaults.plugins.custom).toEqual(customExtension.defaults);
Chart.registry.removePlugins(customExtension);
expect(function() {
Chart.registry.getPlugin('custom');
}).toThrow(new Error('"custom" is not a registered plugin.'));
expect(Chart.defaults.plugins.custom).not.toBeDefined();
});
});
it('should fire before/after callbacks', function() {
let beforeRegisterCount = 0;
let afterRegisterCount = 0;
let beforeUnregisterCount = 0;
let afterUnregisterCount = 0;
class custom {}
custom.id = 'custom';
custom.beforeRegister = () => beforeRegisterCount++;
custom.afterRegister = () => afterRegisterCount++;
custom.beforeUnregister = () => beforeUnregisterCount++;
custom.afterUnregister = () => afterUnregisterCount++;
Chart.registry.addControllers(custom);
expect(beforeRegisterCount).withContext('beforeRegister').toBe(1);
expect(afterRegisterCount).withContext('afterRegister').toBe(1);
Chart.registry.removeControllers(custom);
expect(beforeUnregisterCount).withContext('beforeUnregister').toBe(1);
expect(afterUnregisterCount).withContext('afterUnregister').toBe(1);
Chart.registry.addScales(custom);
expect(beforeRegisterCount).withContext('beforeRegister').toBe(2);
expect(afterRegisterCount).withContext('afterRegister').toBe(2);
Chart.registry.removeScales(custom);
expect(beforeUnregisterCount).withContext('beforeUnregister').toBe(2);
expect(afterUnregisterCount).withContext('afterUnregister').toBe(2);
Chart.registry.addElements(custom);
expect(beforeRegisterCount).withContext('beforeRegister').toBe(3);
expect(afterRegisterCount).withContext('afterRegister').toBe(3);
Chart.registry.removeElements(custom);
expect(beforeUnregisterCount).withContext('beforeUnregister').toBe(3);
expect(afterUnregisterCount).withContext('afterUnregister').toBe(3);
Chart.register(custom);
expect(beforeRegisterCount).withContext('beforeRegister').toBe(4);
expect(afterRegisterCount).withContext('afterRegister').toBe(4);
Chart.unregister(custom);
expect(beforeUnregisterCount).withContext('beforeUnregister').toBe(4);
expect(afterUnregisterCount).withContext('afterUnregister').toBe(4);
});
it('should preserve existing defaults', function() {
Chart.defaults.datasets.test = {test1: true, test3: false};
Chart.overrides.test = {testA: true, testC: false};
class testController extends Chart.DatasetController {}
testController.id = 'test';
testController.defaults = {test1: false, test2: true};
testController.overrides = {testA: false, testB: true};
Chart.register(testController);
expect(Chart.defaults.datasets.test).toEqual({test1: false, test2: true, test3: false});
expect(Chart.overrides.test).toEqual({testA: false, testB: true, testC: false});
Chart.unregister(testController);
expect(Chart.defaults.datasets.test).not.toBeDefined();
expect(Chart.overrides.test).not.toBeDefined();
});
describe('should handle multiple items', function() {
class test1 extends Chart.DatasetController {}
test1.id = 'test1';
class test2 extends Chart.Scale {}
test2.id = 'test2';
it('separately', function() {
Chart.register(test1, test2);
expect(Chart.registry.getController('test1')).toEqual(test1);
expect(Chart.registry.getScale('test2')).toEqual(test2);
Chart.unregister(test1, test2);
expect(function() {
Chart.registry.getController('test1');
}).toThrow();
expect(function() {
Chart.registry.getScale('test2');
}).toThrow();
});
it('as array', function() {
Chart.register([test1, test2]);
expect(Chart.registry.getController('test1')).toEqual(test1);
expect(Chart.registry.getScale('test2')).toEqual(test2);
Chart.unregister([test1, test2]);
expect(function() {
Chart.registry.getController('test1');
}).toThrow();
expect(function() {
Chart.registry.getScale('test2');
}).toThrow();
});
it('as object', function() {
Chart.register({test1, test2});
expect(Chart.registry.getController('test1')).toEqual(test1);
expect(Chart.registry.getScale('test2')).toEqual(test2);
Chart.unregister({test1, test2});
expect(function() {
Chart.registry.getController('test1');
}).toThrow();
expect(function() {
Chart.registry.getScale('test2');
}).toThrow();
});
});
});