Skip to content

Commit d4e4894

Browse files
committed
feature(wysiwyg): adding tests
1 parent 0505a73 commit d4e4894

File tree

4 files changed

+170
-11
lines changed

4 files changed

+170
-11
lines changed

apps/codelab/src/app/admin/content/presentation-editor/side-panel/side-panel.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export class SidePanelComponent implements OnInit, OnChanges {
6666
if (changes.slides) {
6767
this.slideIds = slideIdsMapper(changes.slides.currentValue);
6868

69-
this.selectionModel.setValues(this.slideIds);
69+
this.selectionModel.setItems(this.slideIds);
7070
}
7171
}
7272

apps/codelab/src/app/multiselect/multiselect-list.directive.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export class MultiselectListDirective<T> {
4040
}
4141

4242
if (event.key === 'a' && (event.ctrlKey || event.metaKey)) {
43-
this.msModel.selectAllItems();
43+
this.msModel.toggleAll();
4444

4545
event.preventDefault();
4646
}
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
import { MultiselectModel } from './multiselect-model';
2+
3+
describe('MultiselectModel', () => {
4+
let model: MultiselectModel<string>;
5+
6+
const item1 = 'a';
7+
const item2 = 'b';
8+
9+
const items = [item1, item2, 'c', 'd', 'e'];
10+
11+
beforeEach(() => {
12+
model = new MultiselectModel();
13+
14+
model.setItems(items);
15+
});
16+
17+
describe('single selections', () => {
18+
it('has empty selection initially', () => {
19+
expect(model.selected).toEqual([]);
20+
});
21+
22+
it('allows to select single element', () => {
23+
model.toggleSingle(item1);
24+
25+
expect(model.selected).toEqual([item1]);
26+
});
27+
28+
it('allows to deselect single element', () => {
29+
model.toggleSingle(item1);
30+
model.toggleSingle(item1);
31+
32+
expect(model.selected).toEqual([]);
33+
});
34+
35+
it('allows to reselect single element', () => {
36+
model.toggleSingle(item1);
37+
model.toggleSingle(item2);
38+
model.toggleSingle('c');
39+
model.toggleSingle(item2);
40+
41+
expect(model.selected).toEqual([item1, 'c']);
42+
});
43+
44+
it('allows to force select single element', () => {
45+
model.toggleSingle(item1);
46+
model.selectSingle(item2);
47+
48+
expect(model.selected).toEqual([item2]);
49+
});
50+
});
51+
52+
describe('selecting with shift', () => {
53+
it('allows to select multiple elements', () => {
54+
model.toggleSingle(item1);
55+
model.toggleContinuous('c');
56+
57+
expect(model.selected).toEqual([item1, item2, 'c']);
58+
});
59+
60+
it('allows to deselect multiple elements', () => {
61+
model.toggleSingle(item1);
62+
model.toggleSingle(item2);
63+
model.toggleSingle('c');
64+
model.toggleContinuous(item1);
65+
66+
expect(model.selected).toEqual([]);
67+
});
68+
69+
it('allows multiple selections and reselections', () => {
70+
model.toggleSingle(item1);
71+
model.toggleContinuous('e');
72+
73+
expect(model.selected).toEqual([item1, item2, 'c', 'd', 'e']);
74+
75+
model.toggleContinuous(item2);
76+
77+
expect(model.selected).toEqual([item1]);
78+
79+
model.toggleContinuous('d');
80+
81+
expect(model.selected).toEqual([item1, item2, 'c', 'd']);
82+
});
83+
84+
it('allows for selections in different directions', () => {
85+
model.toggleSingle('c');
86+
model.toggleContinuous('e');
87+
88+
expect(model.selected).toEqual(['c', 'd', 'e']);
89+
90+
model.toggleContinuous(item1);
91+
92+
expect(model.selected).toEqual(['c', 'd', 'e', 'a', 'b']);
93+
});
94+
95+
it('when handling gap selections, sets the value to the latest checked item', () => {
96+
model.toggleSingle(item1);
97+
model.toggleSingle('c');
98+
model.toggleSingle('e');
99+
model.toggleContinuous('c');
100+
101+
expect(model.selected).toEqual([item1]);
102+
});
103+
});
104+
105+
describe('toggleAll', () => {
106+
it('when nothing selected, selects everything', () => {
107+
model.toggleAll();
108+
109+
expect(model.selected).toEqual([item1, item2, 'c', 'd', 'e']);
110+
});
111+
112+
it('when some thing selected, selects everything', () => {
113+
model.toggleSingle(item1);
114+
model.toggleAll();
115+
116+
expect(model.selected).toEqual([item1, item2, 'c', 'd', 'e']);
117+
});
118+
119+
it('when everything selected, deselects everything', () => {
120+
model.toggleAll();
121+
model.toggleAll();
122+
123+
expect(model.selected).toEqual([]);
124+
});
125+
});
126+
127+
describe('clearAll', () => {
128+
it('selection is empty after clear', () => {
129+
model.clear();
130+
131+
expect(model.selected).toEqual([]);
132+
expect(model.isEmpty()).toEqual(true);
133+
});
134+
135+
it('drops the selection when some thing selected', () => {
136+
model.toggleSingle(item1);
137+
model.clear();
138+
139+
expect(model.selected).toEqual([]);
140+
});
141+
});
142+
143+
describe('emitChangeEvent', () => {
144+
it('should emit change event after selection', done => {
145+
const subscription = model.changed.subscribe(changes => {
146+
expect(changes).toEqual([item1]);
147+
done();
148+
});
149+
150+
model.toggleSingle(item1);
151+
152+
subscription.unsubscribe();
153+
});
154+
});
155+
});

apps/codelab/src/app/multiselect/multiselect-model.ts

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,26 @@ export class MultiselectModel<T> {
55

66
private stack: T[] = [];
77

8-
private values: T[] = [];
9-
108
changed = new Subject<T[]>();
119

10+
constructor(private items: T[] = []) {}
11+
1212
get selected(): T[] {
1313
return Array.from(this.selection.values());
1414
}
1515

16-
setValues(values: T[]): void {
17-
this.values = values;
16+
setItems(items: T[]): void {
17+
this.items = items;
1818
}
1919

2020
findBetween(item1: T, item2: T): T[] {
21-
const index1 = this.values.indexOf(item1);
22-
const index2 = this.values.indexOf(item2);
21+
const index1 = this.items.indexOf(item1);
22+
const index2 = this.items.indexOf(item2);
2323

2424
const numberOfItems = Math.abs(index1 - index2) + 1;
2525
const firstIndex = index1 < index2 ? index1 : index2;
2626

27-
return this.values.slice(firstIndex, firstIndex + numberOfItems);
27+
return this.items.slice(firstIndex, firstIndex + numberOfItems);
2828
}
2929

3030
toggleAllItems(items: T[], shouldSelect: boolean): void {
@@ -57,8 +57,12 @@ export class MultiselectModel<T> {
5757
this.stack.push(item);
5858
}
5959

60-
selectAllItems(): void {
61-
this.toggleAllItems(this.values, true);
60+
toggleAll(): void {
61+
if (this.selected.length === this.items.length) {
62+
this.clear();
63+
} else {
64+
this.toggleAllItems(this.items, true);
65+
}
6266
}
6367

6468
selectSingle(item: T): void {

0 commit comments

Comments
 (0)