78 lines
3.1 KiB
TypeScript
78 lines
3.1 KiB
TypeScript
import {isSelectorWithin, makeSelectorEmpty} from '../../../src/inject/dynamic-theme/selectors';
|
|
|
|
describe('Check if a selector is within another selector', () => {
|
|
it('Treats identical selector as within', () => {
|
|
expect(isSelectorWithin('.a', '.a')).toBe(true);
|
|
expect(isSelectorWithin('.a:hover', '.a:hover')).toBe(true);
|
|
});
|
|
|
|
it('Returns false when sub does not start with parent', () => {
|
|
expect(isSelectorWithin('.b', '.a')).toBe(false);
|
|
expect(isSelectorWithin('.a', '.a .b')).toBe(false);
|
|
});
|
|
|
|
it('Returns false when sub continues the same token', () => {
|
|
expect(isSelectorWithin('.ab', '.a')).toBe(false);
|
|
expect(isSelectorWithin('dividend', 'div')).toBe(false);
|
|
});
|
|
|
|
it('Treats same-element extensions as within', () => {
|
|
expect(isSelectorWithin('.a.b', '.a')).toBe(true);
|
|
expect(isSelectorWithin('.a:hover', '.a')).toBe(true);
|
|
expect(isSelectorWithin('.a::before', '.a')).toBe(true);
|
|
expect(isSelectorWithin('.a::after', '.a')).toBe(true);
|
|
expect(isSelectorWithin('.a:not(.x)', '.a')).toBe(true);
|
|
expect(isSelectorWithin('.a#id', '.a')).toBe(true);
|
|
expect(isSelectorWithin('.a[x]', '.a')).toBe(true);
|
|
expect(isSelectorWithin('.a[x="y"]', '.a')).toBe(true);
|
|
});
|
|
|
|
it('Treats descendants as within', () => {
|
|
expect(isSelectorWithin('.a .b', '.a')).toBe(true);
|
|
expect(isSelectorWithin('.a .b .c', '.a')).toBe(true);
|
|
});
|
|
|
|
it('Treats immediate child as within', () => {
|
|
expect(isSelectorWithin('.a > .b', '.a')).toBe(true);
|
|
expect(isSelectorWithin('.a>.b', '.a')).toBe(true);
|
|
expect(isSelectorWithin('.a >.b', '.a')).toBe(true);
|
|
expect(isSelectorWithin('.a> .b', '.a')).toBe(true);
|
|
});
|
|
|
|
it('Treats siblings as not within', () => {
|
|
expect(isSelectorWithin('.a + .b', '.a')).toBe(false);
|
|
expect(isSelectorWithin('.a+.b', '.a')).toBe(false);
|
|
expect(isSelectorWithin('.a ~ .b', '.a')).toBe(false);
|
|
expect(isSelectorWithin('.a~.b', '.a')).toBe(false);
|
|
});
|
|
|
|
it('Handle complex selectors', () => {
|
|
expect(isSelectorWithin('.a:hover .b', '.a')).toBe(true);
|
|
expect(isSelectorWithin('.a .b > .c', '.a')).toBe(true);
|
|
expect(isSelectorWithin('.a + .b .c', '.a')).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('Make selector empty', () => {
|
|
it('Should append :empty', () => {
|
|
expect(makeSelectorEmpty('.a')).toBe('.a:empty');
|
|
expect(makeSelectorEmpty('div.a')).toBe('div.a:empty');
|
|
expect(makeSelectorEmpty('.a .b')).toBe('.a .b:empty');
|
|
});
|
|
|
|
it('Should ignore already :empty selectors', () => {
|
|
expect(makeSelectorEmpty('.a:empty')).toBe('.a:empty');
|
|
});
|
|
|
|
it('Should treat :before and :after as empty', () => {
|
|
expect(makeSelectorEmpty('.a:before')).toBe('.a:before');
|
|
expect(makeSelectorEmpty('.a:after')).toBe('.a:after');
|
|
expect(makeSelectorEmpty('.a::before')).toBe('.a::before');
|
|
expect(makeSelectorEmpty('.a::after')).toBe('.a::after');
|
|
});
|
|
|
|
it('Should trim selectors', () => {
|
|
expect(makeSelectorEmpty(' .a ')).toBe('.a:empty');
|
|
});
|
|
});
|