coh-content-db 2.0.0-rc.1 → 2.0.0-rc.10

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 (100) hide show
  1. package/.editorconfig +10 -11
  2. package/.github/workflows/build.yml +1 -1
  3. package/.github/workflows/pull-request.yml +1 -1
  4. package/.github/workflows/release.yml +2 -2
  5. package/CHANGELOG.md +42 -0
  6. package/README.md +52 -24
  7. package/dist/coh-content-db.d.ts +683 -279
  8. package/dist/coh-content-db.js +834 -377
  9. package/dist/coh-content-db.js.map +1 -1
  10. package/dist/coh-content-db.mjs +809 -368
  11. package/dist/coh-content-db.mjs.map +1 -1
  12. package/eslint.config.mjs +1 -0
  13. package/package.json +1 -1
  14. package/src/main/api/alignment.ts +18 -2
  15. package/src/main/api/alternate-data.ts +2 -2
  16. package/src/main/api/badge-data.ts +20 -48
  17. package/src/main/api/badge-requirement-data.ts +64 -0
  18. package/src/main/api/badge-requirement-type.ts +32 -0
  19. package/src/main/api/badge-type.ts +15 -15
  20. package/src/main/api/bundle-data.ts +47 -0
  21. package/src/main/api/bundle-header-data.ts +37 -0
  22. package/src/main/api/contact-data.ts +48 -0
  23. package/src/main/api/enhancement-category.ts +26 -26
  24. package/src/main/api/location-data.ts +28 -0
  25. package/src/main/api/markdown-string.ts +4 -0
  26. package/src/main/api/mission-data.ts +83 -0
  27. package/src/main/api/mission-type.ts +2 -0
  28. package/src/main/api/morality.ts +31 -0
  29. package/src/main/api/sex.ts +8 -1
  30. package/src/main/api/zone-data.ts +20 -0
  31. package/src/main/db/abstract-index.ts +37 -0
  32. package/src/main/db/alignment-list.ts +54 -0
  33. package/src/main/db/alternates.ts +28 -42
  34. package/src/main/db/badge-index.ts +57 -0
  35. package/src/main/db/badge-requirement.ts +81 -0
  36. package/src/main/db/badge-search-options.ts +51 -0
  37. package/src/main/db/badge.ts +77 -71
  38. package/src/main/db/bundle-header.ts +44 -0
  39. package/src/main/db/coh-content-database.ts +123 -14
  40. package/src/main/db/contact.ts +62 -0
  41. package/src/main/db/location.ts +30 -0
  42. package/src/main/db/mission.ts +107 -0
  43. package/src/main/db/morality-list.ts +99 -0
  44. package/src/main/db/paged.ts +7 -0
  45. package/src/main/db/zone.ts +28 -0
  46. package/src/main/index.ts +23 -15
  47. package/src/main/util.ts +108 -7
  48. package/src/test/api/alignment.test.ts +38 -4
  49. package/src/test/api/badge-data.fixture.ts +1 -15
  50. package/src/test/api/badge-data.test.ts +4 -4
  51. package/src/test/api/badge-requirement-data.fixture.ts +7 -0
  52. package/src/test/api/badge-requirement-type.test.ts +31 -0
  53. package/src/test/api/badge-type.test.ts +5 -5
  54. package/src/test/api/bundle-data.fixture.ts +6 -0
  55. package/src/test/api/bundle-header-data.fixture.ts +6 -0
  56. package/src/test/api/contact-data.fixture.ts +7 -0
  57. package/src/test/api/enhancement-category.test.ts +5 -5
  58. package/src/test/api/mission-data.fixture.ts +12 -0
  59. package/src/test/api/sex.test.ts +33 -1
  60. package/src/test/api/zone-data.fixture.ts +8 -0
  61. package/src/test/db/abstract-index.test.ts +55 -0
  62. package/src/test/db/alignment-list.test.ts +200 -0
  63. package/src/test/db/alternates.test.ts +82 -117
  64. package/src/test/db/badge-index.test.ts +519 -0
  65. package/src/test/db/badge-requirement.test.ts +145 -0
  66. package/src/test/db/badge.test.ts +310 -14
  67. package/src/test/db/bundle-header.test.ts +76 -0
  68. package/src/test/db/coh-content-database.test.ts +264 -24
  69. package/src/test/db/contact.test.ts +97 -0
  70. package/src/test/db/location.test.ts +51 -0
  71. package/src/test/db/mission.test.ts +171 -0
  72. package/src/test/db/morality-list.test.ts +457 -0
  73. package/src/test/db/zone.test.ts +36 -0
  74. package/src/test/integration.test.ts +16 -0
  75. package/src/test/util.test.ts +144 -18
  76. package/src/main/api/badge-partial-data.ts +0 -65
  77. package/src/main/api/badge-partial-type.ts +0 -8
  78. package/src/main/api/change.ts +0 -14
  79. package/src/main/api/game-map-data.ts +0 -26
  80. package/src/main/api/plaque-type.ts +0 -6
  81. package/src/main/api/server-group-data.ts +0 -65
  82. package/src/main/api/vidiot-map-data.ts +0 -18
  83. package/src/main/api/vidiot-map-point-of-interest-data.ts +0 -30
  84. package/src/main/changelog.ts +0 -20
  85. package/src/main/db/badge-partial.ts +0 -35
  86. package/src/main/db/game-map.ts +0 -33
  87. package/src/main/db/server-group.ts +0 -112
  88. package/src/main/db/vidiot-map-point-of-interest.ts +0 -40
  89. package/src/main/db/vidiot-map.ts +0 -25
  90. package/src/test/api/badge-partial-data.fixture.ts +0 -17
  91. package/src/test/api/badge-partial-type.test.ts +0 -31
  92. package/src/test/api/game-map-data.fixture.ts +0 -10
  93. package/src/test/api/plaque-type.test.ts +0 -31
  94. package/src/test/api/server-group-data.fixture.ts +0 -23
  95. package/src/test/api/server-group-data.test.ts +0 -15
  96. package/src/test/api/vidiot-map-point-of-interest.fixture.ts +0 -10
  97. package/src/test/api/vidiot-map.fixture.ts +0 -9
  98. package/src/test/changelog.test.ts +0 -36
  99. package/src/test/db/server-group.test.ts +0 -124
  100. package/src/test/index.test.ts +0 -10
@@ -0,0 +1,200 @@
1
+ import { AlignmentList } from '../../main'
2
+
3
+ describe(AlignmentList.name, () => {
4
+ describe('items', () => {
5
+ test('should return the basic set', () => {
6
+ expect(new AlignmentList(['hero', 'villain']).items).toStrictEqual(['hero', 'villain'])
7
+ })
8
+
9
+ test('should collapse extended values', () => {
10
+ expect(new AlignmentList(['primal']).items).toStrictEqual(['hero', 'villain'])
11
+ })
12
+
13
+ test('should not duplicate overlaps', () => {
14
+ expect(new AlignmentList(['primal', 'all', 'hero']).items).toStrictEqual(['hero', 'villain', 'praetorian'])
15
+ })
16
+
17
+ test('should have deterministic order', () => {
18
+ expect(new AlignmentList(['hero', 'villain']).items).toStrictEqual(['hero', 'villain'])
19
+ expect(new AlignmentList(['villain', 'hero']).items).toStrictEqual(['hero', 'villain'])
20
+ expect(new AlignmentList(['primal', 'all', 'hero']).items).toStrictEqual(['hero', 'villain', 'praetorian'])
21
+ expect(new AlignmentList(['hero', 'primal', 'all']).items).toStrictEqual(['hero', 'villain', 'praetorian'])
22
+ expect(new AlignmentList(['all', 'hero', 'primal']).items).toStrictEqual(['hero', 'villain', 'praetorian'])
23
+ })
24
+
25
+ test('should treat undefined as all values', () => {
26
+ expect(new AlignmentList().items).toStrictEqual(['hero', 'villain', 'praetorian'])
27
+ })
28
+
29
+ test('should treat empty as no values', () => {
30
+ expect(new AlignmentList([]).items).toStrictEqual([])
31
+ })
32
+ })
33
+
34
+ describe('values', () => {
35
+ test('should all be true when undefined', () => {
36
+ const alignments = new AlignmentList()
37
+ expect(alignments.hero).toBeTruthy()
38
+ expect(alignments.villain).toBeTruthy()
39
+ expect(alignments.praetorian).toBeTruthy()
40
+ expect(alignments.primal).toBeTruthy()
41
+ expect(alignments.all).toBeTruthy()
42
+ })
43
+
44
+ test('should all be false when empty', () => {
45
+ const alignments = new AlignmentList([])
46
+ expect(alignments.hero).toBeFalsy()
47
+ expect(alignments.villain).toBeFalsy()
48
+ expect(alignments.praetorian).toBeFalsy()
49
+ expect(alignments.primal).toBeFalsy()
50
+ expect(alignments.all).toBeFalsy()
51
+ })
52
+ })
53
+
54
+ describe('hero', () => {
55
+ test('should detect a hero', () => {
56
+ expect(new AlignmentList(['hero', 'villain']).hero).toBeTruthy()
57
+ })
58
+
59
+ test('should detect primal', () => {
60
+ expect(new AlignmentList(['primal']).hero).toBeTruthy()
61
+ })
62
+
63
+ test('should detect all', () => {
64
+ expect(new AlignmentList(['all']).hero).toBeTruthy()
65
+ })
66
+
67
+ test('should not falsely detect a hero', () => {
68
+ expect(new AlignmentList(['villain']).hero).toBeFalsy()
69
+ })
70
+ })
71
+
72
+ describe('villain', () => {
73
+ test('should detect a villain', () => {
74
+ expect(new AlignmentList(['hero', 'villain']).villain).toBeTruthy()
75
+ })
76
+
77
+ test('should detect primal', () => {
78
+ expect(new AlignmentList(['primal']).villain).toBeTruthy()
79
+ })
80
+
81
+ test('should detect all', () => {
82
+ expect(new AlignmentList(['all']).villain).toBeTruthy()
83
+ })
84
+
85
+ test('should not falsely detect a villain', () => {
86
+ expect(new AlignmentList(['hero']).villain).toBeFalsy()
87
+ })
88
+ })
89
+
90
+ describe('praetorian', () => {
91
+ test('should detect a praetorian', () => {
92
+ expect(new AlignmentList(['hero', 'praetorian']).praetorian).toBeTruthy()
93
+ })
94
+
95
+ test('should not detect primal', () => {
96
+ expect(new AlignmentList(['primal']).praetorian).toBeFalsy()
97
+ })
98
+
99
+ test('should detect all', () => {
100
+ expect(new AlignmentList(['all']).praetorian).toBeTruthy()
101
+ })
102
+
103
+ test('should not falsely detect a praetorian', () => {
104
+ expect(new AlignmentList(['villain']).praetorian).toBeFalsy()
105
+ })
106
+ })
107
+
108
+ describe('primal', () => {
109
+ test('should detect hero and villain', () => {
110
+ expect(new AlignmentList(['hero', 'villain']).primal).toBeTruthy()
111
+ })
112
+
113
+ test('should detect primal', () => {
114
+ expect(new AlignmentList(['primal']).primal).toBeTruthy()
115
+ })
116
+
117
+ test('should detect all', () => {
118
+ expect(new AlignmentList(['all']).primal).toBeTruthy()
119
+ })
120
+
121
+ test('should not falsely detect a primal', () => {
122
+ expect(new AlignmentList(['villain']).primal).toBeFalsy()
123
+ expect(new AlignmentList(['praetorian']).primal).toBeFalsy()
124
+ })
125
+ })
126
+
127
+ describe('all', () => {
128
+ test('should detect when all are present', () => {
129
+ expect(new AlignmentList(['hero', 'villain', 'praetorian']).all).toBeTruthy()
130
+ })
131
+
132
+ test('should detect primal and praetorian', () => {
133
+ expect(new AlignmentList(['primal', 'praetorian']).all).toBeTruthy()
134
+ })
135
+
136
+ test('should detect all', () => {
137
+ expect(new AlignmentList(['all']).all).toBeTruthy()
138
+ })
139
+
140
+ test('should not falsely detect all', () => {
141
+ expect(new AlignmentList(['villain']).all).toBeFalsy()
142
+ expect(new AlignmentList(['praetorian']).all).toBeFalsy()
143
+ expect(new AlignmentList(['primal']).all).toBeFalsy()
144
+ })
145
+ })
146
+
147
+ describe('has', () => {
148
+ test('should return true if present', () => {
149
+ expect(new AlignmentList(['villain']).has('villain')).toBeTruthy()
150
+ })
151
+
152
+ test('should return false if absent', () => {
153
+ expect(new AlignmentList(['hero']).has('villain')).toBeFalsy()
154
+ expect(new AlignmentList(['hero', 'praetorian']).has('primal')).toBeFalsy()
155
+ })
156
+
157
+ test('should return false if undefined', () => {
158
+ expect(new AlignmentList(['hero']).has()).toBeFalsy()
159
+ })
160
+
161
+ test('should test hero correctly', () => {
162
+ expect(new AlignmentList(['hero']).has('hero')).toBeTruthy()
163
+ expect(new AlignmentList(['primal']).has('hero')).toBeTruthy()
164
+ expect(new AlignmentList(['all']).has('hero')).toBeTruthy()
165
+
166
+ expect(new AlignmentList(['villain']).has('hero')).toBeFalsy()
167
+ })
168
+
169
+ test('should test villain correctly', () => {
170
+ expect(new AlignmentList(['villain']).has('villain')).toBeTruthy()
171
+ expect(new AlignmentList(['primal']).has('villain')).toBeTruthy()
172
+ expect(new AlignmentList(['all']).has('villain')).toBeTruthy()
173
+
174
+ expect(new AlignmentList(['hero']).has('villain')).toBeFalsy()
175
+ })
176
+
177
+ test('should test praetorian correctly', () => {
178
+ expect(new AlignmentList(['praetorian']).has('praetorian')).toBeTruthy()
179
+ expect(new AlignmentList(['all']).has('praetorian')).toBeTruthy()
180
+
181
+ expect(new AlignmentList(['villain']).has('praetorian')).toBeFalsy()
182
+ })
183
+
184
+ test('should test primal correctly', () => {
185
+ expect(new AlignmentList(['hero', 'villain']).has('primal')).toBeTruthy()
186
+ expect(new AlignmentList(['primal']).has('primal')).toBeTruthy()
187
+ expect(new AlignmentList(['all']).has('primal')).toBeTruthy()
188
+
189
+ expect(new AlignmentList(['praetorian']).has('primal')).toBeFalsy()
190
+ })
191
+
192
+ test('should test all correctly', () => {
193
+ expect(new AlignmentList(['hero', 'villain', 'praetorian']).has('all')).toBeTruthy()
194
+ expect(new AlignmentList(['primal', 'praetorian']).has('all')).toBeTruthy()
195
+ expect(new AlignmentList(['all']).has('all')).toBeTruthy()
196
+
197
+ expect(new AlignmentList([]).has('all')).toBeFalsy()
198
+ })
199
+ })
200
+ })
@@ -1,4 +1,4 @@
1
- import { Alternates } from '../../main/db/alternates'
1
+ import { Alternates } from '../../main'
2
2
 
3
3
  describe(Alternates.name, () => {
4
4
  describe('Constructor', () => {
@@ -6,11 +6,15 @@ describe(Alternates.name, () => {
6
6
  new Alternates([
7
7
  { value: 'Default' },
8
8
  { sex: 'M', value: 'Male' },
9
- { alignment: 'H', value: 'Hero' },
10
- { alignment: 'V', sex: 'M', value: 'Male Villain' },
11
- { alignment: 'P', sex: 'F', value: 'Praetorian Female' },
9
+ { alignment: 'hero', value: 'Hero' },
10
+ { alignment: 'villain', sex: 'M', value: 'Male Villain' },
11
+ { alignment: 'praetorian', sex: 'F', value: 'Praetorian Female' },
12
12
  ])
13
13
  })
14
+
15
+ test('should accept a single value', () => {
16
+ expect(new Alternates('foo').default?.value).toBe('foo')
17
+ })
14
18
  })
15
19
 
16
20
  describe('getValue', () => {
@@ -22,19 +26,19 @@ describe(Alternates.name, () => {
22
26
  expect(new Alternates([
23
27
  { value: 'Default' },
24
28
  { sex: 'M', value: 'Male' },
25
- { alignment: 'H', value: 'Hero' },
26
- { alignment: 'V', sex: 'M', value: 'Male Villain' },
27
- { alignment: 'P', sex: 'F', value: 'Praetorian Female' },
29
+ { alignment: 'hero', value: 'Hero' },
30
+ { alignment: 'villain', sex: 'M', value: 'Male Villain' },
31
+ { alignment: 'praetorian', sex: 'F', value: 'Praetorian Female' },
28
32
  ]).getValue()).toBe('Default')
29
33
  })
30
34
 
31
35
  test('should return the least-specific value when no classifiers are provided, regardless of insert order', () => {
32
36
  expect(new Alternates([
33
- { alignment: 'V', sex: 'M', value: 'Male Villain' },
34
- { alignment: 'H', value: 'Hero' },
37
+ { alignment: 'villain', sex: 'M', value: 'Male Villain' },
38
+ { alignment: 'hero', value: 'Hero' },
35
39
  { value: 'Default' },
36
40
  { sex: 'M', value: 'Male' },
37
- { alignment: 'P', sex: 'F', value: 'Praetorian Female' },
41
+ { alignment: 'praetorian', sex: 'F', value: 'Praetorian Female' },
38
42
  ]).getValue()).toBe('Default')
39
43
  })
40
44
 
@@ -42,29 +46,38 @@ describe(Alternates.name, () => {
42
46
  expect(new Alternates([
43
47
  { value: 'Default' },
44
48
  { sex: 'M', value: 'Male' },
45
- { alignment: 'H', value: 'Hero' },
46
- { alignment: 'V', sex: 'M', value: 'Male Villain' },
47
- { alignment: 'P', sex: 'F', value: 'Praetorian Female' },
48
- ]).getValue('V', 'M')).toBe('Male Villain')
49
+ { alignment: 'hero', value: 'Hero' },
50
+ { alignment: 'villain', sex: 'M', value: 'Male Villain' },
51
+ { alignment: 'praetorian', sex: 'F', value: 'Praetorian Female' },
52
+ ]).getValue('villain', 'M')).toBe('Male Villain')
49
53
  })
50
54
 
51
55
  test('should return the most specific match, regardless of insert order', () => {
52
56
  expect(new Alternates([
53
- { alignment: 'P', sex: 'F', value: 'Praetorian Female' },
57
+ { alignment: 'praetorian', sex: 'F', value: 'Praetorian Female' },
54
58
  { sex: 'M', value: 'Male' },
55
- { alignment: 'H', value: 'Hero' },
56
- { alignment: 'V', sex: 'M', value: 'Male Villain' },
59
+ { alignment: 'hero', value: 'Hero' },
60
+ { alignment: 'villain', sex: 'M', value: 'Male Villain' },
57
61
  { value: 'Default' },
58
- ]).getValue('V', 'M')).toBe('Male Villain')
62
+ ]).getValue('villain', 'M')).toBe('Male Villain')
59
63
  })
60
64
 
61
- test('should return undefined if there is no default', () => {
65
+ test('should return the lowest canonical value if there is no default', () => {
62
66
  expect(new Alternates([
67
+ { alignment: 'hero', value: 'Hero' },
63
68
  { sex: 'M', value: 'Male' },
64
- { alignment: 'H', value: 'Hero' },
65
- { alignment: 'V', sex: 'M', value: 'Male Villain' },
66
- { alignment: 'P', sex: 'F', value: 'Praetorian Female' },
67
- ]).getValue()).toBeUndefined()
69
+ { alignment: 'praetorian', sex: 'F', value: 'Praetorian Female' },
70
+ { alignment: 'villain', sex: 'M', value: 'Male Villain' },
71
+ ]).getValue()).toBe('Male')
72
+ })
73
+
74
+ test('should return the lowest canonical value if a specific is requested that does not exist', () => {
75
+ expect(new Alternates([
76
+ { alignment: 'hero', value: 'Hero' },
77
+ { alignment: 'villain', value: 'Villain' },
78
+ { alignment: 'villain', sex: 'M', value: 'Male Villain' },
79
+ { alignment: 'praetorian', sex: 'F', value: 'Praetorian Female' },
80
+ ]).getValue(undefined, 'F')).toBe('Hero')
68
81
  })
69
82
  })
70
83
 
@@ -77,25 +90,25 @@ describe(Alternates.name, () => {
77
90
  expect(new Alternates([
78
91
  { value: 'Default' },
79
92
  { sex: 'M', value: 'Male' },
80
- { alignment: 'H', value: 'Hero' },
81
- { alignment: 'V', sex: 'M', value: 'Male Villain' },
82
- { alignment: 'P', sex: 'F', value: 'Praetorian Female' },
83
- ]).default).toBe('Default')
93
+ { alignment: 'hero', value: 'Hero' },
94
+ { alignment: 'villain', sex: 'M', value: 'Male Villain' },
95
+ { alignment: 'praetorian', sex: 'F', value: 'Praetorian Female' },
96
+ ]).default?.value).toBe('Default')
84
97
 
85
98
  expect(new Alternates([
86
- { alignment: 'V', sex: 'M', value: 'Male Villain' },
87
- { alignment: 'P', sex: 'F', value: 'Praetorian Female' },
99
+ { alignment: 'villain', sex: 'M', value: 'Male Villain' },
100
+ { alignment: 'praetorian', sex: 'F', value: 'Praetorian Female' },
88
101
  { sex: 'M', value: 'Male' },
89
102
  { value: 'Default' },
90
- { alignment: 'H', value: 'Hero' },
91
- ]).default).toBe('Default')
103
+ { alignment: 'hero', value: 'Hero' },
104
+ ]).default?.value).toBe('Default')
92
105
 
93
106
  expect(new Alternates([
94
- { alignment: 'V', sex: 'M', value: 'Male Villain' },
95
- { alignment: 'P', sex: 'F', value: 'Praetorian Female' },
107
+ { alignment: 'villain', sex: 'M', value: 'Male Villain' },
108
+ { alignment: 'praetorian', sex: 'F', value: 'Praetorian Female' },
96
109
  { sex: 'M', value: 'Male' },
97
- { alignment: 'H', value: 'Hero' },
98
- ]).default).toBe('Male')
110
+ { alignment: 'hero', value: 'Hero' },
111
+ ]).default?.value).toBe('Male')
99
112
  })
100
113
  })
101
114
 
@@ -106,67 +119,33 @@ describe(Alternates.name, () => {
106
119
 
107
120
  test('should return values sorted in canonical order', () => {
108
121
  const result = new Alternates([
109
- { alignment: 'H', sex: 'F', value: 'Female Hero' },
110
- { alignment: 'P', value: 'Praetorian' },
122
+ { alignment: 'hero', sex: 'F', value: 'Female Hero' },
123
+ { alignment: 'praetorian', value: 'Praetorian' },
111
124
  { sex: 'F', value: 'Female' },
112
- { alignment: 'H', sex: 'A', value: 'A Hero' },
113
- { alignment: 'Y', sex: 'A', value: 'A Y' },
114
- { alignment: 'V', sex: 'M', value: 'Male Villain' },
115
- { alignment: 'V', sex: 'B', value: 'B Villain' },
116
- { alignment: 'P', sex: 'M', value: 'Male Praetorian' },
117
- { alignment: 'H', value: 'Hero' },
118
- { alignment: 'V', sex: 'A', value: 'A Villain' },
119
- { sex: 'A', value: 'A Sex' },
120
- { alignment: 'X', sex: 'F', value: 'Female X' },
121
- { alignment: 'H', sex: 'M', value: 'Male Hero' },
122
- { alignment: 'X', value: 'X' },
123
- { alignment: 'P', sex: 'B', value: 'B Praetorian' },
124
- { alignment: 'P', sex: 'A', value: 'A Praetorian' },
125
- { alignment: 'X', sex: 'M', value: 'Male X' },
125
+ { alignment: 'villain', sex: 'M', value: 'Male Villain' },
126
+ { alignment: 'praetorian', sex: 'M', value: 'Male Praetorian' },
127
+ { alignment: 'hero', value: 'Hero' },
128
+ { alignment: 'hero', sex: 'M', value: 'Male Hero' },
126
129
  { sex: 'M', value: 'Male' },
127
- { alignment: 'X', sex: 'B', value: 'B X' },
128
- { alignment: 'H', sex: 'B', value: 'B Hero' },
129
- { alignment: 'V', value: 'Villain' },
130
- { alignment: 'Y', sex: 'M', value: 'Male Y' },
131
- { alignment: 'V', sex: 'F', value: 'Female Villain' },
132
- { sex: 'B', value: 'B Sex' },
133
- { alignment: 'Y', sex: 'B', value: 'B Y' },
134
- { alignment: 'P', sex: 'F', value: 'Female Praetorian' },
135
- { alignment: 'X', sex: 'A', value: 'A X' },
130
+ { alignment: 'villain', value: 'Villain' },
131
+ { alignment: 'villain', sex: 'F', value: 'Female Villain' },
132
+ { alignment: 'praetorian', sex: 'F', value: 'Female Praetorian' },
136
133
  { value: 'Default' },
137
- { alignment: 'Y', sex: 'F', value: 'Female Y' },
138
134
  ]).canonical
139
135
 
140
136
  expect(result).toStrictEqual([
141
137
  { value: 'Default' },
142
138
  { sex: 'M', value: 'Male' },
143
139
  { sex: 'F', value: 'Female' },
144
- { sex: 'A', value: 'A Sex' },
145
- { sex: 'B', value: 'B Sex' },
146
- { alignment: 'H', value: 'Hero' },
147
- { alignment: 'V', value: 'Villain' },
148
- { alignment: 'P', value: 'Praetorian' },
149
- { alignment: 'X', value: 'X' },
150
- { alignment: 'H', sex: 'M', value: 'Male Hero' },
151
- { alignment: 'H', sex: 'F', value: 'Female Hero' },
152
- { alignment: 'H', sex: 'A', value: 'A Hero' },
153
- { alignment: 'H', sex: 'B', value: 'B Hero' },
154
- { alignment: 'V', sex: 'M', value: 'Male Villain' },
155
- { alignment: 'V', sex: 'F', value: 'Female Villain' },
156
- { alignment: 'V', sex: 'A', value: 'A Villain' },
157
- { alignment: 'V', sex: 'B', value: 'B Villain' },
158
- { alignment: 'P', sex: 'M', value: 'Male Praetorian' },
159
- { alignment: 'P', sex: 'F', value: 'Female Praetorian' },
160
- { alignment: 'P', sex: 'A', value: 'A Praetorian' },
161
- { alignment: 'P', sex: 'B', value: 'B Praetorian' },
162
- { alignment: 'X', sex: 'M', value: 'Male X' },
163
- { alignment: 'X', sex: 'F', value: 'Female X' },
164
- { alignment: 'X', sex: 'A', value: 'A X' },
165
- { alignment: 'X', sex: 'B', value: 'B X' },
166
- { alignment: 'Y', sex: 'M', value: 'Male Y' },
167
- { alignment: 'Y', sex: 'F', value: 'Female Y' },
168
- { alignment: 'Y', sex: 'A', value: 'A Y' },
169
- { alignment: 'Y', sex: 'B', value: 'B Y' },
140
+ { alignment: 'hero', value: 'Hero' },
141
+ { alignment: 'villain', value: 'Villain' },
142
+ { alignment: 'praetorian', value: 'Praetorian' },
143
+ { alignment: 'hero', sex: 'M', value: 'Male Hero' },
144
+ { alignment: 'hero', sex: 'F', value: 'Female Hero' },
145
+ { alignment: 'villain', sex: 'M', value: 'Male Villain' },
146
+ { alignment: 'villain', sex: 'F', value: 'Female Villain' },
147
+ { alignment: 'praetorian', sex: 'M', value: 'Male Praetorian' },
148
+ { alignment: 'praetorian', sex: 'F', value: 'Female Praetorian' },
170
149
  ])
171
150
  })
172
151
 
@@ -182,42 +161,28 @@ describe(Alternates.name, () => {
182
161
  ])
183
162
  })
184
163
 
185
- test('should sort identical values similarly', () => {
164
+ test('should sort identical values by value alpha', () => {
186
165
  expect(new Alternates([
187
- { value: 'A' },
188
- { value: 'B' },
189
- { value: 'C' },
190
- { value: 'B' },
166
+ { alignment: 'villain', value: 'B' },
167
+ { sex: 'M', value: 'D' },
168
+ { alignment: 'villain', value: 'A' },
169
+ { sex: 'M', value: 'C' },
191
170
  ]).canonical).toStrictEqual([
192
- { value: 'A' },
193
- { value: 'B' },
194
- { value: 'B' },
195
- { value: 'C' },
196
- ])
197
- })
198
-
199
- test('should sort unknown alignments by alpha', () => {
200
- expect(new Alternates([
201
- { alignment: 'A', value: 'A' },
202
- { alignment: 'C', value: 'C' },
203
- { alignment: 'B', value: 'B' },
204
- ]).canonical).toStrictEqual([
205
- { alignment: 'A', value: 'A' },
206
- { alignment: 'B', value: 'B' },
207
- { alignment: 'C', value: 'C' },
171
+ { sex: 'M', value: 'C' },
172
+ { sex: 'M', value: 'D' },
173
+ { alignment: 'villain', value: 'A' },
174
+ { alignment: 'villain', value: 'B' },
208
175
  ])
209
176
  })
177
+ })
210
178
 
211
- test('should sort unknown sex by alpha', () => {
179
+ describe('toString', () => {
180
+ test('should create a string separated by the separator', () => {
212
181
  expect(new Alternates([
213
- { sex: 'A', value: 'A' },
214
- { sex: 'C', value: 'C' },
215
- { sex: 'B', value: 'B' },
216
- ]).canonical).toStrictEqual([
217
- { sex: 'A', value: 'A' },
218
- { sex: 'B', value: 'B' },
219
- { sex: 'C', value: 'C' },
220
- ])
182
+ { sex: 'M', value: 'A' },
183
+ { sex: 'F', value: 'B' },
184
+ { alignment: 'hero', value: 'C' },
185
+ ]).toString(', ')).toBe('A, B, C')
221
186
  })
222
187
  })
223
188
  })