@futdevpro/fsm-dynamo 1.16.29 → 1.16.31

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 (33) hide show
  1. package/build/_modules/game/_collections/audio-mixer.util.d.ts +55 -0
  2. package/build/_modules/game/_collections/audio-mixer.util.d.ts.map +1 -0
  3. package/build/_modules/game/_collections/audio-mixer.util.js +114 -0
  4. package/build/_modules/game/_collections/audio-mixer.util.js.map +1 -0
  5. package/build/_modules/game/_enums/audio-channel.enum.d.ts +17 -0
  6. package/build/_modules/game/_enums/audio-channel.enum.d.ts.map +1 -0
  7. package/build/_modules/game/_enums/audio-channel.enum.js +21 -0
  8. package/build/_modules/game/_enums/audio-channel.enum.js.map +1 -0
  9. package/build/_modules/game/_models/audio-mixer-settings.interface.d.ts +23 -0
  10. package/build/_modules/game/_models/audio-mixer-settings.interface.d.ts.map +1 -0
  11. package/build/_modules/game/_models/audio-mixer-settings.interface.js +3 -0
  12. package/build/_modules/game/_models/audio-mixer-settings.interface.js.map +1 -0
  13. package/build/_modules/game/_models/seeded-random-state.interface.d.ts +17 -0
  14. package/build/_modules/game/_models/seeded-random-state.interface.d.ts.map +1 -0
  15. package/build/_modules/game/_models/seeded-random-state.interface.js +3 -0
  16. package/build/_modules/game/_models/seeded-random-state.interface.js.map +1 -0
  17. package/build/_modules/game/_models/seeded-random.control-model.d.ts +125 -0
  18. package/build/_modules/game/_models/seeded-random.control-model.d.ts.map +1 -0
  19. package/build/_modules/game/_models/seeded-random.control-model.js +263 -0
  20. package/build/_modules/game/_models/seeded-random.control-model.js.map +1 -0
  21. package/build/_modules/game/index.d.ts +6 -0
  22. package/build/_modules/game/index.d.ts.map +1 -0
  23. package/build/_modules/game/index.js +12 -0
  24. package/build/_modules/game/index.js.map +1 -0
  25. package/package.json +12 -3
  26. package/src/_modules/game/_collections/audio-mixer.util.spec.ts +198 -0
  27. package/src/_modules/game/_collections/audio-mixer.util.ts +143 -0
  28. package/src/_modules/game/_enums/audio-channel.enum.ts +18 -0
  29. package/src/_modules/game/_models/audio-mixer-settings.interface.ts +28 -0
  30. package/src/_modules/game/_models/seeded-random-state.interface.ts +21 -0
  31. package/src/_modules/game/_models/seeded-random.control-model.spec.ts +290 -0
  32. package/src/_modules/game/_models/seeded-random.control-model.ts +311 -0
  33. package/src/_modules/game/index.ts +10 -0
@@ -0,0 +1,143 @@
1
+
2
+
3
+ import { DyFM_AudioChannel } from '../_enums/audio-channel.enum';
4
+ import { DyFM_AudioMixer_Settings } from '../_models/audio-mixer-settings.interface';
5
+
6
+
7
+ /**
8
+ * Statikus util a jatek-audio mixer beallitasaihoz.
9
+ *
10
+ * Rendereles-agnosztikus es platform-fuggetlen: NINCS benne DOM, Web Audio, Angular vagy Node
11
+ * fuggoseg — a tenyleges lejatszast az `@futdevpro/ngx-dynamo` game-modulja (vagy a projekt sajat
12
+ * motorja) vegzi, ez csak a **modell + szamitas**.
13
+ *
14
+ * **Hasznalat:**
15
+ * ```typescript
16
+ * const settings: DyFM_AudioMixer_Settings = DyFM_AudioMixer_Util.merge(loadedFromSave);
17
+ * const volume: number = DyFM_AudioMixer_Util.getEffectiveVolume(settings, DyFM_AudioChannel.music);
18
+ * audioElement.volume = volume;
19
+ * ```
20
+ */
21
+ export class DyFM_AudioMixer_Util {
22
+
23
+ /** Alapertelmezett hangero minden csatornara (0..1). */
24
+ private static readonly defaultVolume: number = 0.8;
25
+
26
+ /**
27
+ * Az alapertelmezett mixer-beallitas. Minden hivas UJ objektumot ad vissza, hogy a
28
+ * hivo szabadon mutalhassa (nincs megosztott referencia).
29
+ */
30
+ static getDefaults(): DyFM_AudioMixer_Settings {
31
+ return {
32
+ master: this.defaultVolume,
33
+ music: this.defaultVolume,
34
+ ambience: this.defaultVolume,
35
+ effects: this.defaultVolume,
36
+ muted: false,
37
+ };
38
+ }
39
+
40
+ /**
41
+ * Egy hangero-erteket a 0..1 tartomanyba szorit. A nem-szamokat (NaN, undefined, null,
42
+ * nem-szam tipus) a `fallback`-re cseréli — igy egy serult save-payload sem tud NaN-t
43
+ * juttatni a lejatszoba (a `HTMLAudioElement.volume = NaN` dobna).
44
+ */
45
+ static clamp(value: number, fallback: number = DyFM_AudioMixer_Util.defaultVolume): number {
46
+ if (typeof value !== 'number' || Number.isNaN(value)) {
47
+ return fallback;
48
+ }
49
+
50
+ if (value < 0) {
51
+ return 0;
52
+ }
53
+
54
+ if (1 < value) {
55
+ return 1;
56
+ }
57
+
58
+ return value;
59
+ }
60
+
61
+ /**
62
+ * Reszleges (vagy hianyzo) beallitas-objektumbol teljes, ervenyes settingset allit elo:
63
+ * a hianyzo mezoket a defaultbol veszi, a meglevoket 0..1-re szoritja.
64
+ *
65
+ * **Ez a migracios biztositek:** egy regi save-payload, ami meg nem ismerte az `ambience`
66
+ * csatornat, igy is betoltheto marad.
67
+ */
68
+ static merge(partial?: Partial<DyFM_AudioMixer_Settings> | null): DyFM_AudioMixer_Settings {
69
+ const defaults: DyFM_AudioMixer_Settings = this.getDefaults();
70
+
71
+ if (!partial) {
72
+ return defaults;
73
+ }
74
+
75
+ return {
76
+ master: this.clamp(partial.master ?? defaults.master, defaults.master),
77
+ music: this.clamp(partial.music ?? defaults.music, defaults.music),
78
+ ambience: this.clamp(partial.ambience ?? defaults.ambience, defaults.ambience),
79
+ effects: this.clamp(partial.effects ?? defaults.effects, defaults.effects),
80
+ muted: partial.muted === true,
81
+ };
82
+ }
83
+
84
+ /**
85
+ * Egy csatorna EFFEKTIV hangereje: a csatorna sajat erteke szorozva a master-rel.
86
+ * Nemitas (`muted`) eseten mindig 0. A `master` csatornara a sajat erteket adja vissza
87
+ * (nem negyzetre emelve).
88
+ */
89
+ static getEffectiveVolume(
90
+ settings: DyFM_AudioMixer_Settings,
91
+ channel: DyFM_AudioChannel,
92
+ ): number {
93
+ const safe: DyFM_AudioMixer_Settings = this.merge(settings);
94
+
95
+ if (safe.muted) {
96
+ return 0;
97
+ }
98
+
99
+ if (channel === DyFM_AudioChannel.master) {
100
+ return safe.master;
101
+ }
102
+
103
+ return this.clamp(safe[channel] * safe.master);
104
+ }
105
+
106
+ /**
107
+ * Egy csatorna hangerejenek beallitasa — UJ settings-objektumot ad vissza (immutable update),
108
+ * hogy signal-/state-alapu tarolokban is biztonsagos legyen.
109
+ */
110
+ static withChannelVolume(
111
+ settings: DyFM_AudioMixer_Settings,
112
+ channel: DyFM_AudioChannel,
113
+ volume: number,
114
+ ): DyFM_AudioMixer_Settings {
115
+ const next: DyFM_AudioMixer_Settings = this.merge(settings);
116
+ next[channel] = this.clamp(volume);
117
+
118
+ return next;
119
+ }
120
+
121
+ /** Nemitas beallitasa — UJ settings-objektumot ad vissza (immutable update). */
122
+ static withMuted(
123
+ settings: DyFM_AudioMixer_Settings,
124
+ muted: boolean,
125
+ ): DyFM_AudioMixer_Settings {
126
+ const next: DyFM_AudioMixer_Settings = this.merge(settings);
127
+ next.muted = muted === true;
128
+
129
+ return next;
130
+ }
131
+
132
+ /** Ket beallitas ertek szerinti egyezese (mentes-szukseg / change-detection dontesehez). */
133
+ static isEqual(a: DyFM_AudioMixer_Settings, b: DyFM_AudioMixer_Settings): boolean {
134
+ const left: DyFM_AudioMixer_Settings = this.merge(a);
135
+ const right: DyFM_AudioMixer_Settings = this.merge(b);
136
+
137
+ return left.master === right.master
138
+ && left.music === right.music
139
+ && left.ambience === right.ambience
140
+ && left.effects === right.effects
141
+ && left.muted === right.muted;
142
+ }
143
+ }
@@ -0,0 +1,18 @@
1
+
2
+
3
+ /**
4
+ * A jatek-audio mixer csatornai.
5
+ *
6
+ * A flotta NEGY jateka egymastol fuggetlenul ugyanezt a negy csatornat vezette be
7
+ * (Prototyper: Room Cats / Cell Stage / Portalhold, plusz a Hero Coordinator) — ez az
8
+ * enum a kanonikus nevezektan, amire mindegyik ratert.
9
+ *
10
+ * A `master` NEM onallo hangsav: minden csatorna effektiv hangereje a sajat erteke
11
+ * SZOROZVA a master-rel (lasd `DyFM_AudioMixer_Util.getEffectiveVolume`).
12
+ */
13
+ export enum DyFM_AudioChannel {
14
+ master = 'master',
15
+ music = 'music',
16
+ ambience = 'ambience',
17
+ effects = 'effects',
18
+ }
@@ -0,0 +1,28 @@
1
+
2
+
3
+ /**
4
+ * A jatek-audio mixer beallitasai — csatornankent 0..1 hangero + globalis nemitas.
5
+ *
6
+ * **Miert bedrock:** ez az interfesz a flottaban NEGY helyen elt egymastol fuggetlenul,
7
+ * karakterre azonos alakban (`pcr-audio-settings.interface.ts`, `pcs-audio-settings.interface.ts`,
8
+ * `pg-audio-settings.interface.ts` + a Hero Coordinator sajat audio-service-e). Ez a kanonikus alak.
9
+ *
10
+ * **Mentheto:** tisztan JSON-serializalhato, tehat a jatek save-payload resze lehet.
11
+ * Reszleges/legacy payload-bol a `DyFM_AudioMixer_Util.merge()` allit elo teljes settingset.
12
+ */
13
+ export interface DyFM_AudioMixer_Settings {
14
+ /** Fo-hangero (0..1) — minden csatornara szorzodik. */
15
+ master: number;
16
+
17
+ /** Zene-csatorna hangereje (0..1). */
18
+ music: number;
19
+
20
+ /** Kornyezeti hangok (ambience) csatorna hangereje (0..1). */
21
+ ambience: number;
22
+
23
+ /** Effekt-hangok csatorna hangereje (0..1). */
24
+ effects: number;
25
+
26
+ /** Globalis nemitas — ha true, minden effektiv hangero 0. */
27
+ muted: boolean;
28
+ }
@@ -0,0 +1,21 @@
1
+
2
+
3
+ /**
4
+ * A `DyFM_SeededRandom` teljes belso allapota — 4 db 32-bites egesz (sfc32).
5
+ *
6
+ * Tisztan JSON-serializalhato, tehat **a jatek save-payload resze lehet**: a mentes utan
7
+ * visszatoltve a veletlen-sorozat PONTOSAN ott folytatodik, ahol abbamaradt.
8
+ */
9
+ export interface DyFM_SeededRandom_State {
10
+ /** sfc32 allapot-szo #1. */
11
+ a: number;
12
+
13
+ /** sfc32 allapot-szo #2. */
14
+ b: number;
15
+
16
+ /** sfc32 allapot-szo #3. */
17
+ c: number;
18
+
19
+ /** sfc32 counter-szo. */
20
+ d: number;
21
+ }
@@ -0,0 +1,290 @@
1
+
2
+ import { DyFM_SeededRandom } from './seeded-random.control-model';
3
+ import { DyFM_SeededRandom_State } from './seeded-random-state.interface';
4
+
5
+
6
+ describe('DyFM_SeededRandom', (): void => {
7
+
8
+ describe('determinizmus', (): void => {
9
+
10
+ it('ugyanaz a string-seed ugyanazt a sorozatot adja', (): void => {
11
+ const first: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('world-42');
12
+ const second: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('world-42');
13
+
14
+ const firstRun: number[] = [];
15
+ const secondRun: number[] = [];
16
+
17
+ for (let i = 0; i < 50; i++) {
18
+ firstRun.push(first.nextFloat());
19
+ secondRun.push(second.nextFloat());
20
+ }
21
+
22
+ expect(firstRun).toEqual(secondRun);
23
+ });
24
+
25
+ it('ugyanaz a szam-seed ugyanazt a sorozatot adja', (): void => {
26
+ const first: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed(1234);
27
+ const second: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed(1234);
28
+
29
+ expect(first.nextInt(0, 1000000)).toBe(second.nextInt(0, 1000000));
30
+ });
31
+
32
+ it('kulonbozo seed kulonbozo sorozatot ad', (): void => {
33
+ const first: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('a');
34
+ const second: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('b');
35
+
36
+ const firstRun: number[] = [];
37
+ const secondRun: number[] = [];
38
+
39
+ for (let i = 0; i < 20; i++) {
40
+ firstRun.push(first.nextFloat());
41
+ secondRun.push(second.nextFloat());
42
+ }
43
+
44
+ expect(firstRun).not.toEqual(secondRun);
45
+ });
46
+
47
+ it('ket fuggetlen instance nem befolyasolja egymast', (): void => {
48
+ const first: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('shared');
49
+ const second: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('shared');
50
+
51
+ first.nextFloat();
52
+ first.nextFloat();
53
+ first.nextFloat();
54
+
55
+ const untouched: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('shared');
56
+
57
+ expect(second.nextFloat()).toBe(untouched.nextFloat());
58
+ });
59
+ });
60
+
61
+ describe('allapot mentese es visszatoltese', (): void => {
62
+
63
+ it('setState(getState()) utan a sorozat FOLYTATODIK, nem ujraindul', (): void => {
64
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('save-test');
65
+
66
+ rng.nextFloat();
67
+ rng.nextFloat();
68
+
69
+ const snapshot: DyFM_SeededRandom_State = rng.getState();
70
+ const expected: number[] = [rng.nextFloat(), rng.nextFloat(), rng.nextFloat()];
71
+
72
+ const restored: DyFM_SeededRandom = DyFM_SeededRandom.fromState(snapshot);
73
+ const actual: number[] = [restored.nextFloat(), restored.nextFloat(), restored.nextFloat()];
74
+
75
+ expect(actual).toEqual(expected);
76
+ });
77
+
78
+ it('a getState() masolatot ad — a kesobbi huzasok nem irjak at', (): void => {
79
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('copy-test');
80
+ const snapshot: DyFM_SeededRandom_State = rng.getState();
81
+ const before: DyFM_SeededRandom_State = { a: snapshot.a, b: snapshot.b, c: snapshot.c, d: snapshot.d };
82
+
83
+ rng.nextFloat();
84
+ rng.nextFloat();
85
+
86
+ expect(snapshot).toEqual(before);
87
+ });
88
+
89
+ it('az allapot JSON-korutjat tuleli (save-payload szimulacio)', (): void => {
90
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('json-test');
91
+ rng.nextFloat();
92
+
93
+ const serialized: string = JSON.stringify(rng.getState());
94
+ const parsed: DyFM_SeededRandom_State = JSON.parse(serialized);
95
+ const restored: DyFM_SeededRandom = DyFM_SeededRandom.fromState(parsed);
96
+
97
+ expect(restored.nextFloat()).toBe(DyFM_SeededRandom.fromState(rng.getState()).nextFloat());
98
+ });
99
+
100
+ it('a clone() ugyanonnan folytatja, de fuggetlenne valik', (): void => {
101
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('clone-test');
102
+ rng.nextFloat();
103
+
104
+ const clone: DyFM_SeededRandom = rng.clone();
105
+ const fromClone: number = clone.nextFloat();
106
+ const fromOriginal: number = rng.nextFloat();
107
+
108
+ expect(fromClone).toBe(fromOriginal);
109
+
110
+ clone.nextFloat();
111
+ clone.nextFloat();
112
+
113
+ expect(rng.nextFloat()).not.toBe(clone.nextFloat());
114
+ });
115
+
116
+ it('ervenytelen allapotra DyFM_Error-t dob', (): void => {
117
+ expect((): DyFM_SeededRandom => DyFM_SeededRandom.fromState(null)).toThrow();
118
+ expect((): DyFM_SeededRandom => DyFM_SeededRandom.fromState({ a: 1, b: 2, c: 3, d: undefined })).toThrow();
119
+ });
120
+
121
+ it('ervenytelen seed-tipusra DyFM_Error-t dob', (): void => {
122
+ expect((): DyFM_SeededRandom => DyFM_SeededRandom.fromSeed(undefined)).toThrow();
123
+ });
124
+ });
125
+
126
+ describe('tartomanyok es eloszlas', (): void => {
127
+
128
+ it('nextFloat mindig [0, 1) kozott van', (): void => {
129
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('range-test');
130
+
131
+ for (let i = 0; i < 10000; i++) {
132
+ const value: number = rng.nextFloat();
133
+ expect(value).toBeGreaterThanOrEqual(0);
134
+ expect(value).toBeLessThan(1);
135
+ }
136
+ });
137
+
138
+ it('nextInt a zart [min, max] tartomanyban marad es minden erteket eltalal', (): void => {
139
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('int-test');
140
+ const seen: Set<number> = new Set<number>();
141
+
142
+ for (let i = 0; i < 10000; i++) {
143
+ const value: number = rng.nextInt(1, 6);
144
+ expect(value).toBeGreaterThanOrEqual(1);
145
+ expect(value).toBeLessThanOrEqual(6);
146
+ seen.add(value);
147
+ }
148
+
149
+ expect(seen.size).toBe(6);
150
+ });
151
+
152
+ it('nextInt felcserelt hatarokat is kezel', (): void => {
153
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('swap-test');
154
+ const value: number = rng.nextInt(10, 2);
155
+
156
+ expect(value).toBeGreaterThanOrEqual(2);
157
+ expect(value).toBeLessThanOrEqual(10);
158
+ });
159
+
160
+ it('nextRange a [min, max) tartomanyban marad', (): void => {
161
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('float-range');
162
+
163
+ for (let i = 0; i < 1000; i++) {
164
+ const value: number = rng.nextRange(-5, 5);
165
+ expect(value).toBeGreaterThanOrEqual(-5);
166
+ expect(value).toBeLessThan(5);
167
+ }
168
+ });
169
+
170
+ it('nextBool(0) mindig false, nextBool(1) mindig true', (): void => {
171
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('bool-test');
172
+
173
+ for (let i = 0; i < 100; i++) {
174
+ expect(rng.nextBool(0)).toBe(false);
175
+ expect(rng.nextBool(1)).toBe(true);
176
+ }
177
+ });
178
+ });
179
+
180
+ describe('DyFM_Random API-paritas', (): void => {
181
+
182
+ it('getRandomInt a nextInt aliasa', (): void => {
183
+ const first: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('alias-test');
184
+ const second: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('alias-test');
185
+
186
+ expect(first.getRandomInt(1, 100)).toBe(second.nextInt(1, 100));
187
+ });
188
+
189
+ it('getRandomListElement ures listara null-t ad', (): void => {
190
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('empty-test');
191
+
192
+ expect(rng.getRandomListElement([])).toBeNull();
193
+ expect(rng.getRandomListElement(null)).toBeNull();
194
+ });
195
+
196
+ it('getRandomListElement mindig a listabol valaszt', (): void => {
197
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('list-test');
198
+ const list: string[] = ['a', 'b', 'c'];
199
+
200
+ for (let i = 0; i < 500; i++) {
201
+ expect(list).toContain(rng.getRandomListElement(list));
202
+ }
203
+ });
204
+
205
+ it('getRandomWeighted NEM mutalja a bemeneti tombot', (): void => {
206
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('weight-mutate');
207
+ const weights = [
208
+ { chance: 0.2, result: 'low' },
209
+ { chance: 0.8, result: 'high' },
210
+ ];
211
+ const before: string = JSON.stringify(weights);
212
+
213
+ rng.getRandomWeighted(weights);
214
+
215
+ expect(JSON.stringify(weights)).toBe(before);
216
+ });
217
+
218
+ it('getRandomWeighted a sulyoknak megfeleloen oszlik el', (): void => {
219
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('weight-dist');
220
+ let highCount = 0;
221
+
222
+ for (let i = 0; i < 10000; i++) {
223
+ if (rng.getRandomWeighted([
224
+ { chance: 0.1, result: 'low' },
225
+ { chance: 0.9, result: 'high' },
226
+ ]) === 'high') {
227
+ highCount++;
228
+ }
229
+ }
230
+
231
+ expect(highCount).toBeGreaterThan(8500);
232
+ expect(highCount).toBeLessThan(9500);
233
+ });
234
+
235
+ it('getRandomWeighted ures listara null-t ad', (): void => {
236
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('weight-empty');
237
+
238
+ expect(rng.getRandomWeighted([])).toBeNull();
239
+ });
240
+
241
+ it('getRandomWeightedInt visszaesik nextInt-re, ha nincs suly', (): void => {
242
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('weight-int');
243
+ const value: number = rng.getRandomWeightedInt(5, 10, []);
244
+
245
+ expect(value).toBeGreaterThanOrEqual(5);
246
+ expect(value).toBeLessThanOrEqual(10);
247
+ });
248
+ });
249
+
250
+ describe('shuffle es pick', (): void => {
251
+
252
+ it('a shuffle NEM mutalja a bemenetet es megorzi az elemeket', (): void => {
253
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('shuffle-test');
254
+ const source: number[] = [1, 2, 3, 4, 5, 6, 7, 8];
255
+ const shuffled: number[] = rng.shuffle(source);
256
+
257
+ expect(source).toEqual([1, 2, 3, 4, 5, 6, 7, 8]);
258
+ expect(shuffled.slice().sort((a: number, b: number): number => a - b)).toEqual(source);
259
+ });
260
+
261
+ it('a shuffle determinisztikus azonos seeddel', (): void => {
262
+ const first: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('shuffle-det');
263
+ const second: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('shuffle-det');
264
+ const source: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
265
+
266
+ expect(first.shuffle(source)).toEqual(second.shuffle(source));
267
+ });
268
+
269
+ it('a pick kulonbozo elemeket ad, a keresnel nem tobbet', (): void => {
270
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('pick-test');
271
+ const picked: number[] = rng.pick([1, 2, 3, 4, 5], 3);
272
+
273
+ expect(picked.length).toBe(3);
274
+ expect(new Set<number>(picked).size).toBe(3);
275
+ });
276
+
277
+ it('a pick a teljes listat adja, ha count nagyobb a hossznal', (): void => {
278
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('pick-over');
279
+
280
+ expect(rng.pick([1, 2], 10).length).toBe(2);
281
+ });
282
+
283
+ it('a pick ures listara / nem-pozitiv count-ra ures tombot ad', (): void => {
284
+ const rng: DyFM_SeededRandom = DyFM_SeededRandom.fromSeed('pick-empty');
285
+
286
+ expect(rng.pick([], 3)).toEqual([]);
287
+ expect(rng.pick([1, 2, 3], 0)).toEqual([]);
288
+ });
289
+ });
290
+ });