test: add compliance output tests for output() (#54217)

Adds compliance output tests for `output()` to verify that
we are emitting proper full compilation output, as well as proper
partial compilation output that can be linked to match the full output.

PR Close #54217
This commit is contained in:
Paul Gschwendtner 2024-02-02 14:30:53 +00:00 committed by Jessica Janiuk
parent c05e1042b4
commit 65de61ba0d
9 changed files with 234 additions and 0 deletions

View file

@ -172,3 +172,8 @@ export const viewChild: any = null!;
export const viewChildren: any = null!;
export const contentChild: any = null!;
export const contentChildren: any = null!;
/** Initializer-based output() API. */
export function output<T>(_opts?: {alias?: string}): EventEmitter<T> {
return null!;
}

View file

@ -0,0 +1,114 @@
/****************************************************************************************************
* PARTIAL FILE: output_in_directive.js
****************************************************************************************************/
import { Directive, output } from '@angular/core';
import * as i0 from "@angular/core";
export class TestDir {
constructor() {
this.a = output();
this.b = output({});
this.c = output({ alias: 'cPublic' });
}
}
TestDir.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestDir, deps: [], target: i0.ɵɵFactoryTarget.Directive });
TestDir.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: TestDir, isStandalone: true, outputs: { a: "a", b: "b", c: "cPublic" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestDir, decorators: [{
type: Directive,
args: [{
standalone: true,
}]
}] });
/****************************************************************************************************
* PARTIAL FILE: output_in_directive.d.ts
****************************************************************************************************/
import * as i0 from "@angular/core";
export declare class TestDir {
a: import("@angular/core").EventEmitter<unknown>;
b: import("@angular/core").EventEmitter<string>;
c: import("@angular/core").EventEmitter<void>;
static ɵfac: i0.ɵɵFactoryDeclaration<TestDir, never>;
static ɵdir: i0.ɵɵDirectiveDeclaration<TestDir, never, never, {}, { "a": "a"; "b": "b"; "c": "cPublic"; }, never, never, true, never>;
}
/****************************************************************************************************
* PARTIAL FILE: output_in_component.js
****************************************************************************************************/
import { Component, output } from '@angular/core';
import * as i0 from "@angular/core";
export class TestComp {
constructor() {
this.a = output();
this.b = output({});
this.c = output({ alias: 'cPublic' });
}
}
TestComp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestComp, deps: [], target: i0.ɵɵFactoryTarget.Component });
TestComp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: TestComp, isStandalone: true, selector: "ng-component", outputs: { a: "a", b: "b", c: "cPublic" }, ngImport: i0, template: 'Works', isInline: true });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestComp, decorators: [{
type: Component,
args: [{
standalone: true,
template: 'Works',
}]
}] });
/****************************************************************************************************
* PARTIAL FILE: output_in_component.d.ts
****************************************************************************************************/
import * as i0 from "@angular/core";
export declare class TestComp {
a: import("@angular/core").EventEmitter<unknown>;
b: import("@angular/core").EventEmitter<string>;
c: import("@angular/core").EventEmitter<void>;
static ɵfac: i0.ɵɵFactoryDeclaration<TestComp, never>;
static ɵcmp: i0.ɵɵComponentDeclaration<TestComp, "ng-component", never, {}, { "a": "a"; "b": "b"; "c": "cPublic"; }, never, never, true, never>;
}
/****************************************************************************************************
* PARTIAL FILE: mixed_variants.js
****************************************************************************************************/
import { Directive, EventEmitter, Output, output } from '@angular/core';
import * as i0 from "@angular/core";
export class TestDir {
constructor() {
this.click1 = output();
this.click2 = output();
this._bla = output({ alias: 'decoratorPublicName' });
this.clickDecorator1 = new EventEmitter();
this.clickDecorator2 = new EventEmitter();
this._blaDecorator = new EventEmitter();
}
}
TestDir.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestDir, deps: [], target: i0.ɵɵFactoryTarget.Directive });
TestDir.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: TestDir, isStandalone: true, outputs: { click1: "click1", click2: "click2", _bla: "decoratorPublicName", clickDecorator1: "clickDecorator1", clickDecorator2: "clickDecorator2", _blaDecorator: "decoratorPublicName" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestDir, decorators: [{
type: Directive,
args: [{
standalone: true,
}]
}], propDecorators: { clickDecorator1: [{
type: Output
}], clickDecorator2: [{
type: Output
}], _blaDecorator: [{
type: Output,
args: ['decoratorPublicName']
}] } });
/****************************************************************************************************
* PARTIAL FILE: mixed_variants.d.ts
****************************************************************************************************/
import { EventEmitter } from '@angular/core';
import * as i0 from "@angular/core";
export declare class TestDir {
click1: EventEmitter<unknown>;
click2: EventEmitter<boolean>;
_bla: EventEmitter<void>;
clickDecorator1: EventEmitter<unknown>;
clickDecorator2: EventEmitter<boolean>;
_blaDecorator: EventEmitter<void>;
static ɵfac: i0.ɵɵFactoryDeclaration<TestDir, never>;
static ɵdir: i0.ɵɵDirectiveDeclaration<TestDir, never, never, {}, { "click1": "click1"; "click2": "click2"; "_bla": "decoratorPublicName"; "clickDecorator1": "clickDecorator1"; "clickDecorator2": "clickDecorator2"; "_blaDecorator": "decoratorPublicName"; }, never, never, true, never>;
}

View file

@ -0,0 +1,50 @@
{
"$schema": "../test_case_schema.json",
"cases": [
{
"description": "should generate an output mapping for the directive",
"inputFiles": ["output_in_directive.ts"],
"expectations": [
{
"files": [
{
"expected": "output_in_directive.js",
"generated": "output_in_directive.js"
}
],
"failureMessage": "Incorrect definition"
}
]
},
{
"description": "should generate an output mapping for the component",
"inputFiles": ["output_in_component.ts"],
"expectations": [
{
"files": [
{
"expected": "output_in_component.js",
"generated": "output_in_component.js"
}
],
"failureMessage": "Incorrect definition"
}
]
},
{
"description": "should handle a mix of decorator-based and initializer-based outputs",
"inputFiles": ["mixed_variants.ts"],
"expectations": [
{
"files": [
{
"expected": "mixed_variants.js",
"generated": "mixed_variants.js"
}
],
"failureMessage": "Incorrect output"
}
]
}
]
}

View file

@ -0,0 +1,12 @@
TestDir.ɵdir = /* @__PURE__ */ $r3$.ɵɵdefineDirective({
outputs: {
click1: "click1",
click2: "click2",
_bla: "decoratorPublicName",
clickDecorator1: "clickDecorator1",
clickDecorator2: "clickDecorator2",
_blaDecorator: "decoratorPublicName"
},
});

View file

@ -0,0 +1,14 @@
import {Directive, EventEmitter, Output, output} from '@angular/core';
@Directive({
standalone: true,
})
export class TestDir {
click1 = output();
click2 = output<boolean>();
_bla = output<void>({alias: 'decoratorPublicName'});
@Output() clickDecorator1 = new EventEmitter();
@Output() clickDecorator2 = new EventEmitter<boolean>();
@Output('decoratorPublicName') _blaDecorator = new EventEmitter<void>();
}

View file

@ -0,0 +1,9 @@
TestComp.ɵcmp = /*@__PURE__*/ $r3$.ɵɵdefineComponent({
outputs: {
a: "a",
b: "b",
c: "cPublic"
},
});

View file

@ -0,0 +1,11 @@
import {Component, output} from '@angular/core';
@Component({
standalone: true,
template: 'Works',
})
export class TestComp {
a = output();
b = output<string>({});
c = output<void>({alias: 'cPublic'});
}

View file

@ -0,0 +1,9 @@
TestDir.ɵdir = /*@__PURE__*/ $r3$.ɵɵdefineDirective({
outputs: {
a: "a",
b: "b",
c: "cPublic"
},
});

View file

@ -0,0 +1,10 @@
import {Directive, output} from '@angular/core';
@Directive({
standalone: true,
})
export class TestDir {
a = output();
b = output<string>({});
c = output<void>({alias: 'cPublic'});
}