@testgorilla/tgo-coding-test 0.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 (163) hide show
  1. package/.eslintrc.json +45 -0
  2. package/README.md +257 -0
  3. package/jest.config.ts +21 -0
  4. package/ng-package.json +14 -0
  5. package/package.json +33 -0
  6. package/project.json +36 -0
  7. package/src/assets/i18n/en.json +124 -0
  8. package/src/index.ts +30 -0
  9. package/src/lib/components/.gitkeep +0 -0
  10. package/src/lib/components/code-editor/code-editor.component.html +10 -0
  11. package/src/lib/components/code-editor/code-editor.component.scss +21 -0
  12. package/src/lib/components/code-editor/code-editor.component.spec.ts +136 -0
  13. package/src/lib/components/code-editor/code-editor.component.ts +369 -0
  14. package/src/lib/components/code-editor/code-editor.mocks.ts +28 -0
  15. package/src/lib/components/code-editor/code-editor.service.spec.ts +160 -0
  16. package/src/lib/components/code-editor/code-editor.service.ts +94 -0
  17. package/src/lib/components/code-editor/helpers/c-helper.spec.ts +39 -0
  18. package/src/lib/components/code-editor/helpers/c-helper.ts +51 -0
  19. package/src/lib/components/code-editor/helpers/code-editor-helper.base.spec.ts +30 -0
  20. package/src/lib/components/code-editor/helpers/code-editor-helper.base.ts +16 -0
  21. package/src/lib/components/code-editor/helpers/code-editor-helper.mocks.ts +24 -0
  22. package/src/lib/components/code-editor/helpers/code-editor-helper.model.ts +67 -0
  23. package/src/lib/components/code-editor/helpers/cpp-helper.spec.ts +40 -0
  24. package/src/lib/components/code-editor/helpers/cpp-helper.ts +52 -0
  25. package/src/lib/components/code-editor/helpers/csharp-helper.spec.ts +42 -0
  26. package/src/lib/components/code-editor/helpers/csharp-helper.ts +55 -0
  27. package/src/lib/components/code-editor/helpers/go-helper.spec.ts +41 -0
  28. package/src/lib/components/code-editor/helpers/go-helper.ts +54 -0
  29. package/src/lib/components/code-editor/helpers/index.ts +15 -0
  30. package/src/lib/components/code-editor/helpers/java-helper.spec.ts +41 -0
  31. package/src/lib/components/code-editor/helpers/java-helper.ts +54 -0
  32. package/src/lib/components/code-editor/helpers/javascript-helper.spec.ts +39 -0
  33. package/src/lib/components/code-editor/helpers/javascript-helper.ts +32 -0
  34. package/src/lib/components/code-editor/helpers/kotlin-helper.spec.ts +41 -0
  35. package/src/lib/components/code-editor/helpers/kotlin-helper.ts +54 -0
  36. package/src/lib/components/code-editor/helpers/php-helper.spec.ts +39 -0
  37. package/src/lib/components/code-editor/helpers/php-helper.ts +32 -0
  38. package/src/lib/components/code-editor/helpers/python-helper.spec.ts +39 -0
  39. package/src/lib/components/code-editor/helpers/python-helper.ts +32 -0
  40. package/src/lib/components/code-editor/helpers/r-helper.spec.ts +39 -0
  41. package/src/lib/components/code-editor/helpers/r-helper.ts +32 -0
  42. package/src/lib/components/code-editor/helpers/ruby-helper.spec.ts +39 -0
  43. package/src/lib/components/code-editor/helpers/ruby-helper.ts +32 -0
  44. package/src/lib/components/code-editor/helpers/scala-helper.spec.ts +41 -0
  45. package/src/lib/components/code-editor/helpers/scala-helper.ts +53 -0
  46. package/src/lib/components/code-editor/helpers/sql-helper.spec.ts +87 -0
  47. package/src/lib/components/code-editor/helpers/sql-helper.ts +44 -0
  48. package/src/lib/components/code-editor/helpers/swift-helper.spec.ts +40 -0
  49. package/src/lib/components/code-editor/helpers/swift-helper.ts +51 -0
  50. package/src/lib/components/code-editor/helpers/typescript-helper.spec.ts +40 -0
  51. package/src/lib/components/code-editor/helpers/typescript-helper.ts +52 -0
  52. package/src/lib/components/code-editor/models/code-editor.model.ts +9 -0
  53. package/src/lib/components/code-editor/models/coding-snapshot.model.ts +4 -0
  54. package/src/lib/components/coding-question/coding-question.component.html +78 -0
  55. package/src/lib/components/coding-question/coding-question.component.scss +76 -0
  56. package/src/lib/components/coding-question/coding-question.component.spec.ts +85 -0
  57. package/src/lib/components/coding-question/coding-question.component.ts +102 -0
  58. package/src/lib/components/coding-section/coding-section.component.html +82 -0
  59. package/src/lib/components/coding-section/coding-section.component.scss +64 -0
  60. package/src/lib/components/coding-section/coding-section.component.spec.ts +257 -0
  61. package/src/lib/components/coding-section/coding-section.component.ts +187 -0
  62. package/src/lib/components/coding-test.module.ts +124 -0
  63. package/src/lib/components/common/truncated-text/truncated-text.component.html +6 -0
  64. package/src/lib/components/common/truncated-text/truncated-text.component.scss +18 -0
  65. package/src/lib/components/common/truncated-text/truncated-text.component.spec.ts +84 -0
  66. package/src/lib/components/common/truncated-text/truncated-text.component.ts +37 -0
  67. package/src/lib/components/configurations/configurations.component.html +57 -0
  68. package/src/lib/components/configurations/configurations.component.scss +42 -0
  69. package/src/lib/components/configurations/configurations.component.spec.ts +186 -0
  70. package/src/lib/components/configurations/configurations.component.ts +98 -0
  71. package/src/lib/components/instructions/instructions.component.html +41 -0
  72. package/src/lib/components/instructions/instructions.component.scss +167 -0
  73. package/src/lib/components/instructions/instructions.component.spec.ts +106 -0
  74. package/src/lib/components/instructions/instructions.component.ts +138 -0
  75. package/src/lib/components/panel/panel.component.html +19 -0
  76. package/src/lib/components/panel/panel.component.scss +41 -0
  77. package/src/lib/components/panel/panel.component.spec.ts +40 -0
  78. package/src/lib/components/panel/panel.component.ts +34 -0
  79. package/src/lib/components/runnable-editor/runnable-editor.component.html +75 -0
  80. package/src/lib/components/runnable-editor/runnable-editor.component.scss +55 -0
  81. package/src/lib/components/runnable-editor/runnable-editor.component.spec.ts +124 -0
  82. package/src/lib/components/runnable-editor/runnable-editor.component.ts +155 -0
  83. package/src/lib/components/tests/test-cases/test-cases.component.html +135 -0
  84. package/src/lib/components/tests/test-cases/test-cases.component.scss +220 -0
  85. package/src/lib/components/tests/test-cases/test-cases.component.spec.ts +401 -0
  86. package/src/lib/components/tests/test-cases/test-cases.component.ts +205 -0
  87. package/src/lib/components/tests/test-cases-content/test-cases-content.component.html +94 -0
  88. package/src/lib/components/tests/test-cases-content/test-cases-content.component.scss +103 -0
  89. package/src/lib/components/tests/test-cases-content/test-cases-content.component.spec.ts +122 -0
  90. package/src/lib/components/tests/test-cases-content/test-cases-content.component.ts +102 -0
  91. package/src/lib/components/tests/test-cases-status/test-cases-status.component.html +16 -0
  92. package/src/lib/components/tests/test-cases-status/test-cases-status.component.scss +49 -0
  93. package/src/lib/components/tests/test-cases-status/test-cases-status.component.spec.ts +22 -0
  94. package/src/lib/components/tests/test-cases-status/test-cases-status.component.ts +18 -0
  95. package/src/lib/components/tests/test-results.component.html +119 -0
  96. package/src/lib/components/tests/test-results.component.scss +189 -0
  97. package/src/lib/components/tests/test-results.component.spec.ts +140 -0
  98. package/src/lib/components/tests/test-results.component.ts +98 -0
  99. package/src/lib/components/tgo-coding-test/tgo-coding-test.component.html +96 -0
  100. package/src/lib/components/tgo-coding-test/tgo-coding-test.component.scss +6 -0
  101. package/src/lib/components/tgo-coding-test/tgo-coding-test.component.spec.ts +599 -0
  102. package/src/lib/components/tgo-coding-test/tgo-coding-test.component.ts +279 -0
  103. package/src/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.html +36 -0
  104. package/src/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.scss +183 -0
  105. package/src/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.spec.ts +883 -0
  106. package/src/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.ts +575 -0
  107. package/src/lib/config/index.ts +3 -0
  108. package/src/lib/config/tgo-coding-test.config.ts +26 -0
  109. package/src/lib/config/tgo-coding-test.provider.ts +38 -0
  110. package/src/lib/config/tgo-coding-test.token.ts +21 -0
  111. package/src/lib/models/.gitkeep +0 -0
  112. package/src/lib/models/auto-saved-data.ts +51 -0
  113. package/src/lib/models/code-event.ts +17 -0
  114. package/src/lib/models/coderunner-execution-results.ts +58 -0
  115. package/src/lib/models/coding-lib.mocks.ts +246 -0
  116. package/src/lib/models/configs.ts +18 -0
  117. package/src/lib/models/language-change-action.ts +4 -0
  118. package/src/lib/models/lat-languages.ts +12 -0
  119. package/src/lib/models/mixpanel-events.ts +3 -0
  120. package/src/lib/models/mode.ts +5 -0
  121. package/src/lib/models/paste-data.ts +4 -0
  122. package/src/lib/models/programming-language.ts +9 -0
  123. package/src/lib/models/test-cases.ts +74 -0
  124. package/src/lib/models/theme.ts +5 -0
  125. package/src/lib/models/translations.ts +1 -0
  126. package/src/lib/models/view-mode.ts +6 -0
  127. package/src/lib/pipes/memoize-func.pipe.ts +34 -0
  128. package/src/lib/services/.gitkeep +0 -0
  129. package/src/lib/services/candidate-coding-test-services/candidature-api.service.spec.ts +40 -0
  130. package/src/lib/services/candidate-coding-test-services/candidature-api.service.ts +15 -0
  131. package/src/lib/services/candidate-coding-test-services/coderunner-api.service.spec.ts +134 -0
  132. package/src/lib/services/candidate-coding-test-services/coderunner-api.service.ts +105 -0
  133. package/src/lib/services/candidate-coding-test-services/coding-test-tour.service.spec.ts +161 -0
  134. package/src/lib/services/candidate-coding-test-services/coding-test-tour.service.ts +100 -0
  135. package/src/lib/services/candidate-coding-test-services/coding-test.service.spec.ts +1524 -0
  136. package/src/lib/services/candidate-coding-test-services/coding-test.service.ts +843 -0
  137. package/src/lib/services/candidate-coding-test-services/index.ts +4 -0
  138. package/src/lib/services/coding-test-config.service.ts +48 -0
  139. package/src/lib/services/configurations.service.mocks.ts +77 -0
  140. package/src/lib/services/configurations.service.spec.ts +79 -0
  141. package/src/lib/services/configurations.service.ts +111 -0
  142. package/src/lib/services/index.ts +0 -0
  143. package/src/lib/services/lib-coding-test.service.spec.ts +265 -0
  144. package/src/lib/services/lib-coding-test.service.ts +157 -0
  145. package/src/lib/services/local-storage.service.mocks.ts +22 -0
  146. package/src/lib/services/storage.service.spec.ts +1120 -0
  147. package/src/lib/services/storage.service.ts +729 -0
  148. package/src/lib/services/test-cases.service.spec.ts +53 -0
  149. package/src/lib/services/test-cases.service.ts +29 -0
  150. package/src/lib/services/theme.service.spec.ts +76 -0
  151. package/src/lib/services/theme.service.ts +34 -0
  152. package/src/lib/styles/mixins.scss +86 -0
  153. package/src/lib/styles/styles.scss +112 -0
  154. package/src/lib/styles/variables.scss +105 -0
  155. package/src/lib/utils/.gitkeep +0 -0
  156. package/src/lib/utils/additional-languages/erlang.ts +115 -0
  157. package/src/lib/utils/resize-element.ts +15 -0
  158. package/src/lib/utils/time-to-ms.util.ts +10 -0
  159. package/src/test-setup.ts +1 -0
  160. package/tsconfig.json +16 -0
  161. package/tsconfig.lib.json +12 -0
  162. package/tsconfig.lib.prod.json +9 -0
  163. package/tsconfig.spec.json +13 -0
@@ -0,0 +1,87 @@
1
+ import { CodeEditorFuncOptions, CodeEditorSqlOperations } from './code-editor-helper.model';
2
+ import { CodeEditorSqlHelper } from './sql-helper';
3
+
4
+ describe('CodeEditorSqlHelper', () => {
5
+ let helper: CodeEditorSqlHelper;
6
+
7
+ const defaultParams: CodeEditorFuncOptions = { name: CodeEditorSqlOperations.Select };
8
+ const correctFuncOpening = 'SELECT\n';
9
+ const correctSelectInitCode = `${correctFuncOpening}## FROM ## WHERE ##;\n`;
10
+
11
+ beforeEach(() => {
12
+ helper = new CodeEditorSqlHelper(defaultParams);
13
+ });
14
+
15
+ describe('when getting init code', () => {
16
+ let result: string;
17
+
18
+ beforeEach(() => {
19
+ result = helper.getInitCode();
20
+ });
21
+
22
+ describe('and operation is SELECT', () => {
23
+ it('should return proper init code', () => {
24
+ expect(result).toEqual(correctSelectInitCode);
25
+ });
26
+ });
27
+
28
+ describe('and operation is UPDATE', () => {
29
+ it('should return proper init code', () => {
30
+ const correctInitCode = 'UPDATE\n## SET ## WHERE ##;\n';
31
+ helper = new CodeEditorSqlHelper({ name: CodeEditorSqlOperations.Update });
32
+ result = helper.getInitCode();
33
+ expect(result).toEqual(correctInitCode);
34
+ });
35
+ });
36
+
37
+ describe('and operation is INSERT', () => {
38
+ it('should return proper init code', () => {
39
+ const correctInitCode = 'INSERT\nINTO ## WHERE ##;\n';
40
+ helper = new CodeEditorSqlHelper({ name: CodeEditorSqlOperations.Insert });
41
+ result = helper.getInitCode();
42
+ expect(result).toEqual(correctInitCode);
43
+ });
44
+ });
45
+
46
+ describe('and operation is DELETE', () => {
47
+ it('should return proper init code', () => {
48
+ const correctInitCode = 'DELETE\n## FROM ## WHERE ##;\n';
49
+ helper = new CodeEditorSqlHelper({ name: CodeEditorSqlOperations.Delete });
50
+ result = helper.getInitCode();
51
+ expect(result).toEqual(correctInitCode);
52
+ });
53
+ });
54
+
55
+ describe('and operation is CREATE TABLE', () => {
56
+ it('should return proper init code', () => {
57
+ const correctInitCode = 'CREATE TABLE\n## VALUES ##;\n';
58
+ helper = new CodeEditorSqlHelper({ name: CodeEditorSqlOperations.CreateTable });
59
+ result = helper.getInitCode();
60
+ expect(result).toEqual(correctInitCode);
61
+ });
62
+ });
63
+
64
+ describe('and operation is unknown', () => {
65
+ it('should throw error', () => {
66
+ helper = new CodeEditorSqlHelper({ name: 'anything' });
67
+ try {
68
+ result = helper.getInitCode();
69
+ } catch (e) {
70
+ expect(e.message).toEqual('wrong sql operation');
71
+ }
72
+ });
73
+ });
74
+ });
75
+
76
+ describe('when getting func opening', () => {
77
+ let result: string;
78
+
79
+ beforeEach(() => {
80
+ result = helper.getFunctionOpening();
81
+ });
82
+
83
+ it('should return proper func opening', () => {
84
+ expect(result).toEqual(correctFuncOpening);
85
+ });
86
+ });
87
+ });
@@ -0,0 +1,44 @@
1
+ import { CodeEditorHelperBase } from './code-editor-helper.base';
2
+ import {
3
+ CodeEditorFuncOptions,
4
+ CodeEditorHelper,
5
+ CodeEditorLanguages,
6
+ CodeEditorSqlOperations,
7
+ } from './code-editor-helper.model';
8
+
9
+ export class CodeEditorSqlHelper extends CodeEditorHelperBase implements CodeEditorHelper {
10
+ language = CodeEditorLanguages.Sql;
11
+
12
+ constructor(private functionOptions: CodeEditorFuncOptions) {
13
+ super();
14
+ }
15
+
16
+ getInitCode(): string {
17
+ return `${this.getFunctionOpening()}${this.getOperationCode()}`;
18
+ }
19
+
20
+ getFunctionOpening(): string {
21
+ const { name: funcName } = this.functionOptions;
22
+
23
+ return `${funcName || ''}\n`;
24
+ }
25
+
26
+ private getOperationCode(): string {
27
+ const { name: funcName } = this.functionOptions;
28
+
29
+ switch (funcName) {
30
+ case CodeEditorSqlOperations.Select:
31
+ return '## FROM ## WHERE ##;\n';
32
+ case CodeEditorSqlOperations.Update:
33
+ return '## SET ## WHERE ##;\n';
34
+ case CodeEditorSqlOperations.Insert:
35
+ return 'INTO ## WHERE ##;\n';
36
+ case CodeEditorSqlOperations.Delete:
37
+ return '## FROM ## WHERE ##;\n';
38
+ case CodeEditorSqlOperations.CreateTable:
39
+ return '## VALUES ##;\n';
40
+ default:
41
+ return '';
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,40 @@
1
+ import { defaultFuncParams } from './code-editor-helper.mocks';
2
+ import { CodeEditorSwiftHelper } from './swift-helper';
3
+
4
+ describe('CodeEditorSwiftHelper', () => {
5
+ let helper: CodeEditorSwiftHelper;
6
+
7
+ const defaultParams = { ...defaultFuncParams };
8
+ const paramsList =
9
+ '_ param1: Bool, _ param2: Int, _ param3: Double, _ param4: Float, _ param5: String, _ param6: [Bool], _ param7: [Int], _ param8: [Float]';
10
+ const correctFuncOpening = `func mockFunction(${paramsList}) -> Bool {\n`;
11
+ const correctInitCode = `${correctFuncOpening}\t //Insert your code here \n}`;
12
+
13
+ beforeEach(() => {
14
+ helper = new CodeEditorSwiftHelper(defaultParams);
15
+ });
16
+
17
+ describe('when getting init code', () => {
18
+ let result: string;
19
+
20
+ beforeEach(() => {
21
+ result = helper.getInitCode();
22
+ });
23
+
24
+ it('should return proper init code', () => {
25
+ expect(result).toEqual(correctInitCode);
26
+ });
27
+ });
28
+
29
+ describe('when getting func opening', () => {
30
+ let result: string;
31
+
32
+ beforeEach(() => {
33
+ result = helper.getFunctionOpening();
34
+ });
35
+
36
+ it('should return proper func opening', () => {
37
+ expect(result).toEqual(correctFuncOpening);
38
+ });
39
+ });
40
+ });
@@ -0,0 +1,51 @@
1
+ import { CodeEditorHelperBase } from './code-editor-helper.base';
2
+ import {
3
+ CodeEditorFuncOptions,
4
+ CodeEditorHelper,
5
+ CodeEditorLanguages,
6
+ CodeEditorTypesMap,
7
+ } from './code-editor-helper.model';
8
+
9
+ export class CodeEditorSwiftHelper extends CodeEditorHelperBase implements CodeEditorHelper {
10
+ language = CodeEditorLanguages.Swift;
11
+ typesMap: CodeEditorTypesMap = {
12
+ boolean: 'Bool',
13
+ int: 'Int',
14
+ double: 'Double',
15
+ float: 'Float',
16
+ str: 'String',
17
+ array_boolean: '[Bool]',
18
+ array_int: '[Int]',
19
+ array_float: '[Float]',
20
+ array_double: '[Double]',
21
+ array_str: '[String]',
22
+ };
23
+
24
+ constructor(private functionOptions: CodeEditorFuncOptions) {
25
+ super();
26
+ }
27
+
28
+ getInitCode(): string {
29
+ return `${this.getFunctionOpening()}\t //Insert your code here \n}`;
30
+ }
31
+
32
+ getFunctionOpening(): string {
33
+ const { name: funcName, returnType } = this.functionOptions;
34
+ const params = this.getParamsString();
35
+ const showingReturnType = this.parseType(returnType);
36
+
37
+ return `func ${funcName}(${params}) -> ${showingReturnType} {\n`;
38
+ }
39
+
40
+ private getParamsString(): string {
41
+ const { params } = this.functionOptions;
42
+ let paramsString = '';
43
+
44
+ if (params && params.length > 0) {
45
+ params.forEach(values => (paramsString += `_ ${values.name}: ${this.parseType(values.type)}, `));
46
+ paramsString = paramsString.slice(0, -2);
47
+ }
48
+
49
+ return paramsString;
50
+ }
51
+ }
@@ -0,0 +1,40 @@
1
+ import { defaultFuncParams } from './code-editor-helper.mocks';
2
+ import { CodeEditorTypescriptHelper } from './typescript-helper';
3
+
4
+ describe('CodeEditorTypescriptHelper', () => {
5
+ let helper: CodeEditorTypescriptHelper;
6
+
7
+ const defaultParams = { ...defaultFuncParams };
8
+ const paramsList =
9
+ 'param1: boolean, param2: number, param3: number, param4: number, param5: string, param6: Array<boolean>, param7: Array<number>, param8: Array<number>';
10
+ const correctFuncOpening = `export default function mockFunction(${paramsList}): boolean {\n`;
11
+ const correctInitCode = `${correctFuncOpening}\t //Insert your code here \n}`;
12
+
13
+ beforeEach(() => {
14
+ helper = new CodeEditorTypescriptHelper(defaultParams);
15
+ });
16
+
17
+ describe('when getting init code', () => {
18
+ let result: string;
19
+
20
+ beforeEach(() => {
21
+ result = helper.getInitCode();
22
+ });
23
+
24
+ it('should return proper init code', () => {
25
+ expect(result).toEqual(correctInitCode);
26
+ });
27
+ });
28
+
29
+ describe('when getting func opening', () => {
30
+ let result: string;
31
+
32
+ beforeEach(() => {
33
+ result = helper.getFunctionOpening();
34
+ });
35
+
36
+ it('should return proper func opening', () => {
37
+ expect(result).toEqual(correctFuncOpening);
38
+ });
39
+ });
40
+ });
@@ -0,0 +1,52 @@
1
+ import { CodeEditorHelperBase } from './code-editor-helper.base';
2
+ import {
3
+ CodeEditorFuncOptions,
4
+ CodeEditorHelper,
5
+ CodeEditorLanguages,
6
+ CodeEditorTypesMap,
7
+ } from './code-editor-helper.model';
8
+
9
+ export class CodeEditorTypescriptHelper extends CodeEditorHelperBase implements CodeEditorHelper {
10
+ language = CodeEditorLanguages.Typescript;
11
+ typesMap: CodeEditorTypesMap = {
12
+ boolean: 'boolean',
13
+ int: 'number',
14
+ number: 'number',
15
+ double: 'number',
16
+ float: 'number',
17
+ str: 'string',
18
+ array_boolean: 'Array<boolean>',
19
+ array_int: 'Array<number>',
20
+ array_float: 'Array<number>',
21
+ array_double: 'Array<number>',
22
+ array_str: 'Array<string>',
23
+ };
24
+
25
+ constructor(private functionOptions: CodeEditorFuncOptions) {
26
+ super();
27
+ }
28
+
29
+ getInitCode(): string {
30
+ return `${this.getFunctionOpening()}\t //Insert your code here \n}`;
31
+ }
32
+
33
+ getFunctionOpening(): string {
34
+ const { name: funcName, returnType } = this.functionOptions;
35
+ const params = this.getParamsString();
36
+ const showingReturnType = this.parseType(returnType);
37
+
38
+ return `export default function ${funcName}(${params}): ${showingReturnType} {\n`;
39
+ }
40
+
41
+ private getParamsString(): string {
42
+ const { params } = this.functionOptions;
43
+ let paramsString = '';
44
+
45
+ if (params && params.length > 0) {
46
+ params.forEach(values => (paramsString += `${values.name}: ${this.parseType(values.type)}, `));
47
+ paramsString = paramsString.slice(0, -2);
48
+ }
49
+
50
+ return paramsString;
51
+ }
52
+ }
@@ -0,0 +1,9 @@
1
+ export interface PasteData {
2
+ type: string;
3
+ data: string;
4
+ }
5
+
6
+ export const enum MonacoColorTheme {
7
+ Light = 'vs',
8
+ Dark = 'vs-dark',
9
+ }
@@ -0,0 +1,4 @@
1
+ export interface CodingSnapshot {
2
+ text: string;
3
+ copied_text?: string;
4
+ }
@@ -0,0 +1,78 @@
1
+ <div
2
+ *ngIf="!isMobile; else mobileTpl"
3
+ class="main-container"
4
+ [ngClass]="{ 'main-container-fullscreen': isFullscreenMode }"
5
+ >
6
+ <mat-card appearance="outlined" class="main-card">
7
+ <as-split class="as-split" direction="horizontal" [useTransition]="true" [gutterSize]="GUTTER_SIZE">
8
+ <as-split-area size="38" minSize="24">
9
+ <ng-container [ngTemplateOutlet]="instructions"></ng-container>
10
+ </as-split-area>
11
+ <as-split-area size="62" minSize="30">
12
+ <ng-container [ngTemplateOutlet]="runnableIde"></ng-container>
13
+ </as-split-area>
14
+ </as-split>
15
+
16
+ <ui-button
17
+ *ngIf="!isFullscreenMode"
18
+ class="fullscreen-btn themed-button"
19
+ [variant]="'secondary'"
20
+ [iconName]="'Full-screen'"
21
+ [justIcon]="true"
22
+ [size]="'big'"
23
+ [applicationTheme]="applicationTheme"
24
+ [tooltip]="translations['TOOLTIPS']['MAXIMISE']"
25
+ [tooltipPosition]="'left'"
26
+ (buttonClickEvent)="enableFullScreenMode()"
27
+ >
28
+ </ui-button>
29
+ </mat-card>
30
+ </div>
31
+
32
+ <ng-template #mobileTpl>
33
+ <div class="main-container main-container-mobile">
34
+ <mat-card appearance="outlined" class="main-card main-card-mobile">
35
+ <ng-container [ngTemplateOutlet]="instructions"></ng-container>
36
+ <ng-container [ngTemplateOutlet]="runnableIde"></ng-container>
37
+ </mat-card>
38
+ </div>
39
+ </ng-template>
40
+
41
+ <ng-template #instructions>
42
+ <tgo-code-instructions
43
+ [mode]="mode"
44
+ [isLAT]="isLAT"
45
+ [questionText]="questionText"
46
+ [translations]="translations"
47
+ [isDarkTheme]="isDarkTheme$ | async"
48
+ ></tgo-code-instructions>
49
+ </ng-template>
50
+ <ng-template #runnableIde>
51
+ <tgo-runnable-editor
52
+ [initCode]="initCode"
53
+ [functionParams]="functionParams"
54
+ [functionName]="functionName"
55
+ [returnType]="returnType"
56
+ [isFullViewMode]="true"
57
+ [shouldGenerateInitCode]="false"
58
+ [isLAT]="isLAT"
59
+ [isSQL]="isSQL"
60
+ [canAddCustomTestCases]="canAddCustomTestCases"
61
+ [languages]="languages"
62
+ [autoHeight]="autoHeight"
63
+ [translations]="translations"
64
+ [questionText]="questionText"
65
+ [companyColor]="companyColor"
66
+ [testCasesStatus]="testCasesStatus"
67
+ [loading]="loading"
68
+ [runTestResponse]="runTestResponse"
69
+ [exampleTestCases]="exampleTestCases"
70
+ [hideTestCases]="hideTestCases"
71
+ [applicationTheme]="applicationTheme"
72
+ (pasteEvent)="pasteEvent.emit($event)"
73
+ (codeChange)="codeChange.emit($event)"
74
+ (runTestClick)="runTestClick.emit($event)"
75
+ (languageChange)="languageChange.emit($event)"
76
+ >
77
+ </tgo-runnable-editor>
78
+ </ng-template>
@@ -0,0 +1,76 @@
1
+ @import "../../styles/mixins";
2
+
3
+ @include as-split-styles();
4
+
5
+ :host {
6
+ display: block;
7
+ height: 100%;
8
+ }
9
+
10
+ .main-container {
11
+ $base: &;
12
+ height: 100%;
13
+ padding: 32px 50px 40px 50px;
14
+ display: flex;
15
+ justify-content: center;
16
+
17
+ &#{$base}-fullscreen {
18
+ padding: 0;
19
+
20
+ .main-card {
21
+ max-height: calc(100vh - 80px);
22
+ max-width: 100vw;
23
+ }
24
+ }
25
+
26
+ &-mobile {
27
+ padding: 20px 16px 0;
28
+ }
29
+
30
+ .main-card {
31
+ flex: 1 0 100%;
32
+ height: 100%;
33
+ max-height: 750px;
34
+ max-width: 1280px;
35
+ padding: 0!important;
36
+ box-shadow: 0 8px 24px 4px rgba(0, 0, 0, 0.08);
37
+ background-color: var(--bg-mat-card) !important;
38
+
39
+ &-mobile {
40
+ display: flex;
41
+ flex-direction: column;
42
+ max-width: 100%;
43
+ max-height: 100%;
44
+ }
45
+ }
46
+ }
47
+
48
+ .fullscreen-btn {
49
+ position: absolute;
50
+ top: 0;
51
+ right: -50px;
52
+
53
+ &.themed-button {
54
+ ::ng-deep {
55
+ .mat-mdc-unelevated-button.secondary {
56
+ background-color: var(--button-bg-color);
57
+ }
58
+ }
59
+ }
60
+
61
+ @media screen and (min-width: 1400px) {
62
+ right: -72px;
63
+ }
64
+
65
+ .fullscreen-icon {
66
+ width: 18px;
67
+ height: 18px;
68
+ min-width: auto;
69
+ min-height: auto;
70
+ font-size: 18px;
71
+
72
+ ::ng-deep svg {
73
+ fill: var(--icon-bg-color);
74
+ }
75
+ }
76
+ }
@@ -0,0 +1,85 @@
1
+ import { ChangeDetectorRef, NO_ERRORS_SCHEMA } from '@angular/core';
2
+ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
3
+
4
+ import { MockModule, MockProvider } from 'ng-mocks';
5
+ import { Subject } from 'rxjs';
6
+ import { Themes } from '../../models/theme';
7
+ import { ConfigurationsService } from '../../services/configurations.service';
8
+ import { LibCodingTestService } from '../../services/lib-coding-test.service';
9
+ import { CodingQuestionComponent } from './coding-question.component';
10
+ import { CONFIGURATIONS_SERVICE_MOCK } from '../../services/configurations.service.mocks';
11
+ import { AngularSplitModule } from 'angular-split';
12
+ import { MatCardModule } from '@angular/material/card';
13
+ import { ButtonComponentModule } from '@testgorilla/tgo-ui';
14
+
15
+ describe('CodingQuestionComponent', () => {
16
+ let component: CodingQuestionComponent;
17
+ let fixture: ComponentFixture<CodingQuestionComponent>;
18
+ let configurationsService: ConfigurationsService;
19
+
20
+ beforeEach(waitForAsync(() => {
21
+ TestBed.configureTestingModule({
22
+ imports: [
23
+ CodingQuestionComponent,
24
+ MockModule(AngularSplitModule),
25
+ MockModule(MatCardModule),
26
+ MockModule(ButtonComponentModule),
27
+ ],
28
+ schemas: [NO_ERRORS_SCHEMA],
29
+ providers: [
30
+ MockProvider(ChangeDetectorRef),
31
+ MockProvider(LibCodingTestService, {
32
+ isFullscreen$: new Subject(),
33
+ setFullscreen(val) {
34
+ this.isFullscreen$.next(val);
35
+ },
36
+ }),
37
+ MockProvider(ConfigurationsService, CONFIGURATIONS_SERVICE_MOCK),
38
+ ],
39
+ })
40
+ .overrideComponent(CodingQuestionComponent, {
41
+ set: {
42
+ template: '',
43
+ },
44
+ })
45
+ .compileComponents();
46
+ }));
47
+
48
+ beforeEach(() => {
49
+ fixture = TestBed.createComponent(CodingQuestionComponent);
50
+ configurationsService = TestBed.inject(ConfigurationsService);
51
+ component = fixture.componentInstance;
52
+ component.translations = { TOOLTIPS: {} };
53
+
54
+ fixture.detectChanges();
55
+ });
56
+
57
+ describe('when the fullscreen mode is enabled', () => {
58
+ beforeEach(() => {
59
+ component.enableFullScreenMode();
60
+ });
61
+
62
+ it('should turn on fullscreen mode', () => {
63
+ expect(component.isFullscreenMode).toBeTruthy();
64
+ });
65
+ });
66
+
67
+ describe('when the component is destroyed', () => {
68
+ let setCodeComponentDestroyedSpy: jest.SpyInstance;
69
+ let setColorThemeSpy: jest.SpyInstance;
70
+ let closeConfigPanelSpy: jest.SpyInstance;
71
+
72
+ beforeEach(() => {
73
+ setCodeComponentDestroyedSpy = jest.spyOn(configurationsService, 'setCodeComponentDestroyed');
74
+ setColorThemeSpy = jest.spyOn(configurationsService, 'setColorTheme');
75
+ closeConfigPanelSpy = jest.spyOn(configurationsService, 'closeConfigPanel');
76
+ component.ngOnDestroy();
77
+ });
78
+
79
+ it('should call configurationsService methods', () => {
80
+ expect(setCodeComponentDestroyedSpy).toHaveBeenCalledWith(true);
81
+ expect(setColorThemeSpy).toHaveBeenCalledWith(Themes.Default);
82
+ expect(closeConfigPanelSpy).toHaveBeenCalled();
83
+ });
84
+ });
85
+ });
@@ -0,0 +1,102 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ ChangeDetectorRef,
4
+ Component,
5
+ EventEmitter,
6
+ inject,
7
+ Input,
8
+ OnDestroy,
9
+ OnInit,
10
+ Output,
11
+ } from '@angular/core';
12
+ import { CommonModule } from '@angular/common';
13
+ import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
14
+ import { map } from 'rxjs';
15
+ import { MatCardModule } from '@angular/material/card';
16
+ import { AngularSplitModule } from 'angular-split';
17
+ import { ApplicationTheme, ButtonComponentModule } from '@testgorilla/tgo-ui';
18
+ import { LATLanguages } from '../../models/lat-languages';
19
+ import { Modes } from '../../models/mode';
20
+ import { ExampleTestCase } from '../../models/test-cases';
21
+ import { Themes } from '../../models/theme';
22
+ import { ConfigurationsService } from '../../services/configurations.service';
23
+ import { LibCodingTestService } from '../../services/lib-coding-test.service';
24
+ import {
25
+ CodeEditorFuncParam,
26
+ CodeEditorLanguages,
27
+ CodeEditorTypesMap,
28
+ } from '../code-editor/helpers/code-editor-helper.model';
29
+ import { PasteData } from '../code-editor/models/code-editor.model';
30
+ import { InstructionsComponent } from '../instructions/instructions.component';
31
+ import { RunnableEditorComponent } from '../runnable-editor/runnable-editor.component';
32
+
33
+ @UntilDestroy()
34
+ @Component({
35
+ standalone: true,
36
+ selector: 'tgo-coding-question',
37
+ templateUrl: './coding-question.component.html',
38
+ styleUrls: ['./coding-question.component.scss'],
39
+ changeDetection: ChangeDetectionStrategy.OnPush,
40
+ imports: [
41
+ CommonModule,
42
+ MatCardModule,
43
+ AngularSplitModule,
44
+ ButtonComponentModule,
45
+ InstructionsComponent,
46
+ RunnableEditorComponent,
47
+ ],
48
+ })
49
+ export class CodingQuestionComponent implements OnInit, OnDestroy {
50
+ private readonly changeDetectorRef = inject(ChangeDetectorRef);
51
+ private readonly libCodingTestService = inject(LibCodingTestService);
52
+ private readonly configurationsService = inject(ConfigurationsService);
53
+
54
+ @Input() initCode: string;
55
+ @Input() functionParams: CodeEditorFuncParam[];
56
+ @Input() functionName: string;
57
+ @Input() returnType: keyof CodeEditorTypesMap;
58
+ @Input() isLAT: boolean;
59
+ @Input() isSQL: boolean;
60
+ @Input() canAddCustomTestCases: boolean;
61
+ @Input() languages: LATLanguages;
62
+ @Input() autoHeight: boolean;
63
+ @Input() translations: Record<string, unknown>;
64
+ @Input() questionText: string;
65
+ @Input() mode: Modes;
66
+ @Input() companyColor: string;
67
+ @Input() testCasesStatus: any;
68
+ @Input() loading: boolean;
69
+ @Input() hideTestCases: boolean;
70
+ @Input() runTestResponse = [];
71
+ @Input() exampleTestCases: ExampleTestCase[];
72
+ @Input() applicationTheme: ApplicationTheme;
73
+
74
+ @Output() pasteEvent = new EventEmitter<PasteData>();
75
+ @Output() codeChange = new EventEmitter<string>();
76
+ @Output() runTestClick = new EventEmitter<boolean>();
77
+ @Output() languageChange = new EventEmitter<CodeEditorLanguages>();
78
+
79
+ isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
80
+
81
+ isFullscreenMode: boolean;
82
+
83
+ GUTTER_SIZE = 1;
84
+
85
+ isDarkTheme$ = this.configurationsService.colorTheme$.pipe(map(theme => theme === Themes.Dark));
86
+
87
+ ngOnInit(): void {
88
+ this.libCodingTestService.isFullscreen$.pipe(untilDestroyed(this)).subscribe(isFullscreen => {
89
+ this.isFullscreenMode = isFullscreen;
90
+ });
91
+ }
92
+
93
+ ngOnDestroy(): void {
94
+ this.configurationsService.setCodeComponentDestroyed(true);
95
+ this.configurationsService.setColorTheme(Themes.Default);
96
+ this.configurationsService.closeConfigPanel();
97
+ }
98
+
99
+ enableFullScreenMode(): void {
100
+ this.libCodingTestService.setFullscreen(true);
101
+ }
102
+ }