[Refactor] Extend color scheme management to sequential schemes (#6150)

* refactor color scheme

* Update data structure

* Update color scheme files

* wip

* convert all sequential schemes

* Update how color schemes are managed. Extend it for sequential schemes

* extract color setup into separate file

* Update imports

* update imports

* Add new functions to Registry

* Update ColorSchemeManager to extends Registry and update unit tests

* Add test for Registry

* Rename ColorSchemeManager to ColorSchemeRegistry

* Fix unit tests

* Update API

* Fix imports

* Add label field

* Fix reference to colors

* update SequentialScheme contructor

* Fix controls

* rename manager to registry

* Split sequential schemes into multiple files

* update sequential color labels

* add values and valuesAsPromise()

* use .values()
This commit is contained in:
Krist Wongsuphasawat
2018-10-22 16:17:14 -07:00
committed by Chris Williams
parent a71e6eb0a3
commit b9257b2a09
45 changed files with 1090 additions and 836 deletions

View File

@@ -1,139 +0,0 @@
import ColorSchemeManager, {
getInstance,
getScheme,
getAllSchemes,
getDefaultSchemeName,
setDefaultSchemeName,
registerScheme,
registerMultipleSchemes,
} from '../../../src/modules/ColorSchemeManager';
describe('ColorSchemeManager', () => {
beforeEach(() => {
const m = getInstance();
m.clearScheme();
m.registerScheme('test', ['red', 'green', 'blue']);
m.registerScheme('test2', ['orange', 'yellow', 'pink']);
m.setDefaultSchemeName('test');
});
it('The class constructor cannot be accessed directly', () => {
expect(typeof ColorSchemeManager).not.toBe('Function');
});
describe('static getInstance()', () => {
it('returns a singleton instance', () => {
const m1 = getInstance();
const m2 = getInstance();
expect(m1).toBeDefined();
expect(m1).toBe(m2);
});
});
describe('.getScheme()', () => {
it('.getScheme() returns default color scheme', () => {
const scheme = getInstance().getScheme();
expect(scheme).toEqual(['red', 'green', 'blue']);
});
it('.getScheme(name) returns color scheme with specified name', () => {
const scheme = getInstance().getScheme('test2');
expect(scheme).toEqual(['orange', 'yellow', 'pink']);
});
});
describe('.getAllSchemes()', () => {
it('returns all registered schemes', () => {
const schemes = getInstance().getAllSchemes();
expect(schemes).toEqual({
test: ['red', 'green', 'blue'],
test2: ['orange', 'yellow', 'pink'],
});
});
});
describe('.getDefaultSchemeName()', () => {
it('returns default scheme name', () => {
const name = getInstance().getDefaultSchemeName();
expect(name).toBe('test');
});
});
describe('.setDefaultSchemeName()', () => {
it('set default scheme name', () => {
getInstance().setDefaultSchemeName('test2');
const name = getInstance().getDefaultSchemeName();
expect(name).toBe('test2');
getInstance().setDefaultSchemeName('test');
});
it('returns the ColorSchemeManager instance', () => {
const instance = getInstance().setDefaultSchemeName('test');
expect(instance).toBe(getInstance());
});
});
describe('.registerScheme(name, colors)', () => {
it('sets schemename and color', () => {
getInstance().registerScheme('test3', ['cyan', 'magenta']);
const scheme = getInstance().getScheme('test3');
expect(scheme).toEqual(['cyan', 'magenta']);
});
it('returns the ColorSchemeManager instance', () => {
const instance = getInstance().registerScheme('test3', ['cyan', 'magenta']);
expect(instance).toBe(getInstance());
});
});
describe('.registerMultipleSchemes(object)', () => {
it('sets multiple schemes at once', () => {
getInstance().registerMultipleSchemes({
test4: ['cyan', 'magenta'],
test5: ['brown', 'purple'],
});
const scheme1 = getInstance().getScheme('test4');
expect(scheme1).toEqual(['cyan', 'magenta']);
const scheme2 = getInstance().getScheme('test5');
expect(scheme2).toEqual(['brown', 'purple']);
});
it('returns the ColorSchemeManager instance', () => {
const instance = getInstance().registerMultipleSchemes({
test4: ['cyan', 'magenta'],
test5: ['brown', 'purple'],
});
expect(instance).toBe(getInstance());
});
});
describe('static getScheme()', () => {
it('is equivalent to getInstance().getScheme()', () => {
expect(getInstance().getScheme()).toBe(getScheme());
});
});
describe('static getAllSchemes()', () => {
it('is equivalent to getInstance().getAllSchemes()', () => {
expect(getInstance().getAllSchemes()).toBe(getAllSchemes());
});
});
describe('static getDefaultSchemeName()', () => {
it('is equivalent to getInstance().getDefaultSchemeName()', () => {
expect(getInstance().getDefaultSchemeName()).toBe(getDefaultSchemeName());
});
});
describe('static setDefaultSchemeName()', () => {
it('is equivalent to getInstance().setDefaultSchemeName()', () => {
setDefaultSchemeName('test2');
const name = getInstance().getDefaultSchemeName();
expect(name).toBe('test2');
setDefaultSchemeName('test');
});
});
describe('static registerScheme()', () => {
it('is equivalent to getInstance().registerScheme()', () => {
registerScheme('test3', ['cyan', 'magenta']);
const scheme = getInstance().getScheme('test3');
expect(scheme).toEqual(['cyan', 'magenta']);
});
});
describe('static registerMultipleSchemes()', () => {
it('is equivalent to getInstance().registerMultipleSchemes()', () => {
registerMultipleSchemes({
test4: ['cyan', 'magenta'],
test5: ['brown', 'purple'],
});
const scheme1 = getInstance().getScheme('test4');
expect(scheme1).toEqual(['cyan', 'magenta']);
const scheme2 = getInstance().getScheme('test5');
expect(scheme2).toEqual(['brown', 'purple']);
});
});
});

View File

@@ -17,6 +17,20 @@ describe('Registry', () => {
});
});
describe('.clear()', () => {
it('clears all registered items', () => {
const registry = new Registry();
registry.registerValue('a', 'testValue');
registry.clear();
expect(Object.keys(registry.items)).toHaveLength(0);
expect(Object.keys(registry.promises)).toHaveLength(0);
});
it('returns the registry itself', () => {
const registry = new Registry();
expect(registry.clear()).toBe(registry);
});
});
describe('.has(key)', () => {
it('returns true if an item with the given key exists', () => {
const registry = new Registry();
@@ -134,6 +148,34 @@ describe('Registry', () => {
);
});
describe('.getMap()', () => {
it('returns key-value map as plain object', () => {
const registry = new Registry();
registry.registerValue('a', 'cat');
registry.registerLoader('b', () => 'dog');
expect(registry.getMap()).toEqual({
a: 'cat',
b: 'dog',
});
});
});
describe('.getMapAsPromise()', () => {
it('returns a promise of key-value map', () => {
const registry = new Registry();
registry.registerValue('a', 'test1');
registry.registerLoader('b', () => 'test2');
registry.registerLoader('c', () => Promise.resolve('test3'));
return registry.getMapAsPromise().then((map) => {
expect(map).toEqual({
a: 'test1',
b: 'test2',
c: 'test3',
});
});
});
});
describe('.keys()', () => {
it('returns an array of keys', () => {
const registry = new Registry();
@@ -143,6 +185,34 @@ describe('Registry', () => {
});
});
describe('.values()', () => {
it('returns an array of values', () => {
const registry = new Registry();
registry.registerValue('a', 'test1');
registry.registerLoader('b', () => 'test2');
expect(registry.values()).toEqual([
'test1',
'test2',
]);
});
});
describe('.valuesAsPromise()', () => {
it('returns a Promise of an array { key, value }', () => {
const registry = new Registry();
registry.registerValue('a', 'test1');
registry.registerLoader('b', () => 'test2');
registry.registerLoader('c', () => Promise.resolve('test3'));
return registry.valuesAsPromise().then((entries) => {
expect(entries).toEqual([
'test1',
'test2',
'test3',
]);
});
});
});
describe('.entries()', () => {
it('returns an array of { key, value }', () => {
const registry = new Registry();

View File

@@ -3,13 +3,21 @@ import CategoricalColorNamespace, {
getScale,
getColor,
DEFAULT_NAMESPACE,
} from '../../../src/modules/CategoricalColorNamespace';
import { registerScheme } from '../../../src/modules/ColorSchemeManager';
} from '../../../../src/modules/colors/CategoricalColorNamespace';
import getCategoricalSchemeRegistry from '../../../../src/modules/colors/CategoricalSchemeRegistrySingleton';
import CategoricalScheme from '../../../../src/modules/colors/CategoricalScheme';
describe('CategoricalColorNamespace', () => {
beforeAll(() => {
registerScheme('testColors', ['red', 'green', 'blue']);
registerScheme('testColors2', ['red', 'green', 'blue']);
getCategoricalSchemeRegistry()
.registerValue('testColors', new CategoricalScheme({
name: 'testColors',
colors: ['red', 'green', 'blue'],
}))
.registerValue('testColors2', new CategoricalScheme({
name: 'testColors2',
colors: ['red', 'green', 'blue'],
}));
});
it('The class constructor cannot be accessed directly', () => {
expect(typeof CategoricalColorNamespace).not.toBe('Function');

View File

@@ -1,4 +1,4 @@
import CategoricalColorScale from '../../../src/modules/CategoricalColorScale';
import CategoricalColorScale from '../../../../src/modules/colors/CategoricalColorScale';
describe('CategoricalColorScale', () => {
it('exists', () => {

View File

@@ -0,0 +1,64 @@
import ColorSchemeRegistry from '../../../../src/modules/colors/ColorSchemeRegistry';
import CategoricalScheme from '../../../../src/modules/colors/CategoricalScheme';
describe('ColorSchemeRegistry', () => {
const registry = new ColorSchemeRegistry();
const SCHEME1 = new CategoricalScheme({
name: 'test',
colors: ['red', 'green', 'blue'],
});
const SCHEME2 = new CategoricalScheme({
name: 'test2',
colors: ['orange', 'yellow', 'pink'],
});
const SCHEME3 = new CategoricalScheme({
name: 'test3',
colors: ['cyan', 'magenta'],
});
beforeEach(() => {
registry.clear();
registry.registerValue('test', SCHEME1);
registry.registerValue('test2', SCHEME2);
registry.setDefaultSchemeName('test');
});
describe('.get()', () => {
it('.get() returns default color scheme', () => {
const scheme = registry.get();
expect(scheme).toEqual(SCHEME1);
});
it('.get(name) returns color scheme with specified name', () => {
const scheme = registry.get('test2');
expect(scheme).toEqual(SCHEME2);
});
});
describe('.getDefaultSchemeName()', () => {
it('returns default scheme name', () => {
const name = registry.getDefaultSchemeName();
expect(name).toBe('test');
});
});
describe('.setDefaultSchemeName()', () => {
it('set default scheme name', () => {
registry.setDefaultSchemeName('test2');
const name = registry.getDefaultSchemeName();
expect(name).toBe('test2');
registry.setDefaultSchemeName('test');
});
it('returns the ColorSchemeRegistry instance', () => {
const instance = registry.setDefaultSchemeName('test');
expect(instance).toBe(registry);
});
});
describe('.registerValue(name, colors)', () => {
it('sets schemename and color', () => {
registry.registerValue('test3', SCHEME3);
const scheme = registry.get('test3');
expect(scheme).toEqual(SCHEME3);
});
it('returns the ColorSchemeRegistry instance', () => {
const instance = registry.registerValue('test3', SCHEME3);
expect(instance).toBe(registry);
});
});
});