@testgorilla/tgo-coding-test 1.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.
- package/fesm2022/testgorilla-tgo-coding-test.mjs +94 -94
- package/fesm2022/testgorilla-tgo-coding-test.mjs.map +1 -1
- package/lib/components/configurations/configurations.component.d.ts +1 -1
- package/package.json +15 -17
- package/esm2022/index.mjs +0 -12
- package/esm2022/lib/components/code-editor/code-editor.component.mjs +0 -335
- package/esm2022/lib/components/code-editor/code-editor.service.mjs +0 -72
- package/esm2022/lib/components/code-editor/helpers/c-helper.mjs +0 -40
- package/esm2022/lib/components/code-editor/helpers/code-editor-helper.base.mjs +0 -11
- package/esm2022/lib/components/code-editor/helpers/code-editor-helper.model.mjs +0 -2
- package/esm2022/lib/components/code-editor/helpers/cpp-helper.mjs +0 -41
- package/esm2022/lib/components/code-editor/helpers/csharp-helper.mjs +0 -42
- package/esm2022/lib/components/code-editor/helpers/go-helper.mjs +0 -42
- package/esm2022/lib/components/code-editor/helpers/index.mjs +0 -16
- package/esm2022/lib/components/code-editor/helpers/java-helper.mjs +0 -42
- package/esm2022/lib/components/code-editor/helpers/javascript-helper.mjs +0 -26
- package/esm2022/lib/components/code-editor/helpers/kotlin-helper.mjs +0 -42
- package/esm2022/lib/components/code-editor/helpers/php-helper.mjs +0 -26
- package/esm2022/lib/components/code-editor/helpers/python-helper.mjs +0 -26
- package/esm2022/lib/components/code-editor/helpers/r-helper.mjs +0 -26
- package/esm2022/lib/components/code-editor/helpers/ruby-helper.mjs +0 -26
- package/esm2022/lib/components/code-editor/helpers/scala-helper.mjs +0 -41
- package/esm2022/lib/components/code-editor/helpers/sql-helper.mjs +0 -34
- package/esm2022/lib/components/code-editor/helpers/swift-helper.mjs +0 -40
- package/esm2022/lib/components/code-editor/helpers/typescript-helper.mjs +0 -41
- package/esm2022/lib/components/code-editor/models/code-editor.model.mjs +0 -2
- package/esm2022/lib/components/code-editor/models/coding-snapshot.model.mjs +0 -2
- package/esm2022/lib/components/coding-question/coding-question.component.mjs +0 -126
- package/esm2022/lib/components/coding-section/coding-section.component.mjs +0 -188
- package/esm2022/lib/components/common/truncated-text/truncated-text.component.mjs +0 -38
- package/esm2022/lib/components/configurations/configurations.component.mjs +0 -97
- package/esm2022/lib/components/instructions/instructions.component.mjs +0 -139
- package/esm2022/lib/components/panel/panel.component.mjs +0 -34
- package/esm2022/lib/components/runnable-editor/runnable-editor.component.mjs +0 -169
- package/esm2022/lib/components/tests/test-cases/test-cases.component.mjs +0 -198
- package/esm2022/lib/components/tests/test-cases-content/test-cases-content.component.mjs +0 -96
- package/esm2022/lib/components/tests/test-cases-status/test-cases-status.component.mjs +0 -21
- package/esm2022/lib/components/tests/test-results.component.mjs +0 -127
- package/esm2022/lib/components/tgo-coding-test/tgo-coding-test.component.mjs +0 -280
- package/esm2022/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.mjs +0 -476
- package/esm2022/lib/config/index.mjs +0 -2
- package/esm2022/lib/config/tgo-coding-test.config.mjs +0 -2
- package/esm2022/lib/config/tgo-coding-test.provider.mjs +0 -34
- package/esm2022/lib/config/tgo-coding-test.token.mjs +0 -14
- package/esm2022/lib/models/auto-saved-data.mjs +0 -2
- package/esm2022/lib/models/code-event.mjs +0 -2
- package/esm2022/lib/models/coderunner-execution-results.mjs +0 -2
- package/esm2022/lib/models/configs.mjs +0 -2
- package/esm2022/lib/models/language-change-action.mjs +0 -2
- package/esm2022/lib/models/lat-languages.mjs +0 -3
- package/esm2022/lib/models/mixpanel-events.mjs +0 -2
- package/esm2022/lib/models/mode.mjs +0 -2
- package/esm2022/lib/models/paste-data.mjs +0 -2
- package/esm2022/lib/models/programming-language.mjs +0 -2
- package/esm2022/lib/models/test-cases.mjs +0 -7
- package/esm2022/lib/models/theme.mjs +0 -2
- package/esm2022/lib/models/translations.mjs +0 -2
- package/esm2022/lib/models/view-mode.mjs +0 -8
- package/esm2022/lib/pipes/memoize-func.pipe.mjs +0 -39
- package/esm2022/lib/services/candidate-coding-test-services/candidature-api.service.mjs +0 -19
- package/esm2022/lib/services/candidate-coding-test-services/coderunner-api.service.mjs +0 -58
- package/esm2022/lib/services/candidate-coding-test-services/coding-test-tour.service.mjs +0 -89
- package/esm2022/lib/services/candidate-coding-test-services/coding-test.service.mjs +0 -490
- package/esm2022/lib/services/candidate-coding-test-services/index.mjs +0 -5
- package/esm2022/lib/services/coding-test-config.service.mjs +0 -51
- package/esm2022/lib/services/configurations.service.mjs +0 -89
- package/esm2022/lib/services/lib-coding-test.service.mjs +0 -106
- package/esm2022/lib/services/storage.service.mjs +0 -624
- package/esm2022/lib/services/test-cases.service.mjs +0 -30
- package/esm2022/lib/services/theme.service.mjs +0 -36
- package/esm2022/lib/utils/additional-languages/erlang.mjs +0 -103
- package/esm2022/lib/utils/resize-element.mjs +0 -13
- package/esm2022/lib/utils/time-to-ms.util.mjs +0 -11
- package/esm2022/shared/index.mjs +0 -5
- package/esm2022/shared/lib/components/audio-animation/audio-animation.component.mjs +0 -114
- package/esm2022/shared/lib/components/audio-animation/index.mjs +0 -2
- package/esm2022/shared/lib/components/index.mjs +0 -3
- package/esm2022/shared/lib/components/vimeo-video/index.mjs +0 -2
- package/esm2022/shared/lib/components/vimeo-video/vimeo-video.component.mjs +0 -101
- package/esm2022/shared/lib/models/answer.mjs +0 -2
- package/esm2022/shared/lib/models/assessment.mjs +0 -2
- package/esm2022/shared/lib/models/environment.mjs +0 -2
- package/esm2022/shared/lib/models/index.mjs +0 -9
- package/esm2022/shared/lib/models/question-component.mjs +0 -2
- package/esm2022/shared/lib/models/question.mjs +0 -2
- package/esm2022/shared/lib/models/test.mjs +0 -2
- package/esm2022/shared/lib/models/translations.mjs +0 -2
- package/esm2022/shared/lib/models/window.mjs +0 -2
- package/esm2022/shared/lib/services/api/api.service.mjs +0 -97
- package/esm2022/shared/lib/services/api/mocked-api.service.mjs +0 -131
- package/esm2022/shared/lib/services/environment/environment.service.mjs +0 -13
- package/esm2022/shared/lib/services/index.mjs +0 -10
- package/esm2022/shared/lib/services/localization/languages.model.mjs +0 -19
- package/esm2022/shared/lib/services/localization/transloco-lazy-module-utils.mjs +0 -27
- package/esm2022/shared/lib/services/localization/transloco-testing.module.mjs +0 -11
- package/esm2022/shared/lib/services/media/media.service.mjs +0 -129
- package/esm2022/shared/lib/services/mixpanel/mixpanel.service.mjs +0 -30
- package/esm2022/shared/lib/services/theme/theme.service.mjs +0 -24
- package/esm2022/shared/test-mocks/assessment-test.mock.mjs +0 -112
- package/esm2022/shared/test-mocks/index.mjs +0 -3
- package/esm2022/shared/test-mocks/tgo-ui.mock.mjs +0 -39
- package/esm2022/testgorilla-tgo-coding-test.mjs +0 -5
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import { __decorate, __metadata } from "tslib";
|
|
2
|
-
import { animate, style, transition, trigger } from '@angular/animations';
|
|
3
|
-
import { CommonModule } from '@angular/common';
|
|
4
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
5
|
-
import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';
|
|
6
|
-
import { debounceTime, distinctUntilChanged, map, of } from 'rxjs';
|
|
7
|
-
import { ButtonComponentModule, ProgressBarComponentModule } from '@testgorilla/tgo-ui';
|
|
8
|
-
import { LibCodingTestService } from '../../services/lib-coding-test.service';
|
|
9
|
-
import { MemoizeFuncPipe } from '../../pipes/memoize-func.pipe';
|
|
10
|
-
import { TestCasesComponent } from './test-cases/test-cases.component';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
import * as i1 from "../../services/lib-coding-test.service";
|
|
13
|
-
import * as i2 from "@angular/common";
|
|
14
|
-
import * as i3 from "@testgorilla/tgo-ui";
|
|
15
|
-
let TestResultsComponent = class TestResultsComponent {
|
|
16
|
-
libCodingTestService;
|
|
17
|
-
changeDetectorRef;
|
|
18
|
-
companyColor;
|
|
19
|
-
testCasesStatus;
|
|
20
|
-
loading;
|
|
21
|
-
runTestResponse = [];
|
|
22
|
-
translations;
|
|
23
|
-
isLAT = false;
|
|
24
|
-
isSQL = false;
|
|
25
|
-
exampleTestCases;
|
|
26
|
-
canChangeProgrammingLang;
|
|
27
|
-
showTestCases;
|
|
28
|
-
canAddCustomTestCases;
|
|
29
|
-
applicationTheme;
|
|
30
|
-
runTestClick = new EventEmitter();
|
|
31
|
-
runTestFirstClick = false;
|
|
32
|
-
emptySpaceRegex = /^\s*$/;
|
|
33
|
-
disableRun$ = of(false);
|
|
34
|
-
constructor(libCodingTestService, changeDetectorRef) {
|
|
35
|
-
this.libCodingTestService = libCodingTestService;
|
|
36
|
-
this.changeDetectorRef = changeDetectorRef;
|
|
37
|
-
}
|
|
38
|
-
ngOnInit() {
|
|
39
|
-
if (this.isLAT) {
|
|
40
|
-
if (this.canChangeProgrammingLang) {
|
|
41
|
-
this.listenLanguageChange();
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
this.disableRun$ = this.libCodingTestService.codeChange$.pipe(debounceTime(300), distinctUntilChanged(), map(code => !!code.match(this.emptySpaceRegex)), untilDestroyed(this));
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
trackByFunction(index, item) {
|
|
49
|
-
return item;
|
|
50
|
-
}
|
|
51
|
-
runTest() {
|
|
52
|
-
this.runTestClick.emit(true);
|
|
53
|
-
if (!this.runTestFirstClick) {
|
|
54
|
-
this.runTestFirstClick = true;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
getTestCases([canAddCustomTestCases]) {
|
|
58
|
-
const savedTestCases = this.libCodingTestService.getTestCases() ?? [];
|
|
59
|
-
return canAddCustomTestCases ? savedTestCases : [];
|
|
60
|
-
}
|
|
61
|
-
listenLanguageChange() {
|
|
62
|
-
this.libCodingTestService.currentLanguage$.pipe(untilDestroyed(this)).subscribe(() => {
|
|
63
|
-
this.runTestFirstClick = false;
|
|
64
|
-
this.runTestResponse = [];
|
|
65
|
-
this.changeDetectorRef.detectChanges();
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TestResultsComponent, deps: [{ token: i1.LibCodingTestService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
69
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: TestResultsComponent, isStandalone: true, selector: "tgo-code-test-results", inputs: { companyColor: "companyColor", testCasesStatus: "testCasesStatus", loading: "loading", runTestResponse: "runTestResponse", translations: "translations", isLAT: "isLAT", isSQL: "isSQL", exampleTestCases: "exampleTestCases", canChangeProgrammingLang: "canChangeProgrammingLang", showTestCases: "showTestCases", canAddCustomTestCases: "canAddCustomTestCases", applicationTheme: "applicationTheme" }, outputs: { runTestClick: "runTestClick" }, ngImport: i0, template: "<div class=\"test-output\" [class.test-output-lat]=\"isLAT\">\n <div>\n <div class=\"barra\">\n <h3 class=\"barra-title\">{{ translations['HEADINGS']['TESTS'] }}</h3>\n <ui-button\n [size]=\"'small'\"\n [variant]=\"'primary'\"\n [label]=\"translations['TEST_RESULTS']['RUN_TESTS']\"\n [iconPosition]=\"'left'\"\n [iconName]=\"'Play-filled'\"\n [companyColor]=\"companyColor ? companyColor : '#46a997'\"\n [disabled]=\"this.loading || (disableRun$ | async)\"\n (buttonClickEvent)=\"runTest()\"\n class=\"run-test-btn\"\n ></ui-button>\n </div>\n @if (showTestCases && loading) {\n <ui-progress-bar [mode]=\"'query'\" class=\"progress-bar\"></ui-progress-bar>\n }\n </div>\n @if (!showTestCases) {\n <div class=\"html\">\n @if (!this.loading) { @if (runTestResponse.length !== 0) {\n <div>\n <!-- todo: remove legacy non-testcase view after sunsetting of the old flow -->\n @if (isSQL) {\n <div class=\"response-message\">\n <span>{{ runTestResponse[0]['response_msg'] }}</span>\n </div>\n @for (returnTest of runTestResponse; track trackByFunction($index, returnTest); let isLast = $last) {\n <div class=\"test-case-block\">\n @if (returnTest.content) {\n <div class=\"test-validation\">\n <span class=\"title\">{{ translations['TEST_RESULTS']['TEST_CASES']['TEST_VALIDATION'] }}</span>\n <span class=\"result\">{{ returnTest.content }}</span>\n </div>\n }\n <div class=\"sql-stdout\" [class.no-border]=\"isLast\">\n <span class=\"title\">{{ translations['TEST_RESULTS']['TEST_CASES']['RESULT'] }}</span>\n <span\n [ngClass]=\"{\n result: true,\n passed: returnTest.test_result === 'OK',\n error: returnTest.test_result !== 'OK' || returnTest.stderr\n }\"\n >{{ returnTest.stderr ? returnTest.stderr : returnTest.stdout[0] }}</span\n >\n @if (returnTest.test_result === 'OK') {\n <span class=\"result passed\">OK</span>\n } @else {\n <span class=\"title error\">{{ translations['TEST_RESULTS']['TEST_CASES']['EXPECTED'] }}</span>\n <span class=\"result\">{{ returnTest.test_result }}</span>\n }\n </div>\n </div>\n } } @else { @for (returnTest of runTestResponse; track returnTest) {\n <div>\n <span>{{ returnTest['response_msg'] }}</span>\n <br />\n <span>{{ returnTest['stderr'] }}</span>\n <br />\n @for (item of returnTest['stdout']; track item; let j = $index) {\n <div class=\"stdout\">\n @if (item?.includes('@@')) {\n <span class=\"result\">{{ item.replace('@@', '').replace('@@', '').trim() }}</span>\n } @if (item?.includes('##')) {\n <span class=\"passed\">{{ item.replace('##', '').replace('##', '').trim() }}</span>\n } @if (item?.includes('$$')) {\n <span class=\"error\">{{ item.replace('$$', '').replace('$$', '').trim() }}</span>\n } @if (!item?.includes('~~') && !item?.includes('@@') && !item?.includes('##') && !item?.includes('$$')) {\n <span class=\"info\">{{ item?.trim() }}</span>\n }\n </div>\n }\n <br />\n </div>\n } }\n </div>\n } @else {\n <span>\n {{\n this.loading ? translations['TEST_RESULTS']['TESTS_RUNNING'] : translations['TEST_RESULTS']['TESTS_CHECK']\n }}</span\n >\n } } @else {\n <ui-progress-bar class=\"progress-bar\" [mode]=\"'query'\"></ui-progress-bar>\n }\n </div>\n } @else { @if (!loading) {\n <div class=\"LAT-tests\" [class.LAT-tests-with-status]=\"runTestFirstClick\">\n <tgo-test-cases\n [exampleTestCases]=\"exampleTestCases\"\n [testCases]=\"[canAddCustomTestCases, loading] | memoizeFunc: getTestCases : this\"\n [apiTestCasesResult]=\"runTestResponse\"\n [testCasesStatus]=\"testCasesStatus\"\n [translations]=\"translations\"\n [areTestsRun]=\"runTestFirstClick\"\n [canAddCustomTestCases]=\"canAddCustomTestCases\"\n [applicationTheme]=\"applicationTheme\"\n [isSQL]=\"isSQL\"\n ></tgo-test-cases>\n </div>\n } }\n <div class=\"status\">\n @if (runTestFirstClick) {\n <div @slideInOut class=\"status-child\">\n @if (testCasesStatus) {\n <p class=\"passed\">\n {{ translations['TEST_RESULTS']['PASSED'] + testCasesStatus['ok'] }}\n </p>\n <p class=\"error\">\n {{ translations['TEST_RESULTS']['ERROR'] + testCasesStatus['error'] }}\n </p>\n <p>{{ translations['TEST_RESULTS']['TOTAL'] + testCasesStatus['total'] }}</p>\n }\n </div>\n }\n </div>\n</div>\n", styles: [".test-output{display:flex;flex-direction:column;height:100%;max-height:100%;border:1px solid rgba(221,221,221,0);border-bottom-left-radius:5px;border-bottom-right-radius:5px;background:var(--bg-mat-card)}@media screen and (max-width: 959px){.test-output-lat{justify-content:space-between}}.test-output .html{padding:10px;font-family:Courier;overflow-y:auto;white-space:pre-wrap}@media screen and (max-width: 959px){.test-output .html{min-height:250px;max-width:100vw}}.test-output .html .response-message:after{content:\"\";display:block;border-bottom:1px dashed;margin-top:20px;margin-bottom:20px;margin-right:55%}.test-output .html .stdout .result{font-weight:bolder;margin-top:10px;display:block}.test-output .html .stdout .passed{font-weight:bolder;color:var(--petrol-text-color)}.test-output .html .stdout .error{font-weight:bolder;color:#cb7b7a}.test-output .html .stdout .info{color:#aaa}.test-output .html .test-case-block{padding-bottom:20px}.test-output .html .test-case-block:not(:last-child):after{content:\"\";display:block;border-bottom:1px dashed;margin-top:20px;margin-right:55%}.test-output .html .test-case-block .test-validation span,.test-output .html .test-case-block .sql-stdout span{display:block}.test-output .html .test-case-block .test-validation .title,.test-output .html .test-case-block .sql-stdout .title{font-weight:700;margin-bottom:5px}.test-output .html .test-case-block .test-validation .result,.test-output .html .test-case-block .sql-stdout .result{font-weight:bolder;margin-bottom:20px}.test-output .html .test-case-block .test-validation .passed,.test-output .html .test-case-block .sql-stdout .passed{color:var(--petrol-text-color)}.test-output .html .test-case-block .test-validation .error,.test-output .html .test-case-block .sql-stdout .error{color:#cb7b7a}.test-output .html .test-case-block .sql-stdout:not(.no-border):after{content:none}.test-output .LAT-tests{max-height:calc(100% - 54px);flex:1 0 auto;transition:max-height .5s ease}.test-output .LAT-tests-with-status{max-height:calc(100% - 106px)}.test-output .status{margin-top:auto}@media screen and (max-width: 959px){.test-output .status{margin:0}}.test-output .status .status-child{display:flex;padding:16px;background-color:var(--status-bg-color);justify-content:center;min-height:52px}.test-output .status .status-child p{margin:0 2em 0 0;font-weight:bolder}.test-output .status .status-child p.passed{color:var(--petrol-text-color)}.test-output .status .status-child p.error{color:#cb7b7a}.test-output .barra{place-content:stretch space-between;align-items:center;flex-direction:row;box-sizing:border-box;display:flex;position:sticky;top:0;padding:10px;width:100%;height:54px;border-bottom:1px solid var(--border-bg-color)}.test-output .run-test{padding-left:21px}.test-output .run-test-icon{width:15px;height:17px;min-width:15px;min-height:17px;margin-right:10px;line-height:10px}.test-output .run-test-icon ::ng-deep svg{fill:currentColor}.test-output .run-test-btn ::ng-deep .mat-mdc-unelevated-button.primary{background-color:var(--color)!important}.progress-bar ::ng-deep .mat-mdc-progress-bar{overflow-y:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ButtonComponentModule }, { kind: "component", type: i3.ButtonComponent, selector: "ui-button", inputs: ["size", "variant", "label", "iconPosition", "justIcon", "iconName", "disabled", "loading", "fullWidth", "url", "urlTarget", "value", "tooltip", "isPremium", "type", "companyColor", "buttonBadgeConfig", "applicationTheme", "disabledScaleOnClick", "ariaLabel", "ariaRequired", "ariaLabelledby", "ariaDescribedby", "preventDefault", "hasBackground", "tooltipPosition", "role", "iconFilled"], outputs: ["buttonClickEvent", "buttonHoverEvent"] }, { kind: "ngmodule", type: ProgressBarComponentModule }, { kind: "component", type: i3.ProgressBarComponent, selector: "ui-progress-bar", inputs: ["companyColor", "progress", "mode", "buffer", "applicationTheme", "ariaLabel", "ariaDescribedBy", "showPercentage"] }, { kind: "pipe", type: MemoizeFuncPipe, name: "memoizeFunc" }, { kind: "component", type: TestCasesComponent, selector: "tgo-test-cases", inputs: ["exampleTestCases", "apiTestCasesResult", "testCasesStatus", "testCases", "translations", "areTestsRun", "applicationTheme", "canAddCustomTestCases", "isSQL"] }], animations: [
|
|
70
|
-
trigger('slideInOut', [
|
|
71
|
-
transition(':enter', [
|
|
72
|
-
style({ transform: 'translateY(100%)', opacity: '0' }),
|
|
73
|
-
animate('500ms ease', style({ transform: 'translateY(0)', opacity: '1' })),
|
|
74
|
-
]),
|
|
75
|
-
]),
|
|
76
|
-
], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
77
|
-
};
|
|
78
|
-
TestResultsComponent = __decorate([
|
|
79
|
-
UntilDestroy(),
|
|
80
|
-
__metadata("design:paramtypes", [LibCodingTestService,
|
|
81
|
-
ChangeDetectorRef])
|
|
82
|
-
], TestResultsComponent);
|
|
83
|
-
export { TestResultsComponent };
|
|
84
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TestResultsComponent, decorators: [{
|
|
85
|
-
type: Component,
|
|
86
|
-
args: [{ standalone: true, selector: 'tgo-code-test-results', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
87
|
-
CommonModule,
|
|
88
|
-
ButtonComponentModule,
|
|
89
|
-
ProgressBarComponentModule,
|
|
90
|
-
MemoizeFuncPipe,
|
|
91
|
-
TestCasesComponent,
|
|
92
|
-
], animations: [
|
|
93
|
-
trigger('slideInOut', [
|
|
94
|
-
transition(':enter', [
|
|
95
|
-
style({ transform: 'translateY(100%)', opacity: '0' }),
|
|
96
|
-
animate('500ms ease', style({ transform: 'translateY(0)', opacity: '1' })),
|
|
97
|
-
]),
|
|
98
|
-
]),
|
|
99
|
-
], template: "<div class=\"test-output\" [class.test-output-lat]=\"isLAT\">\n <div>\n <div class=\"barra\">\n <h3 class=\"barra-title\">{{ translations['HEADINGS']['TESTS'] }}</h3>\n <ui-button\n [size]=\"'small'\"\n [variant]=\"'primary'\"\n [label]=\"translations['TEST_RESULTS']['RUN_TESTS']\"\n [iconPosition]=\"'left'\"\n [iconName]=\"'Play-filled'\"\n [companyColor]=\"companyColor ? companyColor : '#46a997'\"\n [disabled]=\"this.loading || (disableRun$ | async)\"\n (buttonClickEvent)=\"runTest()\"\n class=\"run-test-btn\"\n ></ui-button>\n </div>\n @if (showTestCases && loading) {\n <ui-progress-bar [mode]=\"'query'\" class=\"progress-bar\"></ui-progress-bar>\n }\n </div>\n @if (!showTestCases) {\n <div class=\"html\">\n @if (!this.loading) { @if (runTestResponse.length !== 0) {\n <div>\n <!-- todo: remove legacy non-testcase view after sunsetting of the old flow -->\n @if (isSQL) {\n <div class=\"response-message\">\n <span>{{ runTestResponse[0]['response_msg'] }}</span>\n </div>\n @for (returnTest of runTestResponse; track trackByFunction($index, returnTest); let isLast = $last) {\n <div class=\"test-case-block\">\n @if (returnTest.content) {\n <div class=\"test-validation\">\n <span class=\"title\">{{ translations['TEST_RESULTS']['TEST_CASES']['TEST_VALIDATION'] }}</span>\n <span class=\"result\">{{ returnTest.content }}</span>\n </div>\n }\n <div class=\"sql-stdout\" [class.no-border]=\"isLast\">\n <span class=\"title\">{{ translations['TEST_RESULTS']['TEST_CASES']['RESULT'] }}</span>\n <span\n [ngClass]=\"{\n result: true,\n passed: returnTest.test_result === 'OK',\n error: returnTest.test_result !== 'OK' || returnTest.stderr\n }\"\n >{{ returnTest.stderr ? returnTest.stderr : returnTest.stdout[0] }}</span\n >\n @if (returnTest.test_result === 'OK') {\n <span class=\"result passed\">OK</span>\n } @else {\n <span class=\"title error\">{{ translations['TEST_RESULTS']['TEST_CASES']['EXPECTED'] }}</span>\n <span class=\"result\">{{ returnTest.test_result }}</span>\n }\n </div>\n </div>\n } } @else { @for (returnTest of runTestResponse; track returnTest) {\n <div>\n <span>{{ returnTest['response_msg'] }}</span>\n <br />\n <span>{{ returnTest['stderr'] }}</span>\n <br />\n @for (item of returnTest['stdout']; track item; let j = $index) {\n <div class=\"stdout\">\n @if (item?.includes('@@')) {\n <span class=\"result\">{{ item.replace('@@', '').replace('@@', '').trim() }}</span>\n } @if (item?.includes('##')) {\n <span class=\"passed\">{{ item.replace('##', '').replace('##', '').trim() }}</span>\n } @if (item?.includes('$$')) {\n <span class=\"error\">{{ item.replace('$$', '').replace('$$', '').trim() }}</span>\n } @if (!item?.includes('~~') && !item?.includes('@@') && !item?.includes('##') && !item?.includes('$$')) {\n <span class=\"info\">{{ item?.trim() }}</span>\n }\n </div>\n }\n <br />\n </div>\n } }\n </div>\n } @else {\n <span>\n {{\n this.loading ? translations['TEST_RESULTS']['TESTS_RUNNING'] : translations['TEST_RESULTS']['TESTS_CHECK']\n }}</span\n >\n } } @else {\n <ui-progress-bar class=\"progress-bar\" [mode]=\"'query'\"></ui-progress-bar>\n }\n </div>\n } @else { @if (!loading) {\n <div class=\"LAT-tests\" [class.LAT-tests-with-status]=\"runTestFirstClick\">\n <tgo-test-cases\n [exampleTestCases]=\"exampleTestCases\"\n [testCases]=\"[canAddCustomTestCases, loading] | memoizeFunc: getTestCases : this\"\n [apiTestCasesResult]=\"runTestResponse\"\n [testCasesStatus]=\"testCasesStatus\"\n [translations]=\"translations\"\n [areTestsRun]=\"runTestFirstClick\"\n [canAddCustomTestCases]=\"canAddCustomTestCases\"\n [applicationTheme]=\"applicationTheme\"\n [isSQL]=\"isSQL\"\n ></tgo-test-cases>\n </div>\n } }\n <div class=\"status\">\n @if (runTestFirstClick) {\n <div @slideInOut class=\"status-child\">\n @if (testCasesStatus) {\n <p class=\"passed\">\n {{ translations['TEST_RESULTS']['PASSED'] + testCasesStatus['ok'] }}\n </p>\n <p class=\"error\">\n {{ translations['TEST_RESULTS']['ERROR'] + testCasesStatus['error'] }}\n </p>\n <p>{{ translations['TEST_RESULTS']['TOTAL'] + testCasesStatus['total'] }}</p>\n }\n </div>\n }\n </div>\n</div>\n", styles: [".test-output{display:flex;flex-direction:column;height:100%;max-height:100%;border:1px solid rgba(221,221,221,0);border-bottom-left-radius:5px;border-bottom-right-radius:5px;background:var(--bg-mat-card)}@media screen and (max-width: 959px){.test-output-lat{justify-content:space-between}}.test-output .html{padding:10px;font-family:Courier;overflow-y:auto;white-space:pre-wrap}@media screen and (max-width: 959px){.test-output .html{min-height:250px;max-width:100vw}}.test-output .html .response-message:after{content:\"\";display:block;border-bottom:1px dashed;margin-top:20px;margin-bottom:20px;margin-right:55%}.test-output .html .stdout .result{font-weight:bolder;margin-top:10px;display:block}.test-output .html .stdout .passed{font-weight:bolder;color:var(--petrol-text-color)}.test-output .html .stdout .error{font-weight:bolder;color:#cb7b7a}.test-output .html .stdout .info{color:#aaa}.test-output .html .test-case-block{padding-bottom:20px}.test-output .html .test-case-block:not(:last-child):after{content:\"\";display:block;border-bottom:1px dashed;margin-top:20px;margin-right:55%}.test-output .html .test-case-block .test-validation span,.test-output .html .test-case-block .sql-stdout span{display:block}.test-output .html .test-case-block .test-validation .title,.test-output .html .test-case-block .sql-stdout .title{font-weight:700;margin-bottom:5px}.test-output .html .test-case-block .test-validation .result,.test-output .html .test-case-block .sql-stdout .result{font-weight:bolder;margin-bottom:20px}.test-output .html .test-case-block .test-validation .passed,.test-output .html .test-case-block .sql-stdout .passed{color:var(--petrol-text-color)}.test-output .html .test-case-block .test-validation .error,.test-output .html .test-case-block .sql-stdout .error{color:#cb7b7a}.test-output .html .test-case-block .sql-stdout:not(.no-border):after{content:none}.test-output .LAT-tests{max-height:calc(100% - 54px);flex:1 0 auto;transition:max-height .5s ease}.test-output .LAT-tests-with-status{max-height:calc(100% - 106px)}.test-output .status{margin-top:auto}@media screen and (max-width: 959px){.test-output .status{margin:0}}.test-output .status .status-child{display:flex;padding:16px;background-color:var(--status-bg-color);justify-content:center;min-height:52px}.test-output .status .status-child p{margin:0 2em 0 0;font-weight:bolder}.test-output .status .status-child p.passed{color:var(--petrol-text-color)}.test-output .status .status-child p.error{color:#cb7b7a}.test-output .barra{place-content:stretch space-between;align-items:center;flex-direction:row;box-sizing:border-box;display:flex;position:sticky;top:0;padding:10px;width:100%;height:54px;border-bottom:1px solid var(--border-bg-color)}.test-output .run-test{padding-left:21px}.test-output .run-test-icon{width:15px;height:17px;min-width:15px;min-height:17px;margin-right:10px;line-height:10px}.test-output .run-test-icon ::ng-deep svg{fill:currentColor}.test-output .run-test-btn ::ng-deep .mat-mdc-unelevated-button.primary{background-color:var(--color)!important}.progress-bar ::ng-deep .mat-mdc-progress-bar{overflow-y:hidden}\n"] }]
|
|
100
|
-
}], ctorParameters: () => [{ type: i1.LibCodingTestService }, { type: i0.ChangeDetectorRef }], propDecorators: { companyColor: [{
|
|
101
|
-
type: Input
|
|
102
|
-
}], testCasesStatus: [{
|
|
103
|
-
type: Input
|
|
104
|
-
}], loading: [{
|
|
105
|
-
type: Input
|
|
106
|
-
}], runTestResponse: [{
|
|
107
|
-
type: Input
|
|
108
|
-
}], translations: [{
|
|
109
|
-
type: Input
|
|
110
|
-
}], isLAT: [{
|
|
111
|
-
type: Input
|
|
112
|
-
}], isSQL: [{
|
|
113
|
-
type: Input
|
|
114
|
-
}], exampleTestCases: [{
|
|
115
|
-
type: Input
|
|
116
|
-
}], canChangeProgrammingLang: [{
|
|
117
|
-
type: Input
|
|
118
|
-
}], showTestCases: [{
|
|
119
|
-
type: Input
|
|
120
|
-
}], canAddCustomTestCases: [{
|
|
121
|
-
type: Input
|
|
122
|
-
}], applicationTheme: [{
|
|
123
|
-
type: Input
|
|
124
|
-
}], runTestClick: [{
|
|
125
|
-
type: Output
|
|
126
|
-
}] } });
|
|
127
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1yZXN1bHRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3Rnby1jb2RpbmctdGVzdC9zcmMvbGliL2NvbXBvbmVudHMvdGVzdHMvdGVzdC1yZXN1bHRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3Rnby1jb2RpbmctdGVzdC9zcmMvbGliL2NvbXBvbmVudHMvdGVzdHMvdGVzdC1yZXN1bHRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0gsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFvQixxQkFBcUIsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTFHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7QUF5QmhFLElBQU0sb0JBQW9CLEdBQTFCLE1BQU0sb0JBQW9CO0lBcUJyQjtJQUNBO0lBckJELFlBQVksQ0FBUztJQUNyQixlQUFlLENBQU07SUFDckIsT0FBTyxDQUFVO0lBQ2pCLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDckIsWUFBWSxDQUEwQjtJQUN0QyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ2QsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNkLGdCQUFnQixDQUFvQjtJQUNwQyx3QkFBd0IsQ0FBVTtJQUNsQyxhQUFhLENBQVU7SUFDdkIscUJBQXFCLENBQVU7SUFDL0IsZ0JBQWdCLENBQW1CO0lBRWxDLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBRXJELGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUMxQixlQUFlLEdBQUcsT0FBTyxDQUFDO0lBQzFCLFdBQVcsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEIsWUFDVSxvQkFBMEMsRUFDMUMsaUJBQW9DO1FBRHBDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtJQUMzQyxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDM0QsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUNqQixvQkFBb0IsRUFBRSxFQUN0QixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFDL0MsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUNyQixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlLENBQUMsS0FBYSxFQUFFLElBQVM7UUFDdEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUFDLENBQUMscUJBQXFCLENBQVk7UUFDN0MsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN0RSxPQUFPLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNuRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBOURVLG9CQUFvQjs0RkFBcEIsb0JBQW9CLGtoQkNsQ2pDLGlzSkF1SEEsaW5HRHBHSSxZQUFZLGlMQUNaLHFCQUFxQix1aUJBQ3JCLDBCQUEwQiwyT0FDMUIsZUFBZSxvREFDZixrQkFBa0Isc05BRVI7WUFDVixPQUFPLENBQUMsWUFBWSxFQUFFO2dCQUNwQixVQUFVLENBQUMsUUFBUSxFQUFFO29CQUNuQixLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO29CQUN0RCxPQUFPLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7aUJBQzNFLENBQUM7YUFDSCxDQUFDO1NBQ0g7O0FBRVUsb0JBQW9CO0lBdkJoQyxZQUFZLEVBQUU7cUNBNENtQixvQkFBb0I7UUFDdkIsaUJBQWlCO0dBdEJuQyxvQkFBb0IsQ0ErRGhDOzs0RkEvRFksb0JBQW9CO2tCQXRCaEMsU0FBUztpQ0FDSSxJQUFJLFlBQ04sdUJBQXVCLG1CQUdoQix1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO3dCQUNQLFlBQVk7d0JBQ1oscUJBQXFCO3dCQUNyQiwwQkFBMEI7d0JBQzFCLGVBQWU7d0JBQ2Ysa0JBQWtCO3FCQUNuQixjQUNXO3dCQUNWLE9BQU8sQ0FBQyxZQUFZLEVBQUU7NEJBQ3BCLFVBQVUsQ0FBQyxRQUFRLEVBQUU7Z0NBQ25CLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0NBQ3RELE9BQU8sQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQzs2QkFDM0UsQ0FBQzt5QkFDSCxDQUFDO3FCQUNIO3lIQUdRLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnRpbERlc3Ryb3ksIHVudGlsRGVzdHJveWVkIH0gZnJvbSAnQG5nbmVhdC91bnRpbC1kZXN0cm95JztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uVGhlbWUsIEJ1dHRvbkNvbXBvbmVudE1vZHVsZSwgUHJvZ3Jlc3NCYXJDb21wb25lbnRNb2R1bGUgfSBmcm9tICdAdGVzdGdvcmlsbGEvdGdvLXVpJztcbmltcG9ydCB7IEN1c3RvbVRlc3RDYXNlLCBFeGFtcGxlVGVzdENhc2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvdGVzdC1jYXNlcyc7XG5pbXBvcnQgeyBMaWJDb2RpbmdUZXN0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xpYi1jb2RpbmctdGVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IE1lbW9pemVGdW5jUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL21lbW9pemUtZnVuYy5waXBlJztcbmltcG9ydCB7IFRlc3RDYXNlc0NvbXBvbmVudCB9IGZyb20gJy4vdGVzdC1jYXNlcy90ZXN0LWNhc2VzLmNvbXBvbmVudCc7XG5cbkBVbnRpbERlc3Ryb3koKVxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAndGdvLWNvZGUtdGVzdC1yZXN1bHRzJyxcbiAgdGVtcGxhdGVVcmw6ICd0ZXN0LXJlc3VsdHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsndGVzdC1yZXN1bHRzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEJ1dHRvbkNvbXBvbmVudE1vZHVsZSxcbiAgICBQcm9ncmVzc0JhckNvbXBvbmVudE1vZHVsZSxcbiAgICBNZW1vaXplRnVuY1BpcGUsXG4gICAgVGVzdENhc2VzQ29tcG9uZW50LFxuICBdLFxuICBhbmltYXRpb25zOiBbXG4gICAgdHJpZ2dlcignc2xpZGVJbk91dCcsIFtcbiAgICAgIHRyYW5zaXRpb24oJzplbnRlcicsIFtcbiAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDEwMCUpJywgb3BhY2l0eTogJzAnIH0pLFxuICAgICAgICBhbmltYXRlKCc1MDBtcyBlYXNlJywgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDApJywgb3BhY2l0eTogJzEnIH0pKSxcbiAgICAgIF0pLFxuICAgIF0pLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBUZXN0UmVzdWx0c0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGNvbXBhbnlDb2xvcjogc3RyaW5nO1xuICBASW5wdXQoKSB0ZXN0Q2FzZXNTdGF0dXM6IGFueTtcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbjtcbiAgQElucHV0KCkgcnVuVGVzdFJlc3BvbnNlID0gW107XG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBJbnB1dCgpIGlzTEFUID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzU1FMID0gZmFsc2U7XG4gIEBJbnB1dCgpIGV4YW1wbGVUZXN0Q2FzZXM6IEV4YW1wbGVUZXN0Q2FzZVtdO1xuICBASW5wdXQoKSBjYW5DaGFuZ2VQcm9ncmFtbWluZ0xhbmc6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNob3dUZXN0Q2FzZXM6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNhbkFkZEN1c3RvbVRlc3RDYXNlczogYm9vbGVhbjtcbiAgQElucHV0KCkgYXBwbGljYXRpb25UaGVtZTogQXBwbGljYXRpb25UaGVtZTtcblxuICBAT3V0cHV0KCkgcnVuVGVzdENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIHJ1blRlc3RGaXJzdENsaWNrID0gZmFsc2U7XG4gIGVtcHR5U3BhY2VSZWdleCA9IC9eXFxzKiQvO1xuICBkaXNhYmxlUnVuJCA9IG9mKGZhbHNlKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGxpYkNvZGluZ1Rlc3RTZXJ2aWNlOiBMaWJDb2RpbmdUZXN0U2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuaXNMQVQpIHtcbiAgICAgIGlmICh0aGlzLmNhbkNoYW5nZVByb2dyYW1taW5nTGFuZykge1xuICAgICAgICB0aGlzLmxpc3Rlbkxhbmd1YWdlQ2hhbmdlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzYWJsZVJ1biQgPSB0aGlzLmxpYkNvZGluZ1Rlc3RTZXJ2aWNlLmNvZGVDaGFuZ2UkLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICBtYXAoY29kZSA9PiAhIWNvZGUubWF0Y2godGhpcy5lbXB0eVNwYWNlUmVnZXgpKSxcbiAgICAgICAgdW50aWxEZXN0cm95ZWQodGhpcylcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdHJhY2tCeUZ1bmN0aW9uKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cblxuICBydW5UZXN0KCkge1xuICAgIHRoaXMucnVuVGVzdENsaWNrLmVtaXQodHJ1ZSk7XG4gICAgaWYgKCF0aGlzLnJ1blRlc3RGaXJzdENsaWNrKSB7XG4gICAgICB0aGlzLnJ1blRlc3RGaXJzdENsaWNrID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBnZXRUZXN0Q2FzZXMoW2NhbkFkZEN1c3RvbVRlc3RDYXNlc106IFtib29sZWFuXSk6IChFeGFtcGxlVGVzdENhc2UgfCBDdXN0b21UZXN0Q2FzZSlbXSB7XG4gICAgY29uc3Qgc2F2ZWRUZXN0Q2FzZXMgPSB0aGlzLmxpYkNvZGluZ1Rlc3RTZXJ2aWNlLmdldFRlc3RDYXNlcygpID8/IFtdO1xuICAgIHJldHVybiBjYW5BZGRDdXN0b21UZXN0Q2FzZXMgPyBzYXZlZFRlc3RDYXNlcyA6IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5MYW5ndWFnZUNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxpYkNvZGluZ1Rlc3RTZXJ2aWNlLmN1cnJlbnRMYW5ndWFnZSQucGlwZSh1bnRpbERlc3Ryb3llZCh0aGlzKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMucnVuVGVzdEZpcnN0Q2xpY2sgPSBmYWxzZTtcbiAgICAgIHRoaXMucnVuVGVzdFJlc3BvbnNlID0gW107XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRlc3Qtb3V0cHV0XCIgW2NsYXNzLnRlc3Qtb3V0cHV0LWxhdF09XCJpc0xBVFwiPlxuICA8ZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJiYXJyYVwiPlxuICAgICAgPGgzIGNsYXNzPVwiYmFycmEtdGl0bGVcIj57eyB0cmFuc2xhdGlvbnNbJ0hFQURJTkdTJ11bJ1RFU1RTJ10gfX08L2gzPlxuICAgICAgPHVpLWJ1dHRvblxuICAgICAgICBbc2l6ZV09XCInc21hbGwnXCJcbiAgICAgICAgW3ZhcmlhbnRdPVwiJ3ByaW1hcnknXCJcbiAgICAgICAgW2xhYmVsXT1cInRyYW5zbGF0aW9uc1snVEVTVF9SRVNVTFRTJ11bJ1JVTl9URVNUUyddXCJcbiAgICAgICAgW2ljb25Qb3NpdGlvbl09XCInbGVmdCdcIlxuICAgICAgICBbaWNvbk5hbWVdPVwiJ1BsYXktZmlsbGVkJ1wiXG4gICAgICAgIFtjb21wYW55Q29sb3JdPVwiY29tcGFueUNvbG9yID8gY29tcGFueUNvbG9yIDogJyM0NmE5OTcnXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInRoaXMubG9hZGluZyB8fCAoZGlzYWJsZVJ1biQgfCBhc3luYylcIlxuICAgICAgICAoYnV0dG9uQ2xpY2tFdmVudCk9XCJydW5UZXN0KClcIlxuICAgICAgICBjbGFzcz1cInJ1bi10ZXN0LWJ0blwiXG4gICAgICA+PC91aS1idXR0b24+XG4gICAgPC9kaXY+XG4gICAgQGlmIChzaG93VGVzdENhc2VzICYmIGxvYWRpbmcpIHtcbiAgICA8dWktcHJvZ3Jlc3MtYmFyIFttb2RlXT1cIidxdWVyeSdcIiBjbGFzcz1cInByb2dyZXNzLWJhclwiPjwvdWktcHJvZ3Jlc3MtYmFyPlxuICAgIH1cbiAgPC9kaXY+XG4gIEBpZiAoIXNob3dUZXN0Q2FzZXMpIHtcbiAgPGRpdiBjbGFzcz1cImh0bWxcIj5cbiAgICBAaWYgKCF0aGlzLmxvYWRpbmcpIHsgQGlmIChydW5UZXN0UmVzcG9uc2UubGVuZ3RoICE9PSAwKSB7XG4gICAgPGRpdj5cbiAgICAgIDwhLS0gICAgICAgICAgdG9kbzogcmVtb3ZlIGxlZ2FjeSBub24tdGVzdGNhc2UgdmlldyBhZnRlciBzdW5zZXR0aW5nIG9mIHRoZSBvbGQgZmxvdyAtLT5cbiAgICAgIEBpZiAoaXNTUUwpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJyZXNwb25zZS1tZXNzYWdlXCI+XG4gICAgICAgIDxzcGFuPnt7IHJ1blRlc3RSZXNwb25zZVswXVsncmVzcG9uc2VfbXNnJ10gfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIEBmb3IgKHJldHVyblRlc3Qgb2YgcnVuVGVzdFJlc3BvbnNlOyB0cmFjayB0cmFja0J5RnVuY3Rpb24oJGluZGV4LCByZXR1cm5UZXN0KTsgbGV0IGlzTGFzdCA9ICRsYXN0KSB7XG4gICAgICA8ZGl2IGNsYXNzPVwidGVzdC1jYXNlLWJsb2NrXCI+XG4gICAgICAgIEBpZiAocmV0dXJuVGVzdC5jb250ZW50KSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXN0LXZhbGlkYXRpb25cIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpdGxlXCI+e3sgdHJhbnNsYXRpb25zWydURVNUX1JFU1VMVFMnXVsnVEVTVF9DQVNFUyddWydURVNUX1ZBTElEQVRJT04nXSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlc3VsdFwiPnt7IHJldHVyblRlc3QuY29udGVudCB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdiBjbGFzcz1cInNxbC1zdGRvdXRcIiBbY2xhc3Mubm8tYm9yZGVyXT1cImlzTGFzdFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGVcIj57eyB0cmFuc2xhdGlvbnNbJ1RFU1RfUkVTVUxUUyddWydURVNUX0NBU0VTJ11bJ1JFU1VMVCddIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgIHJlc3VsdDogdHJ1ZSxcbiAgICAgICAgICAgICAgcGFzc2VkOiByZXR1cm5UZXN0LnRlc3RfcmVzdWx0ID09PSAnT0snLFxuICAgICAgICAgICAgICBlcnJvcjogcmV0dXJuVGVzdC50ZXN0X3Jlc3VsdCAhPT0gJ09LJyB8fCByZXR1cm5UZXN0LnN0ZGVyclxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICA+e3sgcmV0dXJuVGVzdC5zdGRlcnIgPyByZXR1cm5UZXN0LnN0ZGVyciA6IHJldHVyblRlc3Quc3Rkb3V0WzBdIH19PC9zcGFuXG4gICAgICAgICAgPlxuICAgICAgICAgIEBpZiAocmV0dXJuVGVzdC50ZXN0X3Jlc3VsdCA9PT0gJ09LJykge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVzdWx0IHBhc3NlZFwiPk9LPC9zcGFuPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGl0bGUgZXJyb3JcIj57eyB0cmFuc2xhdGlvbnNbJ1RFU1RfUkVTVUxUUyddWydURVNUX0NBU0VTJ11bJ0VYUEVDVEVEJ10gfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXN1bHRcIj57eyByZXR1cm5UZXN0LnRlc3RfcmVzdWx0IH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIH0gfSBAZWxzZSB7IEBmb3IgKHJldHVyblRlc3Qgb2YgcnVuVGVzdFJlc3BvbnNlOyB0cmFjayByZXR1cm5UZXN0KSB7XG4gICAgICA8ZGl2PlxuICAgICAgICA8c3Bhbj57eyByZXR1cm5UZXN0WydyZXNwb25zZV9tc2cnXSB9fTwvc3Bhbj5cbiAgICAgICAgPGJyIC8+XG4gICAgICAgIDxzcGFuPnt7IHJldHVyblRlc3RbJ3N0ZGVyciddIH19PC9zcGFuPlxuICAgICAgICA8YnIgLz5cbiAgICAgICAgQGZvciAoaXRlbSBvZiByZXR1cm5UZXN0WydzdGRvdXQnXTsgdHJhY2sgaXRlbTsgbGV0IGogPSAkaW5kZXgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0ZG91dFwiPlxuICAgICAgICAgIEBpZiAoaXRlbT8uaW5jbHVkZXMoJ0BAJykpIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlc3VsdFwiPnt7IGl0ZW0ucmVwbGFjZSgnQEAnLCAnJykucmVwbGFjZSgnQEAnLCAnJykudHJpbSgpIH19PC9zcGFuPlxuICAgICAgICAgIH0gQGlmIChpdGVtPy5pbmNsdWRlcygnIyMnKSkge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFzc2VkXCI+e3sgaXRlbS5yZXBsYWNlKCcjIycsICcnKS5yZXBsYWNlKCcjIycsICcnKS50cmltKCkgfX08L3NwYW4+XG4gICAgICAgICAgfSBAaWYgKGl0ZW0/LmluY2x1ZGVzKCckJCcpKSB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiPnt7IGl0ZW0ucmVwbGFjZSgnJCQnLCAnJykucmVwbGFjZSgnJCQnLCAnJykudHJpbSgpIH19PC9zcGFuPlxuICAgICAgICAgIH0gQGlmICghaXRlbT8uaW5jbHVkZXMoJ35+JykgJiYgIWl0ZW0/LmluY2x1ZGVzKCdAQCcpICYmICFpdGVtPy5pbmNsdWRlcygnIyMnKSAmJiAhaXRlbT8uaW5jbHVkZXMoJyQkJykpIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImluZm9cIj57eyBpdGVtPy50cmltKCkgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICA8YnIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgfSB9XG4gICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgPHNwYW4+XG4gICAgICB7e1xuICAgICAgICB0aGlzLmxvYWRpbmcgPyB0cmFuc2xhdGlvbnNbJ1RFU1RfUkVTVUxUUyddWydURVNUU19SVU5OSU5HJ10gOiB0cmFuc2xhdGlvbnNbJ1RFU1RfUkVTVUxUUyddWydURVNUU19DSEVDSyddXG4gICAgICB9fTwvc3BhblxuICAgID5cbiAgICB9IH0gQGVsc2Uge1xuICAgIDx1aS1wcm9ncmVzcy1iYXIgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIiBbbW9kZV09XCIncXVlcnknXCI+PC91aS1wcm9ncmVzcy1iYXI+XG4gICAgfVxuICA8L2Rpdj5cbiAgfSBAZWxzZSB7IEBpZiAoIWxvYWRpbmcpIHtcbiAgPGRpdiBjbGFzcz1cIkxBVC10ZXN0c1wiIFtjbGFzcy5MQVQtdGVzdHMtd2l0aC1zdGF0dXNdPVwicnVuVGVzdEZpcnN0Q2xpY2tcIj5cbiAgICA8dGdvLXRlc3QtY2FzZXNcbiAgICAgIFtleGFtcGxlVGVzdENhc2VzXT1cImV4YW1wbGVUZXN0Q2FzZXNcIlxuICAgICAgW3Rlc3RDYXNlc109XCJbY2FuQWRkQ3VzdG9tVGVzdENhc2VzLCBsb2FkaW5nXSB8IG1lbW9pemVGdW5jOiBnZXRUZXN0Q2FzZXMgOiB0aGlzXCJcbiAgICAgIFthcGlUZXN0Q2FzZXNSZXN1bHRdPVwicnVuVGVzdFJlc3BvbnNlXCJcbiAgICAgIFt0ZXN0Q2FzZXNTdGF0dXNdPVwidGVzdENhc2VzU3RhdHVzXCJcbiAgICAgIFt0cmFuc2xhdGlvbnNdPVwidHJhbnNsYXRpb25zXCJcbiAgICAgIFthcmVUZXN0c1J1bl09XCJydW5UZXN0Rmlyc3RDbGlja1wiXG4gICAgICBbY2FuQWRkQ3VzdG9tVGVzdENhc2VzXT1cImNhbkFkZEN1c3RvbVRlc3RDYXNlc1wiXG4gICAgICBbYXBwbGljYXRpb25UaGVtZV09XCJhcHBsaWNhdGlvblRoZW1lXCJcbiAgICAgIFtpc1NRTF09XCJpc1NRTFwiXG4gICAgPjwvdGdvLXRlc3QtY2FzZXM+XG4gIDwvZGl2PlxuICB9IH1cbiAgPGRpdiBjbGFzcz1cInN0YXR1c1wiPlxuICAgIEBpZiAocnVuVGVzdEZpcnN0Q2xpY2spIHtcbiAgICA8ZGl2IEBzbGlkZUluT3V0IGNsYXNzPVwic3RhdHVzLWNoaWxkXCI+XG4gICAgICBAaWYgKHRlc3RDYXNlc1N0YXR1cykge1xuICAgICAgPHAgY2xhc3M9XCJwYXNzZWRcIj5cbiAgICAgICAge3sgdHJhbnNsYXRpb25zWydURVNUX1JFU1VMVFMnXVsnUEFTU0VEJ10gKyB0ZXN0Q2FzZXNTdGF0dXNbJ29rJ10gfX1cbiAgICAgIDwvcD5cbiAgICAgIDxwIGNsYXNzPVwiZXJyb3JcIj5cbiAgICAgICAge3sgdHJhbnNsYXRpb25zWydURVNUX1JFU1VMVFMnXVsnRVJST1InXSArIHRlc3RDYXNlc1N0YXR1c1snZXJyb3InXSB9fVxuICAgICAgPC9wPlxuICAgICAgPHA+e3sgdHJhbnNsYXRpb25zWydURVNUX1JFU1VMVFMnXVsnVE9UQUwnXSArIHRlc3RDYXNlc1N0YXR1c1sndG90YWwnXSB9fTwvcD5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|