discombobulator 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/package.json +16 -0
  2. package/src/articulation.mjs +61 -0
  3. package/src/articulationset.mjs +20 -0
  4. package/src/chord.mjs +82 -0
  5. package/src/cross.mjs +133 -0
  6. package/src/disco.mjs +14 -0
  7. package/src/element.mjs +51 -0
  8. package/src/group.mjs +70 -0
  9. package/src/groupset.mjs +259 -0
  10. package/src/instrument.mjs +105 -0
  11. package/src/instrumentset.mjs +20 -0
  12. package/src/irregulargroupset.mjs +224 -0
  13. package/src/note.mjs +155 -0
  14. package/src/noteset.mjs +21 -0
  15. package/src/pattern.mjs +52 -0
  16. package/src/patternset.mjs +20 -0
  17. package/src/patternsource.mjs +21 -0
  18. package/src/permute.mjs +63 -0
  19. package/src/regulargroupset.mjs +120 -0
  20. package/src/schedule.mjs +88 -0
  21. package/src/schema.mjs +108 -0
  22. package/src/set.mjs +1159 -0
  23. package/src/test/articulation.mjs +66 -0
  24. package/src/test/articulationset.mjs +43 -0
  25. package/src/test/binaryoperator.mjs +210 -0
  26. package/src/test/chord.mjs +292 -0
  27. package/src/test/concolour.mjs +70 -0
  28. package/src/test/difference.mjs +492 -0
  29. package/src/test/element.mjs +66 -0
  30. package/src/test/group.mjs +79 -0
  31. package/src/test/groupset.mjs +43 -0
  32. package/src/test/instrument.mjs +66 -0
  33. package/src/test/instrumentset.mjs +43 -0
  34. package/src/test/intersection.mjs +493 -0
  35. package/src/test/irregulargroupset.mjs +461 -0
  36. package/src/test/note.mjs +367 -0
  37. package/src/test/noteset.mjs +43 -0
  38. package/src/test/operator.mjs +63 -0
  39. package/src/test/pattern.mjs +113 -0
  40. package/src/test/patternset.mjs +43 -0
  41. package/src/test/patternsource.mjs +43 -0
  42. package/src/test/regulargroupset.mjs +290 -0
  43. package/src/test/repl.mjs +63 -0
  44. package/src/test/replinit.mjs +134 -0
  45. package/src/test/rotation.mjs +753 -0
  46. package/src/test/schedule.mjs +275 -0
  47. package/src/test/schema.mjs +333 -0
  48. package/src/test/set.mjs +1081 -0
  49. package/src/test/symmetricdifference.mjs +495 -0
  50. package/src/test/test.mjs +208 -0
  51. package/src/test/testing.mjs +63 -0
  52. package/src/test/union.mjs +495 -0
  53. package/src/util.mjs +21 -0
@@ -0,0 +1,1081 @@
1
+ // set.mjs
2
+ //
3
+ // Tests for set.mjs.
4
+
5
+ import { expect, expectException } from './testing.mjs'
6
+
7
+ import { Instrument, Instruments } from '../instrument.mjs'
8
+ import { Articulations } from '../articulation.mjs'
9
+ import { Set } from '../set.mjs'
10
+ import { ArticulationSet } from '../articulationset.mjs'
11
+ import { InstrumentSet } from '../instrumentset.mjs'
12
+ import { Note } from '../note.mjs'
13
+ import { NoteSet } from '../noteset.mjs'
14
+ import { Chord } from '../chord.mjs'
15
+ import { Pattern } from '../pattern.mjs'
16
+ import { PatternSet } from '../patternset.mjs'
17
+ import { Schedule } from '../schedule.mjs'
18
+ import { Group } from '../group.mjs'
19
+ import { RegularGroupSet } from '../regulargroupset.mjs'
20
+
21
+ export const test = {
22
+ tests: [
23
+ {
24
+ title: "default constructor results in correct set",
25
+ test: () => {
26
+ let set = new Set();
27
+
28
+ expect(set.isAbstract, false);
29
+ expect(set.allowDuplicates, false);
30
+ expect(set.size, 0);
31
+ },
32
+ },
33
+ {
34
+ title: "constructor correctly initialises isAbstract",
35
+ test: () => {
36
+ let set = new Set({ isAbstract: true });
37
+
38
+ expect(set.isAbstract, true);
39
+ },
40
+ },
41
+ {
42
+ title: "constructor correctly initialises allowDuplicates",
43
+ test: () => {
44
+ let set = new Set({ allowDuplicates: true });
45
+
46
+ expect(set.allowDuplicates, true);
47
+ },
48
+ },
49
+
50
+ {
51
+ title: "isElementAllowed returns undefined for undefined element",
52
+ test: () => {
53
+ const set = new Set();
54
+
55
+ expect(set.isElementAllowed(), (result) => { return result === undefined; });
56
+ },
57
+ },
58
+ {
59
+ title: "isElementAllowed returns undefined for non-Element based object",
60
+ test: () => {
61
+ const set = new Set();
62
+ const element = new Error();
63
+
64
+ expect(set.isElementAllowed(element), (result) => { return result === undefined; });
65
+ },
66
+ },
67
+ {
68
+ title: "isElementAllowed allows any element type if allowedElements is undefined",
69
+ test: () => {
70
+ const set = new Set();
71
+ const element = new Instrument();
72
+
73
+ expect(set.isElementAllowed(element), (result) => { return result === element; });
74
+ },
75
+ },
76
+ {
77
+ title: "isElementAllowed allows any element type from defined allowedElements",
78
+ test: () => {
79
+ const set = new Schedule();
80
+ const element = new Pattern();
81
+ const other = new PatternSet();
82
+
83
+ expect(set.isElementAllowed(element), (result) => { return result === element; });
84
+ expect(set.isElementAllowed(other), (result) => { return result === other; });
85
+ },
86
+ },
87
+ {
88
+ title: "isElementAllowed undefined for element type that can't be promoted",
89
+ test: () => {
90
+ const set = new Schedule();
91
+ const element = new Group(1, 1);
92
+
93
+ expect(set.isElementAllowed(element), (result) => { return result === undefined; });
94
+ },
95
+ },
96
+ {
97
+ title: "isElementAllowed correctly allows element that can be promoted",
98
+ test: () => {
99
+ const set = new Chord();
100
+
101
+ expect(set.isElementAllowed(Instruments.Snare), (result) => { return result !== undefined && result instanceof Note; });
102
+ },
103
+ },
104
+
105
+ {
106
+ title: "add element fails on an immutable set",
107
+ test: () => {
108
+ let set = new RegularGroupSet();
109
+ let group = new Group(1, 1);
110
+
111
+ expectException(() => { set.add(group) }, Error);
112
+ },
113
+ },
114
+ {
115
+ title: "add element succeeds adding single element to a mutable set (without promotion)",
116
+ test: () => {
117
+ let set = new InstrumentSet();
118
+
119
+ expect(set.add(Instruments.Snare), (result) => { return result === set; });
120
+ expect(set.size, 1);
121
+ },
122
+ },
123
+ {
124
+ title: "add element succeeds adding multiple elements to a mutable set (without promotion)",
125
+ test: () => {
126
+ let set = new InstrumentSet({ add: Instruments.Bass1});
127
+
128
+ expect(set.add(Instruments.Snare), (result) => { return result === set; });
129
+ expect(set.size, 2);
130
+ },
131
+ },
132
+ {
133
+ title: "add element succeeds adding single element array of elements to a mutable set (without promotion)",
134
+ test: () => {
135
+ let set = new InstrumentSet();
136
+
137
+ expect(set.add([ Instruments.Snare ]), (result) => { return result === set; });
138
+ expect(set.size, 1);
139
+ },
140
+ },
141
+ {
142
+ title: "add element succeeds adding multiple element array of elements to a mutable set (without promotion)",
143
+ test: () => {
144
+ let set = new InstrumentSet();
145
+
146
+ expect(set.add([ Instruments.Snare, Instruments.Bass1 ]), (result) => { return result === set; });
147
+ expect(set.size, 2);
148
+ },
149
+ },
150
+ {
151
+ title: "add element succeeds adding single element to a mutable set (with promotion)",
152
+ test: () => {
153
+ let set = new Chord();
154
+
155
+ expect(set.add(Instruments.Snare), (result) => { return result === set; });
156
+ expect(set.size, 1);
157
+ expect(set.elements[0], (result) => { return result instanceof Note; });
158
+ },
159
+ },
160
+ {
161
+ title: "add element succeeds adding multiple elements to a mutable set (with promotion)",
162
+ test: () => {
163
+ let set = new Chord({ add: Instruments.Bass1});
164
+
165
+ expect(set.add(Instruments.Snare), (result) => { return result === set; });
166
+ expect(set.size, 2);
167
+ expect(set.elements[0], (result) => { return result instanceof Note; });
168
+ expect(set.elements[1], (result) => { return result instanceof Note; });
169
+ },
170
+ },
171
+ {
172
+ title: "add element succeeds adding single element array of elements to a mutable set (with promotion)",
173
+ test: () => {
174
+ let set = new Chord();
175
+
176
+ expect(set.add([ Instruments.Snare ]), (result) => { return result === set; });
177
+ expect(set.size, 1);
178
+ expect(set.elements[0], (result) => { return result instanceof Note; });
179
+ },
180
+ },
181
+ {
182
+ title: "add element succeeds adding multiple element array of elements to a mutable set (with promotion)",
183
+ test: () => {
184
+ let set = new Chord();
185
+
186
+ expect(set.add([ Instruments.Snare, Instruments.Bass1 ]), (result) => { return result === set; });
187
+ expect(set.size, 2);
188
+ expect(set.elements[0], (result) => { return result instanceof Note; });
189
+ expect(set.elements[1], (result) => { return result instanceof Note; });
190
+ },
191
+ },
192
+
193
+ {
194
+ title: "constructor correctly adds a single element",
195
+ test: () => {
196
+ let set = new Set({ add: new Instrument("test") });
197
+
198
+ expect(set.size, 1);
199
+ expect(set.elements[0] instanceof Instrument, true);
200
+ expect(set.elements[0].symbol === Symbol.for("test"), true);
201
+ },
202
+ },
203
+ {
204
+ title: "constructor correctly adds multiple unique elements",
205
+ test: () => {
206
+ let set = new Set({ add: [ new Instrument("test"), new Instrument("other") ] });
207
+
208
+ expect(set.size, 2);
209
+ expect(set.elements[0] instanceof Instrument, true);
210
+ expect(set.elements[0].symbol === Symbol.for("test"), true);
211
+ expect(set.elements[1] instanceof Instrument, true);
212
+ expect(set.elements[1].symbol === Symbol.for("other"), true);
213
+ },
214
+ },
215
+ {
216
+ title: "constructor correctly adds multiple equal elements",
217
+ test: () => {
218
+ let set = new Set({ add: [ new Instrument("test"), new Instrument("test") ] });
219
+
220
+ expect(set.size, 1);
221
+ expect(set.elements[0] instanceof Instrument, true);
222
+ expect(set.elements[0].symbol === Symbol.for("test"), true);
223
+ },
224
+ },
225
+ {
226
+ title: "constructor correctly adds multiple equal elements with allowDuplicates",
227
+ test: () => {
228
+ let set = new Set({ allowDuplicates: true, add: [ new Instrument("test"), new Instrument("test") ] });
229
+
230
+ expect(set.size, 2);
231
+ expect(set.elements[0] instanceof Instrument, true);
232
+ expect(set.elements[0].symbol === Symbol.for("test"), true);
233
+ expect(set.elements[1] instanceof Instrument, true);
234
+ expect(set.elements[1].symbol === Symbol.for("test"), true);
235
+ },
236
+ },
237
+ {
238
+ title: "constructor correctly adds multiple unique elements with allowDuplicates",
239
+ test: () => {
240
+ let set = new Set({ allowDuplicates: true, add: [ new Instrument("test"), new Instrument("other") ] });
241
+
242
+ expect(set.size, 2);
243
+ expect(set.elements[0] instanceof Instrument, true);
244
+ expect(set.elements[0].symbol === Symbol.for("test"), true);
245
+ expect(set.elements[1] instanceof Instrument, true);
246
+ expect(set.elements[1].symbol === Symbol.for("other"), true);
247
+ },
248
+ },
249
+
250
+ {
251
+ title: "promote succeeds for self",
252
+ test: () => {
253
+ const set = new Set();
254
+
255
+ expect(set.promote(set), (result) => { return result === set; });
256
+ },
257
+ },
258
+ {
259
+ title: "promote succeeds for two different element instances",
260
+ test: () => {
261
+ const set = new Set();
262
+ const other = new Set();
263
+
264
+ expect(set.promote(other), (result) => { return result === other; });
265
+ },
266
+ },
267
+ {
268
+ title: "promote succeeds for different (element-derived) class when no allowedElements defined",
269
+ test: () => {
270
+ const set = new Set();
271
+ const other = new Instrument();
272
+
273
+ expect(set.promote(other), (result) => { return result === other; });
274
+ },
275
+ },
276
+
277
+ {
278
+ title: "isEqual fails when compared with set of different size",
279
+ test: () => {
280
+ const set = new Set({add: [ Instruments.Snare ]});
281
+ const other = new Set({add: [ Instruments.Snare, Instruments.Bass1 ]});
282
+
283
+ expect(set.isEqual(other), false);
284
+ },
285
+ },
286
+ {
287
+ title: "isEqual succeeds when comparing identical sets",
288
+ test: () => {
289
+ const set = new InstrumentSet({add: [ Instruments.Snare, Instruments.Bass1 ]});
290
+ const other = new InstrumentSet({add: [ Instruments.Snare, Instruments.Bass1 ]});
291
+
292
+ expect(set.isEqual(other), true);
293
+ },
294
+ },
295
+ {
296
+ title: "isEqual fails when comparing different sets of the same size",
297
+ test: () => {
298
+ const set = new InstrumentSet({add: [ Instruments.Snare, Instruments.Bass1 ]});
299
+ const other = new InstrumentSet({add: [ Instruments.Snare, Instruments.Claves ]});
300
+
301
+ expect(set.isEqual(other), false);
302
+ },
303
+ },
304
+
305
+ {
306
+ title: "iterator yields nothing for an empty set",
307
+ test: () => {
308
+ const set = new Set();
309
+ let count = 0;
310
+
311
+ for (const e of set) { ++count; }
312
+
313
+ expect(count, 0);
314
+ },
315
+ },
316
+ {
317
+ title: "iterator yields correct results for a non-empty set",
318
+ test: () => {
319
+ const elements = [ Instruments.Snare, Instruments.Bass1 ];
320
+ const set = new Set({add: elements});
321
+ let count = 0;
322
+
323
+ for (const e of set) {
324
+ expect(e, (result) => { return result === elements[count++]; });
325
+ }
326
+
327
+ expect(count, 2);
328
+ },
329
+ },
330
+
331
+ {
332
+ title: "SetOf throws error with undefined argument",
333
+ test: () => {
334
+ let setof;
335
+
336
+ expectException(() => new Set.SetOf(), Error);
337
+ },
338
+ },
339
+ {
340
+ title: "SetOf constructs throws Error with non-Element derived argument",
341
+ test: () => {
342
+ let setof = undefined;
343
+
344
+ expectException(() => { setof = new Set.SetOf(Error); }, Error);
345
+ },
346
+ },
347
+ {
348
+ title: "SetOf correctly constructs with single Element-derived type (shallow)",
349
+ test: () => {
350
+ let setof = new Set.SetOf(Pattern);
351
+
352
+ expect(setof.setof.length, 1);
353
+ expect(setof.setof[0] === Pattern, true);
354
+ },
355
+ },
356
+ {
357
+ title: "SetOf correctly constructs with single Element-derived type (deep)",
358
+ test: () => {
359
+ let setof = new Set.SetOf(Pattern, true);
360
+
361
+ expect(setof.setof.length, 1);
362
+ expect(setof.setof[0] instanceof Set.SetOf, true);
363
+ expect(setof.setof[0].setof.length, 1);
364
+ expect(setof.setof[0].setof[0] instanceof Set.SetOf, true);
365
+ expect(setof.setof[0].setof[0].setof.length, 1);
366
+ expect(setof.setof[0].setof[0].setof[0] === Note, true);
367
+ },
368
+ },
369
+ {
370
+ title: "SetOf correctly constructs with array of Element-derived types (shallow)",
371
+ test: () => {
372
+ let setof = new Set.SetOf([ Instrument, Pattern ]);
373
+
374
+ expect(setof.setof.length, 2);
375
+ expect(setof.setof[0] === Instrument, true);
376
+ expect(setof.setof[1] === Pattern, true);
377
+ },
378
+ },
379
+ {
380
+ title: "SetOf correctly constructs with array of Element-derived types (deep)",
381
+ test: () => {
382
+ let setof = new Set.SetOf([ Instrument, Pattern ], true);
383
+
384
+ expect(setof.setof.length, 2);
385
+ expect(setof.setof[0] === Instrument, true);
386
+ expect(setof.setof[1] instanceof Set.SetOf, true);
387
+ expect(setof.setof[1].setof.length, 1);
388
+ expect(setof.setof[1].setof[0] instanceof Set.SetOf, true);
389
+ expect(setof.setof[1].setof[0].setof.length, 1);
390
+ expect(setof.setof[1].setof[0].setof[0] === Note, true);
391
+ },
392
+ },
393
+
394
+ {
395
+ title: "SetOf.equals fails with setofs of different lengths",
396
+ test: () => {
397
+ let setof = new Set.SetOf(Instrument);
398
+ let other = new Set.SetOf([ Instrument, Pattern ]);
399
+
400
+ expect(setof.equals(other), false);
401
+ },
402
+ },
403
+ {
404
+ title: "SetOf.equals fails with different single-element setofs (shallow)",
405
+ test: () => {
406
+ let setof = new Set.SetOf(Instrument);
407
+ let other = new Set.SetOf(Pattern);
408
+
409
+ expect(setof.equals(other), false);
410
+ },
411
+ },
412
+ {
413
+ title: "SetOf.equals succeeds with same single-element setofs (shallow)",
414
+ test: () => {
415
+ let setof = new Set.SetOf(Instrument);
416
+ let other = new Set.SetOf(Instrument);
417
+
418
+ expect(setof.equals(other), true);
419
+ },
420
+ },
421
+ {
422
+ title: "SetOf.equals fails with different multiple-element setofs (shallow)",
423
+ test: () => {
424
+ let setof = new Set.SetOf([ Instrument, Pattern ]);
425
+ let other = new Set.SetOf([ Note, Pattern ]);
426
+
427
+ expect(setof.equals(other), false);
428
+ },
429
+ },
430
+ {
431
+ title: "SetOf.equals succeeds with same multiple-element setofs (shallow)",
432
+ test: () => {
433
+ let setof = new Set.SetOf([ Instrument, Pattern ]);
434
+ let other = new Set.SetOf([ Instrument, Pattern ]);
435
+
436
+ expect(setof.equals(other), true);
437
+ },
438
+ },
439
+
440
+ {
441
+ title: "SetOf.equals fails with different single-element setofs (deep)",
442
+ test: () => {
443
+ let setof = new Set.SetOf(Instrument, true);
444
+ let other = new Set.SetOf(Pattern, true);
445
+
446
+ expect(setof.equals(other), false);
447
+ },
448
+ },
449
+ {
450
+ title: "SetOf.equals succeeds with same single-element setofs (deep)",
451
+ test: () => {
452
+ let setof = new Set.SetOf(Instrument, true);
453
+ let other = new Set.SetOf(Instrument, true);
454
+
455
+ expect(setof.equals(other), true);
456
+ },
457
+ },
458
+ {
459
+ title: "SetOf.equals fails with different multiple-element setofs (deep)",
460
+ test: () => {
461
+ let setof = new Set.SetOf([ Pattern, Instrument ], true);
462
+ let other = new Set.SetOf([ Pattern, Note ], true);
463
+
464
+ expect(setof.equals(other), false);
465
+ },
466
+ },
467
+ {
468
+ title: "SetOf.equals succeeds with same multiple-element setofs (deep)",
469
+ test: () => {
470
+ let setof = new Set.SetOf([ Instrument, Pattern ], true);
471
+ let other = new Set.SetOf([ Instrument, Pattern ], true);
472
+
473
+ expect(setof.equals(other), true);
474
+ },
475
+ },
476
+
477
+ {
478
+ title: "validateOther succeeds for equivalent sets",
479
+ test: () => {
480
+ const noteset = new NoteSet();
481
+ const chord = new Chord();
482
+
483
+ expect(noteset.validateOther(chord), true);
484
+ },
485
+ },
486
+ {
487
+ title: "validateOther fails for different sets",
488
+ test: () => {
489
+ const noteset = new NoteSet();
490
+ const instrumentset = new InstrumentSet();
491
+
492
+ expect(noteset.validateOther(instrumentset), false);
493
+ },
494
+ },
495
+
496
+
497
+ {
498
+ title: "append fails on an immutable set",
499
+ test: () => {
500
+ let set = new RegularGroupSet();
501
+ let other = new RegularGroupSet();
502
+
503
+ expectException(() => { set.append(other) }, Error);
504
+ },
505
+ },
506
+ {
507
+ title: "append throws error appending different set type",
508
+ test: () => {
509
+ let set = new InstrumentSet();
510
+ let other = new ArticulationSet();
511
+
512
+ expectException(() => { set.append(other); }, Error);
513
+ },
514
+ },
515
+ {
516
+ title: "append throws error appending undefined set",
517
+ test: () => {
518
+ let set = new InstrumentSet();
519
+
520
+ expectException(() => { set.append(); }, Error);
521
+ },
522
+ },
523
+ {
524
+ title: "append succeeds appending empty set to empty set",
525
+ test: () => {
526
+ let set = new InstrumentSet();
527
+ let other = new InstrumentSet();
528
+
529
+ expect(set.append(other), (result) => { return result === set; });
530
+ expect(set.size, 0);
531
+ expect(other.size, 0);
532
+ },
533
+ },
534
+ {
535
+ title: "append succeeds appending empty set to non-empty set",
536
+ test: () => {
537
+ let set = new InstrumentSet({ add: Instruments.Snare });
538
+ let other = new InstrumentSet();
539
+
540
+ expect(set.append(other), (result) => { return result === set; });
541
+ expect(set.size, 1);
542
+ expect(other.size, 0);
543
+ },
544
+ },
545
+ {
546
+ title: "append succeeds appending non-empty set to empty set",
547
+ test: () => {
548
+ let set = new InstrumentSet();
549
+ let other = new InstrumentSet({ add: Instruments.Snare });
550
+
551
+ expect(set.append(other), (result) => { return result === set; });
552
+ expect(set.size, 1);
553
+ expect(other.size, 1);
554
+ expect(set.elements[0] === other.elements[0], true);
555
+ },
556
+ },
557
+ {
558
+ title: "append succeeds appending non-empty set to non-empty set",
559
+ test: () => {
560
+ let set = new InstrumentSet({ add: [ Instruments.Bass1, Instruments.Bass2 ] });
561
+ let other = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Claves ] });
562
+
563
+ expect(set.append(other), (result) => { return result === set; });
564
+ expect(set.size, 4);
565
+ expect(other.size, 2);
566
+ expect(set.elements[2] === other.elements[0], true);
567
+ expect(set.elements[3] === other.elements[1], true);
568
+ },
569
+ },
570
+
571
+ {
572
+ title: "clear fails on an immutable set",
573
+ test: () => {
574
+ let set = new RegularGroupSet();
575
+
576
+ expectException(() => { set.clear() }, Error);
577
+ },
578
+ },
579
+ {
580
+ title: "clear correctly empties a set",
581
+ test: () => {
582
+ let set = new InstrumentSet({ add: [ Instruments.Bass1, Instruments.Bass2 ] });
583
+
584
+ expect(set.clear(), (result) => { return result === set; });
585
+ expect(set.size, 0);
586
+ },
587
+ },
588
+
589
+ {
590
+ title: "clone succeeds on an immutable set by cloning properties only",
591
+ test: () => {
592
+ const TestClass = class extends Set {
593
+ constructor() {
594
+ super({ isAbstract: true });
595
+ }
596
+ }
597
+
598
+ const set = new TestClass();
599
+ const clone = set.clone();
600
+
601
+ expect(clone.isAbstract, true);
602
+ expect(clone.allowDuplicates, false);
603
+ expect(clone.isStrict, true);
604
+ },
605
+ },
606
+ {
607
+ title: "clone correctly clones an empty set",
608
+ test: () => {
609
+ let set = new InstrumentSet();
610
+ let clone;
611
+
612
+ expect(clone = set.clone(), (result) => { return result instanceof InstrumentSet; });
613
+ expect(clone !== set, true)
614
+ expect(clone.size, 0);
615
+ },
616
+ },
617
+ {
618
+ title: "clone correctly clones a non-empty set (shallow)",
619
+ test: () => {
620
+ let set = new InstrumentSet({ add: [ Instruments.Bass1, Instruments.Bass2 ] });
621
+ let clone;
622
+
623
+ expect(clone = set.clone(), (result) => { return result instanceof InstrumentSet; });
624
+ expect(clone !== set, true)
625
+ expect(clone.size, 2);
626
+ expect(clone.elements[0] === set.elements[0], true);
627
+ expect(clone.elements[1] === set.elements[1], true);
628
+ },
629
+ },
630
+ {
631
+ title: "clone correctly clones a non-empty set (deep)",
632
+ test: () => {
633
+ let set = new Pattern(
634
+ { add: [
635
+ new Chord(
636
+ { add: [
637
+ new Note({ add: [ Instruments.Snare, undefined ] })
638
+ ]}
639
+ )
640
+ ]}
641
+ );
642
+ let clone;
643
+
644
+ expect(clone = set.clone(true), (result) => { return result instanceof Pattern; });
645
+ expect(clone !== set, true)
646
+ expect(clone.size, 1);
647
+ expect(clone.elements[0] !== set.elements[0], true);
648
+ expect(clone.elements[0].elements[0] !== set.elements[0].elements[0], true);
649
+ },
650
+ },
651
+
652
+ {
653
+ title: "delete fails on an immutable set",
654
+ test: () => {
655
+ let set = new RegularGroupSet();
656
+
657
+ expectException(() => { set.delete() }, Error);
658
+ },
659
+ },
660
+ {
661
+ title: "delete fails to remove element from empty set",
662
+ test: () => {
663
+ let set = new InstrumentSet();
664
+
665
+ expect(set.delete(Instruments.Bass1), false);
666
+ },
667
+ },
668
+ {
669
+ title: "delete fails to remove element not in set",
670
+ test: () => {
671
+ let set = new InstrumentSet({ add: Instruments.Snare });
672
+
673
+ expect(set.delete(Instruments.Bass1), false);
674
+ },
675
+ },
676
+ {
677
+ title: "delete succeeds in removing element last element from set",
678
+ test: () => {
679
+ let set = new InstrumentSet({ add: Instruments.Bass1 });
680
+
681
+ expect(set.delete(Instruments.Bass1), true);
682
+ expect(set.size, 0)
683
+ },
684
+ },
685
+ {
686
+ title: "delete succeeds in removing element not last element from set",
687
+ test: () => {
688
+ let set = new InstrumentSet({ add: [ Instruments.Bass1, Instruments.Snare ]});
689
+
690
+ expect(set.delete(Instruments.Bass1), true);
691
+ expect(set.size, 1)
692
+ expect(set.elements[0] === Instruments.Snare, true);
693
+ },
694
+ },
695
+
696
+ {
697
+ title: "elementAt throws error for index < 0",
698
+ test: () => {
699
+ let set = new InstrumentSet();
700
+
701
+ expectException(() => { set.elementAt(-1); }, Error);
702
+ },
703
+ },
704
+ {
705
+ title: "elementAt throws error for empty set",
706
+ test: () => {
707
+ let set = new InstrumentSet();
708
+
709
+ expectException(() => { set.elementAt(0); }, Error);
710
+ },
711
+ },
712
+ {
713
+ title: "elementAt throws error for index >= set size",
714
+ test: () => {
715
+ let set = new InstrumentSet({ add: Instruments.Snare });
716
+
717
+ expectException(() => { set.elementAt(1); }, Error);
718
+ },
719
+ },
720
+ {
721
+ title: "elementAt succeeds for element in valid index",
722
+ test: () => {
723
+ let set = new InstrumentSet({ add: Instruments.Snare });
724
+
725
+ expect(set.elementAt(0), (result) => { return result === Instruments.Snare; });
726
+ },
727
+ },
728
+
729
+ {
730
+ title: "forEach does nothing for empty set",
731
+ test: () => {
732
+ let set = new InstrumentSet();
733
+ let count = 0;
734
+
735
+ set.forEach((element) => { ++count; });
736
+
737
+ expect(count, 0);
738
+ },
739
+ },
740
+ {
741
+ title: "forEach correctly processes elements for non-empty set",
742
+ test: () => {
743
+ const elements = [ Instruments.Snare, Instruments.Bass1 ];
744
+ let set = new InstrumentSet({ add: elements });
745
+ let count = 0;
746
+
747
+ set.forEach(
748
+ (element) => {
749
+ expect(element === elements[count++], true);
750
+ }
751
+ );
752
+
753
+ expect(count, 2);
754
+ },
755
+ },
756
+
757
+ {
758
+ title: "isDisjointFrom throws error for elements of different types",
759
+ test: () => {
760
+ let set = new InstrumentSet();
761
+ let other = new NoteSet();
762
+
763
+ expectException(() => { set.isDisjointFrom(other); }, Error);
764
+ },
765
+ },
766
+ {
767
+ title: "isDisjointFrom succeeds for empty sets",
768
+ test: () => {
769
+ let set = new InstrumentSet();
770
+ let other = new InstrumentSet();
771
+
772
+ expect(set.isDisjointFrom(other), true);
773
+ },
774
+ },
775
+ {
776
+ title: "isDisjointFrom succeeds for disjoint single-element set and empty set",
777
+ test: () => {
778
+ let set = new InstrumentSet({ add: Instruments.Snare });
779
+ let other = new InstrumentSet();
780
+
781
+ expect(set.isDisjointFrom(other), true);
782
+ },
783
+ },
784
+ {
785
+ title: "isDisjointFrom succeeds for disjoint empty set and single-element set",
786
+ test: () => {
787
+ let set = new InstrumentSet();
788
+ let other = new InstrumentSet({ add: Instruments.Snare });
789
+
790
+ expect(set.isDisjointFrom(other), true);
791
+ },
792
+ },
793
+ {
794
+ title: "isDisjointFrom succeeds for disjoint multi-element set and empty set",
795
+ test: () => {
796
+ let set = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Bass1 ] });
797
+ let other = new InstrumentSet();
798
+
799
+ expect(set.isDisjointFrom(other), true);
800
+ },
801
+ },
802
+ {
803
+ title: "isDisjointFrom succeeds for disjoint empty set and multi-element set",
804
+ test: () => {
805
+ let set = new InstrumentSet();
806
+ let other = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Bass1 ]});
807
+
808
+ expect(set.isDisjointFrom(other), true);
809
+ },
810
+ },
811
+ {
812
+ title: "isDisjointFrom succeeds for disjoint single-element sets",
813
+ test: () => {
814
+ let set = new InstrumentSet({ add: Instruments.Snare });
815
+ let other = new InstrumentSet({ add: Instruments.Bass1 });
816
+
817
+ expect(set.isDisjointFrom(other), true);
818
+ },
819
+ },
820
+ {
821
+ title: "isDisjointFrom fails for non-disjoint single-element sets",
822
+ test: () => {
823
+ let set = new InstrumentSet({ add: Instruments.Snare });
824
+ let other = new InstrumentSet({ add: Instruments.Snare });
825
+
826
+ expect(set.isDisjointFrom(other), false);
827
+ },
828
+ },
829
+ {
830
+ title: "isDisjointFrom succeeds for disjoint multi-element sets",
831
+ test: () => {
832
+ let set = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Claves ] });
833
+ let other = new InstrumentSet({ add: [ Instruments.Bass1, Instruments.Crash ] });
834
+
835
+ expect(set.isDisjointFrom(other), true);
836
+ },
837
+ },
838
+ {
839
+ title: "isDisjointFrom fails for non-disjoint multi-element sets",
840
+ test: () => {
841
+ let set = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Claves ] });
842
+ let other = new InstrumentSet({ add: [ Instruments.Bass1, Instruments.Claves ] });
843
+
844
+ expect(set.isDisjointFrom(other), false);
845
+ },
846
+ },
847
+
848
+ {
849
+ title: "isSubsetOf throws error for elements of different types",
850
+ test: () => {
851
+ let set = new InstrumentSet();
852
+ let other = new NoteSet();
853
+
854
+ expectException(() => { set.isSubsetOf(other); }, Error);
855
+ },
856
+ },
857
+ {
858
+ title: "isSubsetOf fails for empty sets",
859
+ test: () => {
860
+ let set = new InstrumentSet();
861
+ let other = new InstrumentSet();
862
+
863
+ expect(set.isSubsetOf(other), false);
864
+ },
865
+ },
866
+ {
867
+ title: "isSubsetOf fails for single-element set and empty set",
868
+ test: () => {
869
+ let set = new InstrumentSet({ add: Instruments.Snare });
870
+ let other = new InstrumentSet();
871
+
872
+ expect(set.isSubsetOf(other), false);
873
+ },
874
+ },
875
+ {
876
+ title: "isSubsetOf fails for empty set and single-element set",
877
+ test: () => {
878
+ let set = new InstrumentSet();
879
+ let other = new InstrumentSet({ add: Instruments.Snare });
880
+
881
+ expect(set.isSubsetOf(other), false);
882
+ },
883
+ },
884
+ {
885
+ title: "isSubsetOf fails for multi-element set and empty set",
886
+ test: () => {
887
+ let set = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Bass1 ] });
888
+ let other = new InstrumentSet();
889
+
890
+ expect(set.isSubsetOf(other), false);
891
+ },
892
+ },
893
+ {
894
+ title: "isSubsetOf fails for empty set and multi-element set",
895
+ test: () => {
896
+ let set = new InstrumentSet();
897
+ let other = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Bass1 ]});
898
+
899
+ expect(set.isSubsetOf(other), false);
900
+ },
901
+ },
902
+ {
903
+ title: "isSubsetOf fails for different single-element sets",
904
+ test: () => {
905
+ let set = new InstrumentSet({ add: Instruments.Snare });
906
+ let other = new InstrumentSet({ add: Instruments.Bass1 });
907
+
908
+ expect(set.isSubsetOf(other), false);
909
+ },
910
+ },
911
+ {
912
+ title: "isSubsetOf succeeds for equal single-element sets",
913
+ test: () => {
914
+ let set = new InstrumentSet({ add: Instruments.Snare });
915
+ let other = new InstrumentSet({ add: Instruments.Snare });
916
+
917
+ expect(set.isSubsetOf(other), true);
918
+ },
919
+ },
920
+ {
921
+ title: "isSubsetOf fails for disjoint multi-element sets",
922
+ test: () => {
923
+ let set = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Claves ] });
924
+ let other = new InstrumentSet({ add: [ Instruments.Bass1, Instruments.Crash ] });
925
+
926
+ expect(set.isSubsetOf(other), false);
927
+ },
928
+ },
929
+ {
930
+ title: "isSubsetOf fails for non-disjoint, but non-subset multi-element sets",
931
+ test: () => {
932
+ let set = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Claves ] });
933
+ let other = new InstrumentSet({ add: [ Instruments.Bass1, Instruments.Claves, Instruments.Crash ] });
934
+
935
+ expect(set.isSubsetOf(other), false);
936
+ },
937
+ },
938
+ {
939
+ title: "isSubsetOf succeeds for non-disjoint, multi-element subset",
940
+ test: () => {
941
+ let set = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Claves ] });
942
+ let other = new InstrumentSet({ add: [ Instruments.Bass1, Instruments.Claves, Instruments.Snare ] });
943
+
944
+ expect(set.isSubsetOf(other), true);
945
+ },
946
+ },
947
+
948
+ {
949
+ title: "has fails when empty",
950
+ test: () => {
951
+ let set = new InstrumentSet();
952
+ let other = new InstrumentSet({ add: Instruments.Snare });
953
+
954
+ expect(set.has(other), false);
955
+ },
956
+ },
957
+ {
958
+ title: "has fails for other set that is not a subset",
959
+ test: () => {
960
+ let set = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Bass1 ] });
961
+ let other = new InstrumentSet({ add: [ Instruments.Claves ] });
962
+
963
+ expect(set.has(other), false);
964
+ },
965
+ },
966
+ {
967
+ title: "has succeeds for other set that is a subset",
968
+ test: () => {
969
+ let set = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Bass1 ] });
970
+ let other = new InstrumentSet({ add: [ Instruments.Bass1 ] });
971
+
972
+ expect(set.has(other), true);
973
+ },
974
+ },
975
+ {
976
+ title: "has fails for element not in set",
977
+ test: () => {
978
+ let set = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Bass1 ] });
979
+
980
+ expect(set.has(Instruments.Claves), false);
981
+ },
982
+ },
983
+ {
984
+ title: "has succeeds for element in the set",
985
+ test: () => {
986
+ let set = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Bass1 ] });
987
+
988
+ expect(set.has(Instruments.Bass1), true);
989
+ },
990
+ },
991
+ {
992
+ title: "has succeeds for element that can be promoted",
993
+ test: () => {
994
+ let set = new NoteSet({ add: [ new Note({add: Instruments.Snare}), new Note({add: Instruments.Bass1}) ] });
995
+ let other = Instruments.Bass1;
996
+
997
+ expect(set.has(other), true);
998
+ },
999
+ },
1000
+ {
1001
+ title: "has fails for element that can't be promoted",
1002
+ test: () => {
1003
+ let set = new NoteSet({ add: [ new Note({add: Instruments.Snare}), new Note({add: Instruments.Bass1}) ] });
1004
+ let other = Articulations.Accent;
1005
+
1006
+ expect(set.has(other), false);
1007
+ },
1008
+ },
1009
+
1010
+ {
1011
+ title: "indexOf throws error for undefined element",
1012
+ test: () => {
1013
+ let set = new Set();
1014
+
1015
+ expectException(() => { set.indexOf(); }, Error);
1016
+ },
1017
+ },
1018
+ {
1019
+ title: "indexOf throws error for argument not derived from Element",
1020
+ test: () => {
1021
+ let set = new Set();
1022
+
1023
+ expectException(() => { set.indexOf(new Error()); }, Error);
1024
+ },
1025
+ },
1026
+ {
1027
+ title: "indexOf fails to find non-existant element",
1028
+ test: () => {
1029
+ let set = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Bass1 ] });
1030
+
1031
+ expect(set.indexOf(Instruments.Claves), -1);
1032
+ },
1033
+ },
1034
+ {
1035
+ title: "indexOf fails for empty set",
1036
+ test: () => {
1037
+ let set = new InstrumentSet();
1038
+
1039
+ expect(set.indexOf(Instruments.Bass1), -1);
1040
+ },
1041
+ },
1042
+ {
1043
+ title: "indexOf succeeds for element in the set",
1044
+ test: () => {
1045
+ let set = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Bass1 ] });
1046
+
1047
+ expect(set.indexOf(Instruments.Snare), 0);
1048
+ expect(set.indexOf(Instruments.Bass1), 1);
1049
+ },
1050
+ },
1051
+ {
1052
+ title: "indexOf fails for element in the set prior to after",
1053
+ test: () => {
1054
+ let set = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Bass1 ] });
1055
+
1056
+ expect(set.indexOf(Instruments.Snare, 0), -1);
1057
+ },
1058
+ },
1059
+ {
1060
+ title: "indexOf succeeds for element in the set later than after",
1061
+ test: () => {
1062
+ let set = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Bass1 ] });
1063
+
1064
+ expect(set.indexOf(Instruments.Bass1, 0), 1);
1065
+ },
1066
+ },
1067
+ {
1068
+ title: "indexOf fails if after >= size-1",
1069
+ test: () => {
1070
+ let set = new InstrumentSet({ add: [ Instruments.Snare, Instruments.Bass1 ] });
1071
+
1072
+ expect(set.size === 2, true);
1073
+ expect(set.indexOf(Instruments.Snare, 1), -1);
1074
+ expect(set.indexOf(Instruments.Bass1, 1), -1);
1075
+ expect(set.indexOf(Instruments.Bass1, 2), -1);
1076
+ expect(set.indexOf(Instruments.Bass1, 3), -1);
1077
+ },
1078
+ },
1079
+
1080
+ ],
1081
+ }