/
class-map_test.ts
110 lines (95 loc) · 3.8 KB
/
class-map_test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/**
* @license
* Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
* This code may only be used under the BSD style license found at
* http://polymer.github.io/LICENSE.txt
* The complete set of authors may be found at
* http://polymer.github.io/AUTHORS.txt
* The complete set of contributors may be found at
* http://polymer.github.io/CONTRIBUTORS.txt
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt
*/
/// <reference path="../../../node_modules/@types/mocha/index.d.ts" />
/// <reference path="../../../node_modules/@types/chai/index.d.ts" />
import {ClassInfo, classMap} from '../../directives/class-map.js';
import {render} from '../../lib/render.js';
import {html, svg} from '../../lit-html.js';
const assert = chai.assert;
suite('classMap', () => {
let container: HTMLDivElement;
function renderClassMap(cssInfo: ClassInfo) {
render(html`<div class="${classMap(cssInfo)}"></div>`, container);
}
function renderClassMapStatic(cssInfo: ClassInfo) {
render(html`<div class="aa ${classMap(cssInfo)} bb "></div>`, container);
}
setup(() => {
container = document.createElement('div');
});
test('adds classes', () => {
renderClassMap({foo: 0, bar: true, zonk: true});
const el = container.firstElementChild!;
assert.isFalse(el.classList.contains('foo'));
assert.isTrue(el.classList.contains('bar'));
assert.isTrue(el.classList.contains('zonk'));
});
test('removes classes', () => {
renderClassMap({foo: true, bar: true, baz: true});
const el = container.firstElementChild!;
assert.isTrue(el.classList.contains('foo'));
assert.isTrue(el.classList.contains('bar'));
assert.isTrue(el.classList.contains('baz'));
renderClassMap({foo: false, bar: true, baz: false});
assert.isFalse(el.classList.contains('foo'));
assert.isTrue(el.classList.contains('bar'));
assert.isFalse(el.classList.contains('baz'));
});
test('removes omitted classes', () => {
renderClassMap({foo: true, bar: true, baz: true});
const el = container.firstElementChild!;
assert.isTrue(el.classList.contains('foo'));
assert.isTrue(el.classList.contains('bar'));
assert.isTrue(el.classList.contains('baz'));
renderClassMap({});
assert.isFalse(el.classList.contains('foo'));
assert.isFalse(el.classList.contains('bar'));
assert.isFalse(el.classList.contains('baz'));
assert.equal(el.classList.length, 0);
});
test('works with static classes', () => {
renderClassMapStatic({foo: true});
const el = container.firstElementChild!;
assert.isTrue(el.classList.contains('aa'));
assert.isTrue(el.classList.contains('bb'));
assert.isTrue(el.classList.contains('foo'));
renderClassMapStatic({});
assert.isTrue(el.classList.contains('aa'));
assert.isTrue(el.classList.contains('bb'));
assert.isFalse(el.classList.contains('foo'));
});
test('adds classes on SVG elements', () => {
const cssInfo = {foo: 0, bar: true, zonk: true};
render(svg`<circle class="${classMap(cssInfo)}"></circle>`, container);
const el = container.firstElementChild!;
assert.isFalse(el.classList.contains('foo'));
assert.isTrue(el.classList.contains('bar'));
assert.isTrue(el.classList.contains('zonk'));
});
test('throws when used on non-class attribute', () => {
assert.throws(() => {
render(html`<div id="${classMap({})}"></div>`, container);
});
});
test('throws when used in attribute with more than 1 part', () => {
assert.throws(() => {
render(html`<div class="${'hi'} ${classMap({})}"></div>`, container);
});
});
test('throws when used in NodePart', () => {
assert.throws(() => {
render(html`<div>${classMap({})}</div>`, container);
});
});
});