angular-material-npfixed
Version:
The Angular Material project is an implementation of Material Design in Angular.js. This project provides a set of reusable, well-tested, and accessible Material Design UI components. Angular Material is supported internally at Google by the Angular.js, M
569 lines (462 loc) • 20.5 kB
JavaScript
describe('md-colors', function () {
var $compile, $rootScope;
var $mdColorPalette, $mdTheming;
var supplant, scope;
var compiledElements = [];
var usesRGBA;
beforeEach(module('material.components.colors', function ($mdThemingProvider) {
$mdThemingProvider.theme('myTheme')
.primaryPalette('light-blue')
.accentPalette('yellow');
}));
beforeEach(inject(function ($injector) {
$compile = $injector.get('$compile');
$rootScope = $injector.get('$rootScope');
$mdColorPalette = $injector.get('$mdColorPalette');
$mdTheming = $injector.get('$mdTheming');
supplant = $injector.get('$mdUtil').supplant;
scope = $rootScope.$new();
checkColorMode();
}));
afterEach(function() {
compiledElements.forEach(function(element) {
element.remove();
});
compiledElements = [];
});
function buildColor(red, green, blue, opacity) {
if (angular.isDefined(opacity) || usesRGBA) {
return supplant('rgba({0}, {1}, {2}, {3})', [red, green, blue, opacity || 1]);
} else {
return supplant('rgb({0}, {1}, {2})', [red, green, blue]);
}
}
// Compiles a template and keeps track of the elements so they can be cleaned up properly.
function compile(template) {
var element = $compile(template)(scope);
compiledElements.push(element);
return element;
}
// Checks whether the current browser uses RGB or RGBA colors. This is
// necessary, because IE and Edge automatically convert RGB colors to RGBA.
function checkColorMode() {
if (angular.isUndefined(usesRGBA)) {
var testerElement = compile('<div md-colors="{background: \'red\'}" >');
usesRGBA = testerElement[0].style.background.indexOf('rgba') === 0;
}
}
describe('directive', function () {
function createElement(scope, options) {
var style = supplant("{theme}-{palette}-{hue}-{opacity}", {
attrs : options.attrs,
palette : options.palette,
theme : options.theme || 'default',
hue : options.hue || (options.palette === 'accent' ? 'A200' : '500'),
opacity : options.opacity || 1
});
var markup = supplant('<div md-colors="{background: \'{0}\'}" {1} ></div>', [style, options.attrs]);
var element = compile(markup);
scope.$apply(function() {
angular.element(document.body).append( element );
});
return element;
}
function setup(options) {
var hue = options.hue = options.hue || '500';
var element = createElement(scope, {
palette: options.palette,
hue: hue,
opacity: options.opacity,
theme: options.theme
});
var color = $mdColorPalette[options.palette][options.hue];
color = options.contrast ? color.contrast : color.value;
return {
elementStyle: element[0].style,
scope: scope,
color: color[3] || options.opacity ?
buildColor(color[0], color[1], color[2], color[3] || options.opacity) :
buildColor(color[0], color[1], color[2])
}
}
/**
* <div md-colors="{background: 'red'}" >
*/
it('should accept color palette', function () {
var build = setup({ palette: 'red' });
expect(build.elementStyle.background).toContain(build.color);
});
describe('two-worded palette', function () {
/**
* <div md-colors="{background: 'blue-grey'}" >
*/
it('should accept palette spliced with dash', function () {
var build = setup({ palette: 'blue-grey' });
expect(build.elementStyle.background).toContain(build.color);
});
/**
* <div md-colors="{background: 'blueGrey-200-0.8'}" >
*/
it('should accept palette formatted as camelCase', function () {
var element = createElement(scope, { palette: 'blueGrey', hue: '200', opacity: '0.8' });
var color = $mdColorPalette['blue-grey']['200'].value;
var expectedRGBa = buildColor(color[0], color[1], color[2], 0.8);
expect(element[0].style.background).toContain( expectedRGBa );
});
});
/**
* <div md-colors="{background: 'red-200'}" >
*/
it('should accept color palette and hue', function () {
var build = setup({ palette: 'red', hue: '200' });
expect(build.elementStyle.background).toContain(build.color);
});
/**
* <div md-colors="{background: 'red-200-0.8'}" >
*/
it('should accept color palette, hue and opacity', function () {
var build = setup({ palette: 'red', hue: '200', opacity: '0.8' });
expect(build.elementStyle.background).toContain(build.color);
});
/**
* md-colors applies smart foreground colors (in case 'background' property is used) according the palettes from
* https://www.google.com/design/spec/style/color.html#color-color-palette
*/
describe('foreground color', function () {
/**
* <div md-colors="{background: 'red'}" >
*/
it('should set background to red-500 and foreground color white', function () {
var build = setup({ palette: 'red', contrast: true });
expect(build.elementStyle.color).toContain(build.color);
});
/**
* <div md-colors="{background: 'red-50'}" >
*/
it('should set background to red-50 and foreground color black', function () {
var build = setup({ palette: 'red', hue: '50', contrast: true });
var elColor = build.elementStyle.color.replace('0588', ''); // hack to reduce 0.870588 to 0.87
expect(elColor).toContain(build.color);
});
});
describe('themes', function () {
/**
* <div md-colors="{background: 'primary'}">
*/
it('should accept primary palette', function() {
var type = 'primary';
var paletteName = $mdTheming.THEMES['default'].colors[type].name;
var color = $mdColorPalette[paletteName]['500'].value;
var expectedRGB = buildColor(color[0], color[1], color[2]);
var element = createElement(scope, { palette: type });
expect(element[0].style.background).toContain(expectedRGB);
});
/**
* <div md-colors="{background: 'accent'}" >
*/
it('should accept accent palette', function() {
var type = 'accent';
var paletteName = $mdTheming.THEMES['default'].colors[type].name;
var color = $mdColorPalette[paletteName]['A200'].value;
var expectedRGB = buildColor(color[0], color[1], color[2]);
var element = createElement(scope, { palette: type });
expect(element[0].style.background).toContain( expectedRGB );
});
/**
* <div md-colors="{background: 'warn'}" >
*/
it('should accept warn palette', function() {
var type = 'warn';
var paletteName = $mdTheming.THEMES['default'].colors[type].name;
var color = $mdColorPalette[paletteName]['500'].value;
var expectedRGB = buildColor(color[0], color[1], color[2]);
var element = createElement(scope, { palette: type });
expect(element[0].style.background).toContain( expectedRGB );
});
/**
* <div md-colors="{background: 'background'}"></div>
*/
it('should accept background palette', function() {
var type = 'background';
var paletteName = $mdTheming.THEMES['default'].colors[type].name;
var color = $mdColorPalette[paletteName]['500'].value;
var expectedRGB = buildColor(color[0], color[1], color[2]);
var element = createElement(scope, { palette: type });
expect(element[0].style.background).toContain( expectedRGB );
});
describe('hues', function () {
/**
* <div md-colors="{background: 'primary-hue-1'}">
*/
it('should accept primary color palette with hue 1', function() {
var type = 'primary';
var hue = 'hue-1';
var palette = $mdTheming.THEMES['default'].colors[type];
var paletteName = palette.name;
var paletteHue = palette.hues[hue];
var color = $mdColorPalette[paletteName][paletteHue].value;
var expectedRGB = buildColor(color[0], color[1], color[2]);
var element = createElement(scope, { palette: type, hue: hue });
expect( element[0].style.background ).toContain( expectedRGB );
});
/**
* <div md-colors="{background: 'primary-hue-2'}">
*/
it('should accept primary color palette with hue 2', function() {
var type = 'primary';
var hue = 'hue-2';
var palette = $mdTheming.THEMES['default'].colors[type];
var paletteName = palette.name;
var paletteHue = palette.hues[hue];
var color = $mdColorPalette[paletteName][paletteHue].value;
var expectedRGB = buildColor(color[0], color[1], color[2]);
var element = createElement(scope, { palette: type, hue: hue });
expect( element[0].style.background ).toContain(expectedRGB);
});
/**
* <div md-colors="{background: 'primary-hue-3'}">
*/
it('should accept primary color palette with hue 3', function() {
var type = 'primary';
var hue = 'hue-3';
var palette = $mdTheming.THEMES['default'].colors[type];
var paletteName = palette.name;
var paletteHue = palette.hues[hue];
var color = $mdColorPalette[paletteName][paletteHue].value;
var expectedRGB = buildColor(color[0], color[1], color[2]);
var element = createElement(scope, { palette: type, hue: hue });
expect(element[0].style.background).toContain(expectedRGB);
});
/**
* <div md-colors="{background: 'primary-hue-1-0.2'}">
*/
it('should accept primary color palette with hue 1 and 0.2 opacity', function() {
var type = 'primary';
var hue = 'hue-1';
var opacity = 0.2;
var palette = $mdTheming.THEMES['default'].colors[type];
var paletteName = palette.name;
var paletteHue = palette.hues[hue];
var color = $mdColorPalette[paletteName][paletteHue].value;
var expectedRGB = buildColor(color[0], color[1], color[2], opacity);
var element = createElement(scope, { palette: type, hue: hue, opacity: opacity });
expect(element[0].style.background).toContain(expectedRGB);
});
});
describe('custom themes', function () {
/**
* <div md-colors="{background: 'myTheme-primary-500'}" >
*/
it('should accept theme, color palette, and hue', function () {
var type = 'primary';
var paletteName = $mdTheming.THEMES['myTheme'].colors[type].name;
var color = $mdColorPalette[paletteName]['500'].value;
var expectedRGB = buildColor(color[0], color[1], color[2]);
var element = createElement(scope, { theme: 'myTheme', palette: type, hue: '500' });
expect(element[0].style.background).toContain( expectedRGB );
});
});
describe('mdColors integration', function () {
/**
* <div md-theme="myTheme">
* <div md-colors="{background: 'primary'}" >
* </div>
*/
it('should automatically inject myTheme as the theme prefix', function () {
var type = 'primary';
var paletteName = $mdTheming.THEMES['myTheme'].colors[type].name;
var color = $mdColorPalette[paletteName]['500'].value;
var expectedRGB = buildColor(color[0], color[1], color[2]);
var markup = '<div md-theme="myTheme"><div md-colors="{background: \'primary\'}" ></div></div>';
var element = compile(markup);
expect(element.children()[0].style.background).toContain( expectedRGB );
});
/**
* <div md-theme="{{theme}}">
* <div md-colors="{background: 'primary'}" >
* </div>
*/
it('should register for theme changes and inject myTheme as the theme prefix', function () {
var type = 'primary';
var paletteName = $mdTheming.THEMES['myTheme'].colors[type].name;
var color = $mdColorPalette[paletteName]['500'].value;
var expectedRGB = buildColor(color[0], color[1], color[2]);
scope.theme = 'myTheme';
var markup = '<div md-theme="{{theme}}"><div md-colors="{background: \'primary\'}" ></div></div>';
var element = compile(markup);
expect(element.children()[0].style.background).toContain( expectedRGB );
paletteName = $mdTheming.THEMES['default'].colors[type].name;
color = $mdColorPalette[paletteName]['500'].value;
expectedRGB = buildColor(color[0], color[1], color[2]);
scope.theme = 'default';
scope.$apply();
expect(element.children()[0].style.background).toContain( expectedRGB );
});
})
});
describe('watched values', function () {
/**
* <div md-colors="{background: 'default-{{color}}' }" >
*/
it('should accept interpolated value', function() {
var color = $mdColorPalette['red']['500'].value;
var expectedRGB = buildColor(color[0], color[1], color[2]);
scope.color = 'red';
var element = createElement(scope, { palette: '{{color}}' });
expect(element[0].style.background).toContain( expectedRGB );
scope.color = 'lightBlue-200-0.8';
scope.$apply();
color = $mdColorPalette['light-blue']['200'].value;
var expectedRGBa = buildColor(color[0], color[1], color[2], 0.8);
expect(element[0].style.background).toContain( expectedRGBa );
});
/**
* <div md-colors="{ background: color() }" >
*/
it('should accept function', function() {
var color = $mdColorPalette['light-blue']['200'].value;
var element = compile('<div md-colors="{background: color()}"></div>');
var expectedRGBa = buildColor(color[0], color[1], color[2], 0.8);
scope.color = function () {
return 'lightBlue-200-0.8';
};
scope.$apply();
expect(element[0].style.background).toContain( expectedRGBa );
});
/**
* <div md-colors="{ background: test ? 'red' : 'lightBlue' }" >
*/
it('should accept ternary value', inject(function($timeout) {
var element = compile('<div md-colors="{background: \'{{test ? \'red\' : \'lightBlue\'}}\'}"></div>');
var color = $mdColorPalette['light-blue']['500'].value;
var red = $mdColorPalette['red']['500'].value;
var expectedRGB = buildColor(color[0], color[1], color[2]);
scope.$apply(function() {
scope.test = false;
});
expect(element[0].style.background).toContain( expectedRGB );
scope.$apply(function() {
scope.test = true;
});
$timeout.flush();
expectedRGB = buildColor(red[0], red[1], red[2]);
expect(element[0].style.background).toContain( expectedRGB );
}));
describe('md-colors-watch', function () {
it('should watch if mdColorsWatch attribute is set (without value)', function () {
scope.color = 'red';
var color = $mdColorPalette['red']['500'].value;
var expectedRGB = buildColor(color[0], color[1], color[2]);
var element = createElement(scope, { palette: '{{color}}', attrs: 'md-colors-watch' });
expect(element[0].style.background).toContain( expectedRGB );
scope.$apply(function() {
scope.color = 'lightBlue-200-0.8';
});
color = $mdColorPalette['light-blue']['200'].value;
var expectedRGBa = buildColor(color[0], color[1], color[2], 0.8);
expect(element[0].style.background).toContain( expectedRGBa )
});
it('should not watch if mdColorsWatch attribute is set to false', function () {
scope.color = 'red';
var color = $mdColorPalette['red']['500'].value;
var expectedRGB = buildColor(color[0], color[1], color[2]);
var element = createElement(scope, { palette: '{{color}}', attrs: 'md-colors-watch="false"' });
expect(element[0].style.background).toContain( expectedRGB );
scope.$apply(function() {
scope.color = 'lightBlue-200-0.8';
});
expect(element[0].style.background).toContain( expectedRGB )
});
it('should watch if mdColorsWatch attribute is set to true', function () {
scope.$apply(function() {
scope.color = 'red';
});
var color = $mdColorPalette['red']['500'].value;
var element = createElement(scope, {
palette: '{{color}}',
attrs: 'md-colors-watch="true"'
});
var expectedRGB = buildColor(color[0], color[1], color[2]);
expect(element[0].style.background).toContain( expectedRGB );
scope.$apply(function() {
scope.color = 'lightBlue-200-0.8';
});
color = $mdColorPalette['light-blue']['200'].value;
var expectedRGBa = buildColor(color[0], color[1], color[2], '0.8');
expect(element[0].style.background).toContain( expectedRGBa );
});
});
describe('transition to empty object' , function () {
/**
* <div md-colors="{background: '{{color}}' }" >
*/
it('should delete old colors when getting an empty object', function() {
var element = compile('<div md-colors="{{color}}"></div>');
scope.color = '{background: \'red\'}';
scope.$apply();
var color = $mdColorPalette['red']['500'].value;
var expectedRGB = buildColor(color[0], color[1], color[2]);
expect(element[0].style.background).toContain( expectedRGB );
expect(element[0].style.color).not.toBe( '' );
scope.color = '{}';
scope.$apply();
expect(element[0].style.background).toBe( '' );
/**
* mdColors automatically sets the foreground colors according the material palette
* we make sure that even if the background was set (and the foreground automatically)
* we delete it.
*/
expect(element[0].style.color).toBe( '' );
});
})
});
describe('empty values', function () {
/**
* <div md-colors="" >
*/
it('should accept empty value and not color the element', function() {
var element = compile('<div md-colors=""></div>');
expect(element[0].style.background).toBe( '' );
});
/**
* <div md-colors="{}" >
*/
it('should accept empty object and not color the element', function() {
var element = compile('<div md-colors="{}"></div>');
expect(element[0].style.background).toBe( '' );
});
});
});
describe('service', function () {
it('should apply colors on an element', inject(function ($mdColors) {
var element = angular.element('<div></div>');
var color = $mdColorPalette['red']['200'].value;
var expectedRGB = buildColor(color[0], color[1], color[2]);
$mdColors.applyThemeColors(element, { background: 'red-200' });
expect(element[0].style.background).toContain( expectedRGB );
}));
it('should return the parsed color', inject(function ($mdColors) {
var color = $mdColorPalette['red']['200'].value;
var expectedRGB = buildColor(color[0], color[1], color[2], 1);
var themeColor = $mdColors.getThemeColor('red-200');
expect(themeColor).toBe( expectedRGB );
}));
describe('palette hues', function () {
it('should throw error on hue-4', inject(function ($mdColors) {
expect(function () {
$mdColors.getThemeColor('primary-hue-4')
}).toThrowError();
}));
it('should throw error on hue-0', inject(function ($mdColors) {
expect(function () {
$mdColors.getThemeColor('primary-hue-0')
}).toThrowError();
}));
it('should throw error on usage of defined palette and hue', inject(function ($mdColors) {
expect(function () {
$mdColors.getThemeColor('red-hue-1')
}).toThrowError();
}));
});
})
});