@testgorilla/tgo-typing-test 2.0.0 → 2.0.1

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 (99) hide show
  1. package/fesm2022/testgorilla-tgo-typing-test.mjs +4691 -0
  2. package/fesm2022/testgorilla-tgo-typing-test.mjs.map +1 -0
  3. package/lib/components/tgo-typing-replay-input/tgo-typing-replay-input.component.d.ts +14 -0
  4. package/lib/components/tgo-typing-test/tgo-typing-test.component.d.ts +54 -0
  5. package/lib/helpers/config.d.ts +98 -0
  6. package/lib/helpers/constants/default-config.d.ts +3 -0
  7. package/lib/helpers/controllers/input-controller.d.ts +16 -0
  8. package/lib/helpers/controllers/quotes-controller.d.ts +20 -0
  9. package/lib/helpers/observables/config-event.d.ts +5 -0
  10. package/lib/helpers/observables/timer-event.d.ts +4 -0
  11. package/lib/helpers/states/active-page.d.ts +2 -0
  12. package/lib/helpers/states/composition.d.ts +10 -0
  13. package/lib/helpers/states/page-transition.d.ts +2 -0
  14. package/lib/helpers/states/slow-timer.d.ts +3 -0
  15. package/lib/helpers/states/test-active.d.ts +2 -0
  16. package/lib/helpers/states/time.d.ts +3 -0
  17. package/lib/helpers/test/caps-warning.d.ts +5 -0
  18. package/lib/helpers/test/caret.d.ts +11 -0
  19. package/lib/helpers/test/custom-text.d.ts +16 -0
  20. package/lib/helpers/test/english-punctuation.d.ts +3 -0
  21. package/lib/helpers/test/focus.d.ts +7 -0
  22. package/lib/helpers/test/manual-restart-tracker.d.ts +3 -0
  23. package/lib/helpers/test/out-of-focus.d.ts +4 -0
  24. package/lib/helpers/test/replay.d.ts +20 -0
  25. package/lib/helpers/test/test-input.d.ts +86 -0
  26. package/lib/helpers/test/test-logic.d.ts +25 -0
  27. package/lib/helpers/test/test-state.d.ts +7 -0
  28. package/lib/helpers/test/test-stats.d.ts +92 -0
  29. package/lib/helpers/test/test-timer.d.ts +6 -0
  30. package/lib/helpers/test/test-ui.d.ts +27 -0
  31. package/lib/helpers/test/test-words.d.ts +23 -0
  32. package/lib/helpers/test/timer-progress.d.ts +3 -0
  33. package/lib/helpers/test/weak-spot.d.ts +3 -0
  34. package/lib/helpers/test/wordset.d.ts +7 -0
  35. package/lib/utils/misc.d.ts +80 -0
  36. package/package.json +17 -4
  37. package/.eslintrc.json +0 -46
  38. package/jest.config.ts +0 -21
  39. package/ng-package.json +0 -15
  40. package/project.json +0 -36
  41. package/src/lib/components/tgo-typing-replay-input/tgo-typing-replay-input.component.html +0 -30
  42. package/src/lib/components/tgo-typing-replay-input/tgo-typing-replay-input.component.spec.ts +0 -250
  43. package/src/lib/components/tgo-typing-replay-input/tgo-typing-replay-input.component.ts +0 -47
  44. package/src/lib/components/tgo-typing-test/tgo-typing-test.component.html +0 -72
  45. package/src/lib/components/tgo-typing-test/tgo-typing-test.component.spec.ts +0 -699
  46. package/src/lib/components/tgo-typing-test/tgo-typing-test.component.ts +0 -287
  47. package/src/lib/helpers/config.ts +0 -28
  48. package/src/lib/helpers/constants/default-config.ts +0 -103
  49. package/src/lib/helpers/controllers/input-controller.ts +0 -710
  50. package/src/lib/helpers/controllers/quotes-controller.ts +0 -183
  51. package/src/lib/helpers/observables/banner-event.ts +0 -18
  52. package/src/lib/helpers/observables/config-event.ts +0 -31
  53. package/src/lib/helpers/observables/timer-event.ts +0 -18
  54. package/src/lib/helpers/states/active-page.ts +0 -9
  55. package/src/lib/helpers/states/composition.ts +0 -29
  56. package/src/lib/helpers/states/page-transition.ts +0 -9
  57. package/src/lib/helpers/states/slow-timer.ts +0 -16
  58. package/src/lib/helpers/states/test-active.ts +0 -9
  59. package/src/lib/helpers/states/time.ts +0 -13
  60. package/src/lib/helpers/test/caps-warning.ts +0 -50
  61. package/src/lib/helpers/test/caret.ts +0 -92
  62. package/src/lib/helpers/test/custom-text.ts +0 -73
  63. package/src/lib/helpers/test/english-punctuation.ts +0 -38
  64. package/src/lib/helpers/test/focus.ts +0 -39
  65. package/src/lib/helpers/test/manual-restart-tracker.ts +0 -13
  66. package/src/lib/helpers/test/out-of-focus.ts +0 -19
  67. package/src/lib/helpers/test/replay.ts +0 -265
  68. package/src/lib/helpers/test/test-input.ts +0 -320
  69. package/src/lib/helpers/test/test-logic.ts +0 -1039
  70. package/src/lib/helpers/test/test-state.ts +0 -17
  71. package/src/lib/helpers/test/test-stats.ts +0 -442
  72. package/src/lib/helpers/test/test-timer.ts +0 -209
  73. package/src/lib/helpers/test/test-ui.ts +0 -370
  74. package/src/lib/helpers/test/test-words.ts +0 -72
  75. package/src/lib/helpers/test/timer-progress.ts +0 -16
  76. package/src/lib/helpers/test/tts.ts +0 -42
  77. package/src/lib/helpers/test/weak-spot.ts +0 -74
  78. package/src/lib/helpers/test/wordset.ts +0 -109
  79. package/src/lib/styles/animations.scss +0 -101
  80. package/src/lib/styles/caret.scss +0 -108
  81. package/src/lib/styles/core.scss +0 -498
  82. package/src/lib/styles/index.scss +0 -19
  83. package/src/lib/styles/inputs.scss +0 -290
  84. package/src/lib/styles/popups.scss +0 -1311
  85. package/src/lib/styles/test.scss +0 -1008
  86. package/src/lib/styles/z_media-queries.scss +0 -848
  87. package/src/lib/types/types.d.ts +0 -731
  88. package/src/lib/utils/misc.ts +0 -776
  89. package/src/test-setup.ts +0 -20
  90. package/tsconfig.json +0 -16
  91. package/tsconfig.lib.json +0 -14
  92. package/tsconfig.lib.prod.json +0 -9
  93. package/tsconfig.spec.json +0 -11
  94. /package/{src/assets → assets}/typing-test-languages/english.json +0 -0
  95. /package/{src/assets → assets}/typing-test-languages/english_punctuation.json +0 -0
  96. /package/{src/assets → assets}/typing-test-languages/quotes/english_version_1.json +0 -0
  97. /package/{src/assets → assets}/typing-test-languages/quotes/english_version_2.json +0 -0
  98. /package/{src/assets → assets}/typing-test-languages/quotes/filtered_sources.json +0 -0
  99. /package/{src/index.ts → index.d.ts} +0 -0
@@ -0,0 +1,80 @@
1
+ import { MonkeyTypes } from '../types/types';
2
+ export declare const QuoteNetworkErrorMessage = "Text not loading.";
3
+ export declare function emitQuoteNetworkError(): void;
4
+ export declare const QuoteNetworkError$: import("rxjs").Observable<string>;
5
+ export declare function isColorLight(hex: string): boolean;
6
+ export declare function isColorDark(hex: string): boolean;
7
+ export declare function getLanguage(lang: string): Promise<MonkeyTypes.LanguageObject>;
8
+ export declare function getCurrentLanguage(languageName: string): Promise<MonkeyTypes.LanguageObject>;
9
+ export declare function smooth(arr: number[], windowSize: number, getter?: (value: number) => number): number[];
10
+ export declare function stdDev(array: number[]): number;
11
+ export declare function mean(array: number[]): number;
12
+ export declare function median(arr: number[]): number;
13
+ export declare function getLastChar(word: string): string;
14
+ export declare function capitalizeFirstLetterOfEachWord(str: string): string;
15
+ export declare function isASCIILetter(c: string): boolean;
16
+ export declare function kogasa(cov: number): number;
17
+ export declare function whorf(speed: number, wordlen: number): number;
18
+ export declare function roundTo2(num: number): number;
19
+ export declare function findLineByLeastSquares(values_y: number[]): number[][];
20
+ export declare function getGibberish(): string;
21
+ export declare function secondsToString(sec: number, alwaysShowMinutes?: boolean, alwaysShowHours?: boolean, delimiter?: ':' | 'text', showSeconds?: boolean, showDays?: boolean): string;
22
+ export declare function getNumbers(len: number, start?: number): string;
23
+ export declare function convertNumberToArabicIndic(numString: string): string;
24
+ export declare function getSpecials(): string;
25
+ export declare function getASCII(): string;
26
+ export declare function getArrows(): string;
27
+ export declare function getPositionString(number: number): string;
28
+ export declare function findGetParameter(parameterName: string, getOverride?: string): string | null;
29
+ export declare function objectToQueryString<T extends string | number | boolean>(obj: Record<string, T | T[]>): string;
30
+ declare global {
31
+ interface Document {
32
+ mozCancelFullScreen?: () => Promise<void>;
33
+ msRequestFullscreen?: () => Promise<void>;
34
+ msExitFullscreen?: () => Promise<void>;
35
+ webkitExitFullscreen?: () => Promise<void>;
36
+ mozFullScreenElement?: Element;
37
+ msFullscreenElement?: Element;
38
+ webkitFullscreenElement?: Element;
39
+ }
40
+ interface HTMLElement {
41
+ msRequestFullscreen?: () => Promise<void>;
42
+ mozRequestFullScreen?: () => Promise<void>;
43
+ webkitRequestFullscreen?: () => Promise<void>;
44
+ }
45
+ }
46
+ export declare function toggleFullscreen(): void;
47
+ export declare function remove_non_ascii(str: string): string;
48
+ export declare function escapeRegExp(str: string): string;
49
+ export declare function escapeHTML(str: string): string;
50
+ export declare function cleanTypographySymbols(textToClean: string): string;
51
+ export declare function isUsernameValid(name: string): boolean;
52
+ export declare function mapRange(x: number, in_min: number, in_max: number, out_min: number, out_max: number): number;
53
+ export declare function canQuickRestart(mode: string, words: number, time: number, CustomText: MonkeyTypes.CustomText): boolean;
54
+ export declare function clearTimeouts(timeouts: (number | NodeJS.Timeout)[]): void;
55
+ export declare function setCharAt(str: string, index: number, chr: string): string;
56
+ export declare function regexIndexOf(string: string, regex: RegExp, startpos: number): number;
57
+ export declare function convertRGBtoHEX(rgb: string): string | undefined;
58
+ export declare const trailingComposeChars: RegExp;
59
+ export declare function convertRemToPixels(rem: number): number;
60
+ export declare function getMode2(config: MonkeyTypes.Config, randomQuote: MonkeyTypes.Quote): string;
61
+ /**
62
+ * Gets an integer between min and max, both are inclusive.
63
+ * @param min
64
+ * @param max
65
+ * @returns Random integer betwen min and max.
66
+ */
67
+ export declare function randomIntFromRange(min: number, max: number): number;
68
+ /**
69
+ * Shuffle an array of elements using the Fisher–Yates algorithm.
70
+ * This function mutates the input array.
71
+ * @param elements
72
+ */
73
+ export declare function shuffle<T>(elements: T[]): void;
74
+ export declare function randomElementFromArray<T>(array: T[]): T;
75
+ export declare function randomElementFromObject<T extends object>(object: T): T[keyof T];
76
+ export declare function createErrorMessage(error: unknown, message: string): string;
77
+ export declare function getDiscordAvatarUrl(discordId?: string, discordAvatar?: string, discordAvatarSize?: number): Promise<string | null>;
78
+ export declare function getLevel(xp: number): number;
79
+ export declare function getXpForLevel(level: number): number;
80
+ export declare function abbreviateNumber(num: number): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testgorilla/tgo-typing-test",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "~19.2.17",
6
6
  "@angular/core": "~19.2.17",
@@ -8,9 +8,22 @@
8
8
  "jest-preset-angular": "14.4.2",
9
9
  "rxjs": "~7.8.1"
10
10
  },
11
- "typings": "src/lib/types",
11
+ "typings": "index.d.ts",
12
12
  "sideEffects": false,
13
13
  "license": "PROPRIETARY",
14
14
  "displayName": "Typing Test",
15
- "description": "Typing Test component"
16
- }
15
+ "description": "Typing Test component",
16
+ "module": "fesm2022/testgorilla-tgo-typing-test.mjs",
17
+ "exports": {
18
+ "./package.json": {
19
+ "default": "./package.json"
20
+ },
21
+ ".": {
22
+ "types": "./index.d.ts",
23
+ "default": "./fesm2022/testgorilla-tgo-typing-test.mjs"
24
+ }
25
+ },
26
+ "dependencies": {
27
+ "tslib": "^2.3.0"
28
+ }
29
+ }
package/.eslintrc.json DELETED
@@ -1,46 +0,0 @@
1
- {
2
- "extends": ["../../.eslintrc.json"],
3
- "ignorePatterns": ["!**/*"],
4
- "overrides": [
5
- {
6
- "files": ["*.ts"],
7
- "extends": ["plugin:@nx/angular", "plugin:@angular-eslint/template/process-inline-templates"],
8
- "rules": {
9
- "@angular-eslint/directive-selector": [
10
- "error",
11
- {
12
- "type": "attribute",
13
- "prefix": "tgo",
14
- "style": "camelCase"
15
- }
16
- ],
17
- "@angular-eslint/component-selector": [
18
- "error",
19
- {
20
- "type": "element",
21
- "prefix": "tgo",
22
- "style": "kebab-case"
23
- }
24
- ],
25
- "@angular-eslint/prefer-standalone": "off"
26
- }
27
- },
28
- {
29
- "files": ["*.html"],
30
- "extends": ["plugin:@nx/angular-template"],
31
- "rules": {}
32
- },
33
- {
34
- "files": ["*.json"],
35
- "parser": "jsonc-eslint-parser",
36
- "rules": {
37
- "@nx/dependency-checks": [
38
- "error",
39
- {
40
- "ignoredFiles": ["{projectRoot}/eslint.config.{js,cjs,mjs}"]
41
- }
42
- ]
43
- }
44
- }
45
- ]
46
- }
package/jest.config.ts DELETED
@@ -1,21 +0,0 @@
1
- export default {
2
- displayName: 'tgo-typing-test',
3
- preset: '../../jest.preset.js',
4
- setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
5
- coverageDirectory: '../../coverage/packages/tgo-typing-test',
6
- transform: {
7
- '^.+\\.(ts|mjs|js|html)$': [
8
- 'jest-preset-angular',
9
- {
10
- tsconfig: '<rootDir>/tsconfig.spec.json',
11
- stringifyContentPathRegex: '\\.(html|svg)$',
12
- },
13
- ],
14
- },
15
- transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
16
- snapshotSerializers: [
17
- 'jest-preset-angular/build/serializers/no-ng-attributes',
18
- 'jest-preset-angular/build/serializers/ng-snapshot',
19
- 'jest-preset-angular/build/serializers/html-comment',
20
- ],
21
- };
package/ng-package.json DELETED
@@ -1,15 +0,0 @@
1
- {
2
- "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
3
- "dest": "../../dist/packages/tgo-typing-test",
4
- "assets": [
5
- {
6
- "glob": "**/*",
7
- "input": "./src/assets",
8
- "output": "./assets"
9
- }
10
- ],
11
- "lib": {
12
- "entryFile": "./src/index.ts"
13
- },
14
- "allowedNonPeerDependencies": []
15
- }
package/project.json DELETED
@@ -1,36 +0,0 @@
1
- {
2
- "name": "tgo-typing-test",
3
- "$schema": "../../node_modules/nx/schemas/project-schema.json",
4
- "sourceRoot": "packages/tgo-typing-test/src",
5
- "prefix": "tgo",
6
- "projectType": "library",
7
- "tags": [],
8
- "targets": {
9
- "build": {
10
- "executor": "@nx/angular:package",
11
- "outputs": ["{workspaceRoot}/dist/{projectRoot}"],
12
- "options": {
13
- "project": "packages/tgo-typing-test/ng-package.json"
14
- },
15
- "configurations": {
16
- "production": {
17
- "tsConfig": "packages/tgo-typing-test/tsconfig.lib.prod.json"
18
- },
19
- "development": {
20
- "tsConfig": "packages/tgo-typing-test/tsconfig.lib.json"
21
- }
22
- },
23
- "defaultConfiguration": "production"
24
- },
25
- "test": {
26
- "executor": "@nx/jest:jest",
27
- "outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
28
- "options": {
29
- "jestConfig": "packages/tgo-typing-test/jest.config.ts"
30
- }
31
- },
32
- "lint": {
33
- "executor": "@nx/eslint:lint"
34
- }
35
- }
36
- }
@@ -1,30 +0,0 @@
1
- <div id="centerContent">
2
- <div id="middle" #middle>
3
- <div class="page pageTest active">
4
- <div id="result" tabindex="0">
5
- <div class="bottom" style="grid-column: 1/3">
6
- <div id="resultReplay">
7
- <div class="title">
8
- Watch replay
9
- <span
10
- id="playpauseReplayButton"
11
- class="textButton"
12
- aria-label="Start replay"
13
- data-balloon-pos="up"
14
- style="display: inline-block"
15
- (click)="playpauseReplayButtonClick()"
16
- #toggleButton
17
- >
18
- <div id="key" class="Play" #playpauseelem>{{ playpauseelem.className }}</div>
19
- </span>
20
- <p id="replayStopwatch" #replayStopwatch>0s</p>
21
- </div>
22
- <div id="wordsWrapper">
23
- <div id="replayWords" class="words"></div>
24
- </div>
25
- </div>
26
- </div>
27
- </div>
28
- </div>
29
- </div>
30
- </div>
@@ -1,250 +0,0 @@
1
- import { ComponentFixture, TestBed } from '@angular/core/testing';
2
- import { ElementRef } from '@angular/core';
3
- import { TgoTypingReplayInputComponent } from './tgo-typing-replay-input.component';
4
- import * as config from '../../helpers/config';
5
- import * as replay from '../../helpers/test/replay';
6
-
7
- jest.mock('../../helpers/config');
8
- jest.mock('../../helpers/test/replay');
9
-
10
- describe('TgoTypingReplayInputComponent', () => {
11
- let component: TgoTypingReplayInputComponent;
12
- let fixture: ComponentFixture<TgoTypingReplayInputComponent>;
13
-
14
- const mockReplayExport = JSON.stringify({
15
- wordsList: ['word1', 'word2', 'word3'],
16
- replayData: [
17
- { timestamp: 0, char: 'w' },
18
- { timestamp: 100, char: 'o' },
19
- ],
20
- });
21
-
22
- beforeEach(() => {
23
- jest.clearAllMocks();
24
-
25
- TestBed.configureTestingModule({
26
- imports: [TgoTypingReplayInputComponent],
27
- });
28
-
29
- fixture = TestBed.createComponent(TgoTypingReplayInputComponent);
30
- component = fixture.componentInstance;
31
- });
32
-
33
- describe('when initialized', () => {
34
- it('should create the component', () => {
35
- expect(component).toBeDefined();
36
- });
37
-
38
- it('should have default funbox value', () => {
39
- expect(component.funbox).toBe('none');
40
- });
41
- });
42
-
43
- describe('#ngOnInit', () => {
44
- beforeEach(() => {
45
- component.replayExport = mockReplayExport;
46
- });
47
-
48
- it('should parse the replayExport JSON string', () => {
49
- component.ngOnInit();
50
-
51
- expect(component.replayExportData).toEqual({
52
- wordsList: ['word1', 'word2', 'word3'],
53
- replayData: [
54
- { timestamp: 0, char: 'w' },
55
- { timestamp: 100, char: 'o' },
56
- ],
57
- });
58
- });
59
-
60
- it('should call setFunbox with the funbox input value', () => {
61
- component.funbox = 'custom-funbox';
62
-
63
- component.ngOnInit();
64
-
65
- expect(config.setFunbox).toHaveBeenCalledWith('custom-funbox');
66
- expect(config.setFunbox).toHaveBeenCalledTimes(1);
67
- });
68
-
69
- it('should call replayGetWordsList with parsed wordsList', () => {
70
- component.ngOnInit();
71
-
72
- expect(replay.replayGetWordsList).toHaveBeenCalledWith(['word1', 'word2', 'word3']);
73
- expect(replay.replayGetWordsList).toHaveBeenCalledTimes(1);
74
- });
75
-
76
- it('should call setReplayData with parsed replayData', () => {
77
- component.ngOnInit();
78
-
79
- expect(replay.setReplayData).toHaveBeenCalledWith([
80
- { timestamp: 0, char: 'w' },
81
- { timestamp: 100, char: 'o' },
82
- ]);
83
- expect(replay.setReplayData).toHaveBeenCalledTimes(1);
84
- });
85
-
86
- describe('when replayExport contains different data', () => {
87
- it('should handle empty wordsList and replayData', () => {
88
- component.replayExport = JSON.stringify({
89
- wordsList: [],
90
- replayData: [],
91
- });
92
-
93
- component.ngOnInit();
94
-
95
- expect(replay.replayGetWordsList).toHaveBeenCalledWith([]);
96
- expect(replay.setReplayData).toHaveBeenCalledWith([]);
97
- });
98
-
99
- it('should handle large wordsList', () => {
100
- const largeWordsList = Array.from({ length: 100 }, (_, i) => `word${i}`);
101
- component.replayExport = JSON.stringify({
102
- wordsList: largeWordsList,
103
- replayData: [],
104
- });
105
-
106
- component.ngOnInit();
107
-
108
- expect(replay.replayGetWordsList).toHaveBeenCalledWith(largeWordsList);
109
- });
110
- });
111
- });
112
-
113
- describe('#ngAfterViewInit', () => {
114
- let mockToggleButtonElement: HTMLElement;
115
- let mockReplayStopwatchElement: HTMLElement;
116
-
117
- beforeEach(() => {
118
- component.replayExport = mockReplayExport;
119
- component.ngOnInit();
120
-
121
- // Create mock elements
122
- mockToggleButtonElement = document.createElement('button');
123
- mockReplayStopwatchElement = document.createElement('div');
124
-
125
- // Mock ViewChild ElementRef
126
- component.toggleButton = {
127
- nativeElement: mockToggleButtonElement,
128
- } as ElementRef;
129
- component.replayStopwatch = {
130
- nativeElement: mockReplayStopwatchElement,
131
- } as ElementRef;
132
- });
133
-
134
- it('should call setToggleButton with toggleButton native element', () => {
135
- component.ngAfterViewInit();
136
-
137
- expect(replay.setToggleButton).toHaveBeenCalledWith(mockToggleButtonElement);
138
- expect(replay.setToggleButton).toHaveBeenCalledTimes(1);
139
- });
140
-
141
- it('should call setReplayStopwatch with replayStopwatch native element', () => {
142
- component.ngAfterViewInit();
143
-
144
- expect(replay.setReplayStopwatch).toHaveBeenCalledWith(mockReplayStopwatchElement);
145
- expect(replay.setReplayStopwatch).toHaveBeenCalledTimes(1);
146
- });
147
-
148
- it('should call initializeReplayPrompt', () => {
149
- component.ngAfterViewInit();
150
-
151
- expect(replay.initializeReplayPrompt).toHaveBeenCalledTimes(1);
152
- });
153
-
154
- it('should call loadOldReplay', () => {
155
- component.ngAfterViewInit();
156
-
157
- expect(replay.loadOldReplay).toHaveBeenCalledTimes(1);
158
- });
159
-
160
- it('should call playReplay', () => {
161
- component.ngAfterViewInit();
162
-
163
- expect(replay.playReplay).toHaveBeenCalledTimes(1);
164
- });
165
-
166
- it('should call replay initialization functions in correct order', () => {
167
- const callOrder: string[] = [];
168
-
169
- jest.mocked(replay.setToggleButton).mockImplementation(() => {
170
- callOrder.push('setToggleButton');
171
- });
172
- jest.mocked(replay.setReplayStopwatch).mockImplementation(() => {
173
- callOrder.push('setReplayStopwatch');
174
- });
175
- jest.mocked(replay.initializeReplayPrompt).mockImplementation(() => {
176
- callOrder.push('initializeReplayPrompt');
177
- });
178
- jest.mocked(replay.loadOldReplay).mockImplementation(() => {
179
- callOrder.push('loadOldReplay');
180
- return 0;
181
- });
182
- jest.mocked(replay.playReplay).mockImplementation(() => {
183
- callOrder.push('playReplay');
184
- });
185
-
186
- component.ngAfterViewInit();
187
-
188
- expect(callOrder).toEqual([
189
- 'setToggleButton',
190
- 'setReplayStopwatch',
191
- 'initializeReplayPrompt',
192
- 'loadOldReplay',
193
- 'playReplay',
194
- ]);
195
- });
196
- });
197
-
198
- describe('#playpauseReplayButtonClick', () => {
199
- it('should call the imported playpauseReplayButtonClick function', () => {
200
- component.playpauseReplayButtonClick();
201
-
202
- expect(replay.playpauseReplayButtonClick).toHaveBeenCalledTimes(1);
203
- });
204
-
205
- it('should call playpauseReplayButtonClick on multiple invocations', () => {
206
- component.playpauseReplayButtonClick();
207
- component.playpauseReplayButtonClick();
208
- component.playpauseReplayButtonClick();
209
-
210
- expect(replay.playpauseReplayButtonClick).toHaveBeenCalledTimes(3);
211
- });
212
- });
213
-
214
- describe('when component lifecycle is complete', () => {
215
- let mockToggleButtonElement: HTMLElement;
216
- let mockReplayStopwatchElement: HTMLElement;
217
-
218
- beforeEach(() => {
219
- component.replayExport = mockReplayExport;
220
- component.funbox = 'test-funbox';
221
-
222
- mockToggleButtonElement = document.createElement('button');
223
- mockReplayStopwatchElement = document.createElement('div');
224
-
225
- component.toggleButton = {
226
- nativeElement: mockToggleButtonElement,
227
- } as ElementRef;
228
- component.replayStopwatch = {
229
- nativeElement: mockReplayStopwatchElement,
230
- } as ElementRef;
231
- });
232
-
233
- it('should initialize and setup replay completely', () => {
234
- // Simulate full lifecycle
235
- component.ngOnInit();
236
- component.ngAfterViewInit();
237
-
238
- // Verify all initialization steps were called
239
- expect(config.setFunbox).toHaveBeenCalledWith('test-funbox');
240
- expect(replay.replayGetWordsList).toHaveBeenCalled();
241
- expect(replay.setReplayData).toHaveBeenCalled();
242
- expect(replay.setToggleButton).toHaveBeenCalledWith(mockToggleButtonElement);
243
- expect(replay.setReplayStopwatch).toHaveBeenCalledWith(mockReplayStopwatchElement);
244
- expect(replay.initializeReplayPrompt).toHaveBeenCalled();
245
- expect(replay.loadOldReplay).toHaveBeenCalled();
246
- expect(replay.playReplay).toHaveBeenCalled();
247
- });
248
- });
249
- });
250
-
@@ -1,47 +0,0 @@
1
- import { AfterViewInit, Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';
2
- import { setFunbox } from '../../helpers/config';
3
- import {
4
- initializeReplayPrompt,
5
- loadOldReplay,
6
- playpauseReplayButtonClick,
7
- playReplay,
8
- replayGetWordsList,
9
- setReplayData,
10
- setReplayStopwatch,
11
- setToggleButton,
12
- } from '../../helpers/test/replay';
13
- import { CommonModule } from '@angular/common';
14
-
15
- @Component({
16
- selector: 'tgo-typing-replay-input',
17
- imports: [CommonModule],
18
- templateUrl: './tgo-typing-replay-input.component.html',
19
- styleUrls: ['../../styles/index.scss']
20
- })
21
- export class TgoTypingReplayInputComponent implements OnInit, AfterViewInit {
22
- @Input() replayExport: any;
23
- @Input() funbox = 'none';
24
- replayExportData: any;
25
-
26
- @ViewChild('toggleButton') toggleButton!: ElementRef;
27
- @ViewChild('replayStopwatch') replayStopwatch!: ElementRef;
28
-
29
- ngOnInit(): void {
30
- this.replayExportData = JSON.parse(this.replayExport);
31
- setFunbox(this.funbox);
32
- replayGetWordsList(this.replayExportData['wordsList']);
33
- setReplayData(this.replayExportData['replayData']);
34
- }
35
-
36
- ngAfterViewInit() {
37
- setToggleButton(this.toggleButton.nativeElement);
38
- setReplayStopwatch(this.replayStopwatch.nativeElement);
39
- initializeReplayPrompt();
40
- loadOldReplay();
41
- playReplay();
42
- }
43
-
44
- playpauseReplayButtonClick() {
45
- playpauseReplayButtonClick();
46
- }
47
- }
@@ -1,72 +0,0 @@
1
- <div id="centerContent">
2
- <div id="middle" #middle>
3
- <div class="page pageTest active">
4
- <div id="typingTest">
5
- <div id="capsWarning" [ngClass]="{ hidden: (showCaps$ | async) === false }" #capsWarning>
6
- Caps Lock
7
- </div>
8
- <div id="memoryTimer">Time left to memorise all words: 0s</div>
9
- <div id="testModesNotice"></div>
10
- <input
11
- id="wordsInput"
12
- class=""
13
- tabindex="0"
14
- type="text"
15
- autocomplete="off"
16
- autocapitalize="off"
17
- autocorrect="off"
18
- data-gramm="false"
19
- data-gramm_editor="false"
20
- data-enable-grammarly="false"
21
- list="autocompleteOff"
22
- (keyup)="wordsInputKeyup($event)"
23
- (beforeinput)="wordsInputBeforeinput($event)"
24
- (input)="wordsInputInput($event)"
25
- (focus)="wordsInputFocus($event)"
26
- (focusout)="wordsInputFocusOut()"
27
- (copy)="wordsInputCopy($event)"
28
- (paste)="wordsInputPaste($event)"
29
- (compositionstart)="wordsInputCompositionstart()"
30
- (compositionend)="wordsInputCompositionend()"
31
- #wordsInput
32
- />
33
- @if (showMiniTimerAndLiveWpm) {
34
- <div id="miniTimerAndLiveWpm" class="timerMain size2">
35
- <div class="time" [@fadeIn]="(showTimer$ | async) ? 'show' : 'hide'">
36
- {{ timeLeft$ | async }}
37
- </div>
38
- <div class="wpm hidden">60</div>
39
- <div class="acc hidden">100%</div>
40
- <div class="burst hidden">1</div>
41
- </div>
42
- }
43
-
44
- @if (outOfFocusShow$ | async) {
45
- <div class="outOfFocusWarning">
46
- Click or press any key to focus
47
- </div>
48
- }
49
-
50
- @if (errorEvent | async; as errorMessage) {
51
- <div class="errorWarning">
52
- {{ errorMessage }} Reload the page or <a href="https://candidates.testgorilla.com/hc/en-us/requests/new" target="_blank">contact support</a>.
53
- </div>
54
- }
55
-
56
- <div id="wordsWrapper" translate="no" #wordsWrapper (click)="wordsWrapperClick()">
57
- <div id="paceCaret" class="default size2 hidden"></div>
58
- @if (showCaret$ | async) {
59
- <div id="caret" [@updatePositionCaret]="{
60
- value: state,
61
- params: { caretTopPos: caretTop, caretLeftPos: caretLeft }
62
- }"
63
- [ngStyle]="{ 'animation-name': (caretAnimation$ | async) }" class="default size2">
64
- </div>
65
- }
66
- <div id="words" class="size2" #words [ngClass]="{ blurred: (outOfFocusShow$ | async) }"></div>
67
- </div>
68
- </div>
69
- </div>
70
- </div>
71
- </div>
72
-