test(compiler-cli): generate golden files for partial compilation (#39617)
This commit adds a JS script that can generate a partial golden file for test cases in the compiler compliance tests. PR Close #39617
This commit is contained in:
parent
793d66afa5
commit
10525af67b
|
@ -753,11 +753,11 @@ jobs:
|
|||
- setup_win
|
||||
- run:
|
||||
name: Build all windows CI targets
|
||||
command: yarn bazel build --build_tag_filters=-ivy-only //packages/compiler-cli/... //tools/ts-api-guardian/...
|
||||
command: yarn bazel build --build_tag_filters=-ivy-only,-no-windows //packages/compiler-cli/... //tools/ts-api-guardian/...
|
||||
no_output_timeout: 15m
|
||||
- run:
|
||||
name: Test all windows CI targets
|
||||
command: yarn bazel test --test_tag_filters="-ivy-only,-browser:chromium-local" //packages/compiler-cli/... //tools/ts-api-guardian/...
|
||||
command: yarn bazel test --build_tag_filters=-no-windows --test_tag_filters="-ivy-only,-no-windows,-browser:chromium-local" //packages/compiler-cli/... //tools/ts-api-guardian/...
|
||||
no_output_timeout: 15m
|
||||
|
||||
test_ivy_aot_win:
|
||||
|
@ -766,11 +766,11 @@ jobs:
|
|||
- setup_win
|
||||
- run:
|
||||
name: Build all windows CI targets
|
||||
command: yarn bazel build --config=ivy --build_tag_filters=-no-ivy-aot,-fixme-ivy-aot //packages/compiler-cli/... //tools/ts-api-guardian/...
|
||||
command: yarn bazel build --config=ivy --build_tag_filters=-no-ivy-aot,-no-windows,-fixme-ivy-aot //packages/compiler-cli/... //tools/ts-api-guardian/...
|
||||
no_output_timeout: 15m
|
||||
- run:
|
||||
name: Test all windows CI targets
|
||||
command: yarn bazel test --config=ivy --test_tag_filters="-no-ivy-aot,-fixme-ivy-aot,-browser:chromium-local" //packages/compiler-cli/... //tools/ts-api-guardian/...
|
||||
command: yarn bazel test --config=ivy --build_tag_filters=-no-windows --test_tag_filters="-no-ivy-aot,-no-windows,-fixme-ivy-aot,-browser:chromium-local" //packages/compiler-cli/... //tools/ts-api-guardian/...
|
||||
no_output_timeout: 15m
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
load("//tools:defaults.bzl", "ts_library")
|
||||
|
||||
ts_library(
|
||||
name = "generate_golden_partial_lib",
|
||||
testonly = True,
|
||||
srcs = [
|
||||
"cli.ts",
|
||||
"generate_golden_partial.ts",
|
||||
],
|
||||
visibility = ["//packages/compiler-cli/test/compliance:__subpackages__"],
|
||||
deps = [
|
||||
"//packages/compiler-cli/src/ngtsc/file_system",
|
||||
"//packages/compiler-cli/test/compliance/test_helpers",
|
||||
],
|
||||
)
|
||||
|
||||
exports_files([
|
||||
"cli.ts",
|
||||
])
|
|
@ -0,0 +1,10 @@
|
|||
/**
|
||||
* @license
|
||||
* Copyright Google LLC All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by an MIT-style license that can be
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
import {generateGoldenPartial} from './generate_golden_partial';
|
||||
|
||||
generateGoldenPartial(process.argv[2]);
|
|
@ -0,0 +1,59 @@
|
|||
/**
|
||||
* @license
|
||||
* Copyright Google LLC All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by an MIT-style license that can be
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
import {FileSystem} from '../../../src/ngtsc/file_system';
|
||||
import {compileTest, getBuildOutputDirectory, initMockTestFileSystem} from '../test_helpers/compile_test';
|
||||
import {ComplianceTest, getComplianceTests} from '../test_helpers/get_compliance_tests';
|
||||
import {PartiallyCompiledFile, renderGoldenPartial} from '../test_helpers/golden_partials';
|
||||
|
||||
/**
|
||||
* Generate the golden partial output for the tests described in the `testConfigPath` config file.
|
||||
*
|
||||
* @param testConfigPath Path (relative to the `test_cases` directory) of the `TEST_CASES.json` file
|
||||
* that describes the tests.
|
||||
*/
|
||||
export function generateGoldenPartial(testConfigPath: string): void {
|
||||
const files: PartiallyCompiledFile[] = [];
|
||||
const tests = getComplianceTests(testConfigPath);
|
||||
for (const test of tests) {
|
||||
const fs = initMockTestFileSystem(test.realTestPath);
|
||||
for (const file of compilePartials(fs, test)) {
|
||||
files.push(file);
|
||||
}
|
||||
}
|
||||
writeGoldenPartial(files);
|
||||
}
|
||||
|
||||
/**
|
||||
* Partially compile the source files specified by the given `test`.
|
||||
*
|
||||
* @param fs The mock file-system to use when compiling partials.
|
||||
* @param test The information about the test being compiled.
|
||||
*/
|
||||
function* compilePartials(fs: FileSystem, test: ComplianceTest): Generator<PartiallyCompiledFile> {
|
||||
const builtDirectory = getBuildOutputDirectory(fs);
|
||||
for (const generatedPath of compileTest(
|
||||
fs, test.inputFiles, test.compilerOptions,
|
||||
{compilationMode: 'partial', ...test.angularCompilerOptions})) {
|
||||
yield {
|
||||
path: fs.relative(builtDirectory, generatedPath),
|
||||
content: fs.readFile(generatedPath),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Write the partially compiled files to the appropriate output destination.
|
||||
*
|
||||
* For now just push the concatenated partial files to standard out.
|
||||
*
|
||||
* @param files The partially compiled files.
|
||||
*/
|
||||
function writeGoldenPartial(files: PartiallyCompiledFile[]): void {
|
||||
// tslint:disable-next-line: no-console
|
||||
console.log(renderGoldenPartial(files));
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
load("@build_bazel_rules_nodejs//:index.bzl", "generated_file_test", "nodejs_binary", "npm_package_bin")
|
||||
|
||||
def partial_compliance_golden(filePath):
|
||||
"""Creates the generate and testing targets for partial compile results.
|
||||
"""
|
||||
|
||||
# Remove the "TEST_CASES.json" substring from the end of the provided path.
|
||||
path = filePath[:-len("/TEST_CASES.json")]
|
||||
|
||||
nodejs_binary(
|
||||
name = "_generate_%s" % path,
|
||||
testonly = True,
|
||||
data = [
|
||||
"//packages/compiler-cli/test/compliance/partial:generate_golden_partial_lib",
|
||||
"//packages/compiler-cli/test/compliance/test_cases",
|
||||
"//packages/compiler-cli/test/ngtsc/fake_core:npm_package",
|
||||
],
|
||||
visibility = [":__pkg__"],
|
||||
entry_point = "//packages/compiler-cli/test/compliance/partial:cli.ts",
|
||||
templated_args = [
|
||||
# "--node_options=--inspect-brk",
|
||||
filePath,
|
||||
],
|
||||
)
|
||||
|
||||
npm_package_bin(
|
||||
name = "_generated_%s" % path,
|
||||
tool = "_generate_%s" % path,
|
||||
testonly = True,
|
||||
stdout = "%s/this_file_should_not_be_committed" % path,
|
||||
link_workspace_root = True,
|
||||
tags = [
|
||||
# TODO(josephperrott): Begin running these tests on windows after updating to rules_nodejs 3.0
|
||||
"no-windows",
|
||||
],
|
||||
visibility = [":__pkg__"],
|
||||
data = [
|
||||
"//packages/compiler-cli/test/compliance/partial:generate_golden_partial_lib",
|
||||
"//packages/compiler-cli/test/compliance/test_cases",
|
||||
"//packages/compiler-cli/test/ngtsc/fake_core:npm_package",
|
||||
],
|
||||
)
|
||||
|
||||
generated_file_test(
|
||||
visibility = ["//visibility:public"],
|
||||
tags = [
|
||||
"ivy-only",
|
||||
# TODO(josephperrott): Begin running these tests on windows after updating to rules_nodejs 3.0
|
||||
"no-windows",
|
||||
],
|
||||
name = "%s.golden" % path,
|
||||
src = "//packages/compiler-cli/test/compliance/test_cases:%s/GOLDEN_PARTIAL.js" % path,
|
||||
generated = "_generated_%s" % path,
|
||||
)
|
|
@ -1,4 +1,5 @@
|
|||
load("@build_bazel_rules_nodejs//:index.bzl", "copy_to_bin")
|
||||
load("//packages/compiler-cli/test/compliance/partial:partial_compliance_goldens.bzl", "partial_compliance_golden")
|
||||
|
||||
package(default_visibility = ["//packages/compiler-cli/test/compliance:__subpackages__"])
|
||||
|
||||
|
@ -9,3 +10,5 @@ copy_to_bin(
|
|||
name = "test_cases",
|
||||
srcs = glob(["*/**"]),
|
||||
)
|
||||
|
||||
[partial_compliance_golden(filePath = path) for path in glob(include = ["**/TEST_CASES.json"])]
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
/**
|
||||
* @license
|
||||
* Copyright Google LLC All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by an MIT-style license that can be
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
const headerStart =
|
||||
'/****************************************************************************************************\n' +
|
||||
' * PARTIAL FILE: ';
|
||||
|
||||
const headerEnd =
|
||||
'\n ****************************************************************************************************/';
|
||||
|
||||
/**
|
||||
* Render the partially compiled files into a single golden partial output string.
|
||||
*
|
||||
* @param files The partially compiled files to be rendered.
|
||||
*/
|
||||
export function renderGoldenPartial(files: PartiallyCompiledFile[]): string {
|
||||
return files.map(file => `${headerStart + file.path + headerEnd}\n${file.content}`).join('\n');
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the `partialContent` into a set of partially compiled files.
|
||||
*
|
||||
* The `partialContent` is a single string that can contains multiple files.
|
||||
* Each file is delimited by a header comment that also contains its original path.
|
||||
*
|
||||
* @param partialContent The partial content to parse.
|
||||
*/
|
||||
export function parseGoldenPartial(partialContent: string): PartiallyCompiledFile[] {
|
||||
const files: PartiallyCompiledFile[] = [];
|
||||
const partials = partialContent.split(headerStart);
|
||||
for (const partial of partials) {
|
||||
const [path, content] = partial.split(headerEnd);
|
||||
files.push({path, content});
|
||||
}
|
||||
return files;
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents the path and contents of a partially compiled file.
|
||||
*/
|
||||
export interface PartiallyCompiledFile {
|
||||
path: string;
|
||||
content: string;
|
||||
}
|
Loading…
Reference in New Issue