@antv/x6
Version:
JavaScript diagramming library that uses SVG and HTML for rendering.
137 lines • 5.99 kB
JavaScript
import { Vector } from '../vector';
import { hasClass, addClass, removeClass, toggleClass } from './class';
describe('Dom', () => {
describe('class', () => {
describe('hasClass', () => {
it('should return `false` when element or selector is null', () => {
expect(hasClass(null, null)).toBe(false);
});
it('should return `false` for invalid element', () => {
const text = document.createTextNode('');
addClass(text, 'test');
expect(hasClass(text, 'test')).toBe(false);
const vc = Vector.create(document.createComment(''));
vc.addClass('test');
expect(vc.hasClass('test')).toBe(false);
});
});
describe('#addClass', () => {
let div;
let vel;
beforeEach(() => {
div = Vector.create('div');
vel = Vector.create('g');
});
it('should add class to HTMLDivElement', () => {
div.addClass('test').addClass(null);
const cls = div.node.getAttribute('class');
expect(div.hasClass('test')).toBe(true);
expect(cls.indexOf('test') !== -1).toBe(true);
expect(div.attr('class')).toEqual('test');
});
it('should add class to SVGGElement', () => {
vel.addClass('test');
const cls = vel.node.getAttribute('class');
expect(vel.hasClass('test')).toBe(true);
expect(cls.indexOf('test') !== -1).toBe(true);
expect(vel.attr('class')).toEqual('test');
});
it('should append to class list', () => {
vel.attr('class', 'foo');
vel.addClass('test');
const cls = vel.node.getAttribute('class');
expect(vel.hasClass('test')).toBe(true);
expect(cls.indexOf('test') !== -1).toBe(true);
expect(vel.attr('class')).toEqual('foo test');
vel.addClass('foo bar baz');
expect(vel.attr('class')).toEqual('foo test bar baz');
});
it('should not add the same class twice in same element', () => {
div.addClass('foo').addClass('foo');
expect(div.attr('class')).toEqual('foo');
vel.addClass('foo foo');
expect(vel.attr('class')).toEqual('foo');
});
it('should not add empty string', () => {
vel.addClass('test');
vel.addClass(' ');
expect(vel.attr('class')).toEqual('test');
});
it('should call hook', () => {
vel.addClass('test');
vel.addClass(' ');
addClass(vel.node, (cls) => `${cls} foo`);
expect(vel.attr('class')).toEqual('test foo');
});
});
describe('#removeClass', () => {
const vel = Vector.create('g');
it('should remove one', () => {
vel.removeClass();
vel.addClass('foo bar');
vel.removeClass('foo test');
expect(vel.attr('class')).toEqual('bar');
});
it('should remove all', () => {
vel.removeClass();
vel.addClass('foo bar');
vel.removeClass();
expect(vel.attr('class')).toEqual('');
});
it('should call hook', () => {
vel.removeClass();
vel.addClass('foo bar');
removeClass(vel.node, (cls) => cls.split(' ')[1]);
expect(vel.attr('class')).toEqual('foo');
});
it('should do nothing for invalid element or selector', () => {
removeClass(null);
removeClass(null, null);
});
});
describe('#toggleClass', () => {
const vel = Vector.create('g');
it('should do nothing for invalid element or selector', () => {
toggleClass(null, 'foo');
toggleClass(null, null);
});
it('should toggle class', () => {
vel.removeClass();
vel.toggleClass('foo bar');
expect(vel.attr('class')).toEqual('foo bar');
vel.toggleClass('foo');
expect(vel.attr('class')).toEqual('bar');
vel.toggleClass('foo');
expect(vel.attr('class')).toEqual('bar foo');
});
it('should not toggle empty strings', () => {
vel.removeClass();
vel.toggleClass('foo bar');
expect(vel.attr('class')).toEqual('foo bar');
vel.toggleClass(' ');
expect(vel.attr('class')).toEqual('foo bar');
vel.toggleClass(' ');
expect(vel.attr('class')).toEqual('foo bar');
});
it('should work with the specified next state', () => {
vel.removeClass();
vel.toggleClass('foo bar');
expect(vel.attr('class')).toEqual('foo bar');
vel.toggleClass('foo', true);
expect(vel.attr('class')).toEqual('foo bar');
vel.toggleClass('foo', true);
expect(vel.attr('class')).toEqual('foo bar');
vel.toggleClass('foo', false);
expect(vel.attr('class')).toEqual('bar');
});
it('should call hook', () => {
vel.removeClass();
toggleClass(vel.node, () => 'foo bar');
expect(vel.attr('class')).toEqual('foo bar');
toggleClass(vel.node, () => 'foo', false);
expect(vel.attr('class')).toEqual('bar');
});
});
});
});
//# sourceMappingURL=class.test.js.map