Revert "build: switch example e2e tests to bazel (#28402)" (#28438)

This reverts commit ef78e335604de8352d2fb5bd3a131eca08d3d405.

PR Close #28438
This commit is contained in:
Jason Aden 2019-01-29 15:39:00 -08:00
parent cbed4851a3
commit ea2a3f8335
103 changed files with 415 additions and 897 deletions

View File

@ -397,6 +397,7 @@ jobs:
- *define_env_vars
- *yarn_install
- run: yarn tsc -p packages
- run: yarn tsc -p packages/examples
- run: yarn tsc -p modules
- run: yarn karma start ./karma-js.conf.js --single-run --browsers=ChromeNoSandbox
@ -423,6 +424,7 @@ jobs:
command: ./scripts/saucelabs/start-tunnel.sh
background: true
- run: yarn tsc -p packages
- run: yarn tsc -p packages/examples
- run: yarn tsc -p modules
# Waits for the Saucelabs tunnel to be ready. This ensures that we don't run tests
# too early without Saucelabs not being ready.
@ -450,9 +452,10 @@ jobs:
- run: ./scripts/build-e2e-tests.sh --use-existing-packages-dist
- run:
name: Starting servers for e2e tests
command: yarn gulp serve
command: yarn gulp serve serve-examples
background: true
- run: NODE_PATH=$NODE_PATH:./dist/all yarn protractor ./protractor-e2e.conf.js --bundles=true
- run: NODE_PATH=$NODE_PATH:./dist/all yarn protractor ./protractor-examples-e2e.conf.js --bundles=true
- run: NODE_PATH=$NODE_PATH:./dist/all yarn protractor ./protractor-perf.conf.js --bundles=true --dryrun
legacy-misc-tests:

View File

@ -39,6 +39,7 @@ gulp.task('source-map-test', loadTask('source-map-test'));
gulp.task('tools:build', loadTask('tools-build'));
gulp.task('check-cycle', loadTask('check-cycle'));
gulp.task('serve', loadTask('serve', 'default'));
gulp.task('serve-examples', loadTask('serve', 'examples'));
gulp.task('changelog', loadTask('changelog'));
gulp.task('check-env', () => {/* this is a noop because the env test ran already above */});
gulp.task('cldr:extract', loadTask('cldr', 'extract'));

View File

@ -38,14 +38,12 @@
"@bazel/karma": "~0.22.1",
"@bazel/typescript": "~0.22.1",
"@schematics/angular": "^7.0.4",
"@types/angular": "^1.6.47",
"@types/chokidar": "1.7.3",
"@types/convert-source-map": "^1.5.1",
"@types/diff": "^3.2.2",
"@types/fs-extra": "4.0.2",
"@types/hammerjs": "2.0.35",
"@types/jasmine": "^2.8.8",
"@types/jasminewd2": "^2.0.6",
"@types/mock-fs": "^3.6.30",
"@types/node": "^10.9.4",
"@types/selenium-webdriver": "3.0.7",
@ -100,7 +98,9 @@
"@bazel/bazel": "~0.22.0",
"@bazel/buildifier": "^0.19.2",
"@bazel/ibazel": "~0.9.0",
"@types/angular": "^1.6.47",
"@types/base64-js": "1.2.5",
"@types/jasminewd2": "^2.0.4",
"@types/minimist": "^1.2.0",
"@types/systemjs": "0.19.32",
"browserstacktunnel-wrapper": "2.0.1",

View File

@ -1,4 +0,0 @@
exports_files([
"index.html",
"tsconfig-e2e.json",
])

View File

@ -7,15 +7,28 @@ behavior) just like an Angular application developer would write.
# Running the examples
```
# Serving individual examples (e.g. common)
yarn bazel run //packages/examples/common:devserver
# # execute the following command only when framework code changes
./build.sh
# "core" examples
yarn bazel run //packages/examples/core:devserver
# run when test change
./packages/examples/build.sh
# start server
$(npm bin)/gulp serve-examples
```
navigate to [http://localhost:8001](http://localhost:8001)
# Running the tests
```
yarn bazel test //packages/examples/...
```
# run only when framework code changes
./build.sh
# run to compile tests and run them
./packages/examples/test.sh
```
NOTE: sometimes the http server does not exit properly and it retains the `8001` port.
in such a case you can use `lsof -i:8001` to see which process it is and then use `kill`
to remove it. (Or in single command: `lsof -i:8001 -t | xargs kill`)

View File

@ -0,0 +1,21 @@
/**
* @license
* Copyright Google Inc. 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
*/
(function(global: any) {
writeScriptTag('/vendor/zone.js');
writeScriptTag('/vendor/task-tracking.js');
writeScriptTag('/vendor/system.js');
writeScriptTag('/vendor/Reflect.js');
writeScriptTag('/_common/system-config.js');
if (location.pathname.indexOf('/upgrade/') != -1) {
writeScriptTag('/vendor/angular.js');
}
function writeScriptTag(scriptUrl: string, onload: string = '') {
document.write('<script src="' + scriptUrl + '" onload="' + onload + '"></script>');
}
}(window));

View File

@ -0,0 +1,26 @@
/**
* @license
* Copyright Google Inc. 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
*/
/* tslint:disable:no-console */
import * as webdriver from 'selenium-webdriver';
declare var browser: any;
declare var expect: any;
// TODO (juliemr): remove this method once this becomes a protractor plugin
export function verifyNoBrowserErrors() {
browser.manage().logs().get('browser').then(function(browserLog: any[]) {
const errors: any[] = [];
browserLog.filter(logEntry => {
const msg = logEntry.message;
console.log('>> ' + msg);
if (logEntry.level.value >= webdriver.logging.Level.INFO.value) {
errors.push(msg);
}
});
expect(errors).toEqual([]);
});
}

View File

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<head>
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" />
<script type="text/javascript" src="bootstrap.js"></script>
<script type="text/javascript">
System.import('main-dynamic').catch(console.error.bind(console));
</script>
</head>
<body>
<example-app>
loading...
</example-app>
</body>
</html>

View File

@ -5,8 +5,9 @@
* 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 {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {TestsAppModuleNgFactory} from './test_module.ngfactory';
import * as mod from './module';
platformBrowserDynamic().bootstrapModuleFactory(TestsAppModuleNgFactory);
if (mod.AppModule) {
platformBrowserDynamic().bootstrapModule(mod.AppModule);
}

19
packages/examples/_common/module.d.ts vendored Normal file
View File

@ -0,0 +1,19 @@
/**
* @license
* Copyright Google Inc. 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
*/
/*
DO NOT DELETE THIS FILE
=======================
The purpose of this file is to allow `main-dynamic.ts` to be tsc-compiled
BEFORE it is copied over to each of the associated example directories
within `dist/examples`.
*/
export class AppModule {};

View File

@ -0,0 +1,36 @@
/**
* @license
* Copyright Google Inc. 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
*/
System.config({
defaultJSExtensions: true,
map: {
'@angular/common': '/vendor/@angular/common/bundles/common.umd.js',
'@angular/compiler': '/vendor/@angular/compiler/bundles/compiler.umd.js',
'@angular/animations': '/vendor/@angular/animations/bundles/animations.umd.js',
'@angular/animations/browser': '/vendor/@angular/animations/bundles/animations-browser.umd.js',
'@angular/platform-browser/animations':
'/vendor/@angular/platform-browser/bundles/platform-browser-animations.umd.js',
'@angular/core': '/vendor/@angular/core/bundles/core.umd.js',
'@angular/forms': '/vendor/@angular/forms/bundles/forms.umd.js',
'@angular/http': '/vendor/@angular/forms/bundles/http.umd.js',
'@angular/platform-browser':
'/vendor/@angular/platform-browser/bundles/platform-browser.umd.js',
'@angular/platform-browser-dynamic':
'/vendor/@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
'@angular/router': '/vendor/@angular/router/bundles/router.umd.js',
'@angular/upgrade': '/vendor/@angular/upgrade/bundles/upgrade.umd.js',
'@angular/upgrade/static': '/vendor/@angular/upgrade/bundles/upgrade-static.umd.js',
'rxjs': '/vendor/rxjs'
},
packages: {
'rxjs/ajax': {main: 'index.js', defaultExtension: 'js'},
'rxjs/operators': {main: 'index.js', defaultExtension: 'js'},
'rxjs/testing': {main: 'index.js', defaultExtension: 'js'},
'rxjs/websocket': {main: 'index.js', defaultExtension: 'js'},
'rxjs': {main: 'index.js', defaultExtension: 'js'},
},
});

44
packages/examples/build.sh Executable file
View File

@ -0,0 +1,44 @@
#!/usr/bin/env bash
set -u -e -o pipefail
#
# This script is used to compile and copy the contents for each of
# example directories over to the dist/examples directory so that they
# can be tested with karma and protractor. The `gulp serve-examples` command
# can be used to run each of the examples in isolation via http as well.
#
(
cd `dirname $0`
DIST="../../dist/examples";
rm -rf -- $DIST
$(npm bin)/tsc -p ./tsconfig-build.json --importHelpers false
mkdir $DIST/vendor/
ln -s ../../../dist/packages-dist/ $DIST/vendor/@angular
for FILE in \
../../../node_modules/angular/angular.js \
../../../node_modules/zone.js/dist/zone.js \
../../../node_modules/zone.js/dist/task-tracking.js \
../../../node_modules/systemjs/dist/system.js \
../../../node_modules/reflect-metadata/Reflect.js \
../../../node_modules/rxjs
do
ln -s $FILE $DIST/vendor/`basename $FILE`
done
for MODULE in `find . -name module.ts`; do
FINAL_DIR_PATH=$DIST/`dirname $MODULE`
echo "==== $MODULE"
cp _common/*.html $FINAL_DIR_PATH
cp $DIST/_common/*.js $FINAL_DIR_PATH
cp $DIST/_common/*.js.map $FINAL_DIR_PATH
find `dirname $MODULE` -name \*.css -exec cp {} $FINAL_DIR_PATH \;
done
)

View File

@ -1,63 +0,0 @@
package(default_visibility = ["//visibility:public"])
load("//packages/bazel:index.bzl", "protractor_web_test_suite")
load("//tools:defaults.bzl", "ng_module", "ts_library")
load("@build_bazel_rules_typescript//:defs.bzl", "ts_devserver")
ng_module(
name = "common_examples",
srcs = glob(
["**/*.ts"],
exclude = ["**/*_spec.ts"],
),
# TODO: FW-1004 Type checking is currently not complete.
type_check = False,
deps = [
"//packages/common",
"//packages/core",
"//packages/platform-browser",
"//packages/platform-browser-dynamic",
"//packages/router",
"@rxjs",
],
)
ts_library(
name = "common_tests_lib",
testonly = True,
srcs = glob(["**/*_spec.ts"]),
tsconfig = "//packages/examples:tsconfig-e2e.json",
deps = [
"//packages/examples/test-utils",
"//packages/private/testing",
"@ngdeps//@types/jasminewd2",
"@ngdeps//protractor",
],
)
ts_devserver(
name = "devserver",
entry_module = "@angular/examples/common/main",
index_html = "//packages/examples:index.html",
port = 4200,
scripts = ["@ngdeps//node_modules/tslib:tslib.js"],
static_files = [
"@ngdeps//node_modules/zone.js:dist/zone.js",
# This is needed because the "ngComponentOutlet" test uses the JIT compiler
# and needs to be able to read metadata at runtime.
"@ngdeps//node_modules/reflect-metadata:Reflect.js",
],
deps = [":common_examples"],
)
protractor_web_test_suite(
name = "protractor_tests",
data = ["//packages/bazel/src/protractor/utils"],
on_prepare = ":start-server.js",
server = ":devserver",
deps = [
":common_tests_lib",
"@ngdeps//protractor",
"@ngdeps//selenium-webdriver",
],
)

View File

@ -8,7 +8,7 @@
import {$, browser, by, element, protractor} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../_common/e2e_util';
function waitForElement(selector: string) {
@ -21,9 +21,10 @@ describe('Location', () => {
afterEach(verifyNoBrowserErrors);
it('should verify paths', () => {
browser.get('/location/#/bar/baz');
browser.get('/common/location/ts/#/bar/baz');
waitForElement('hash-location');
expect(element.all(by.css('path-location code')).get(0).getText()).toEqual('/location');
expect(element.all(by.css('path-location code')).get(0).getText())
.toEqual('/common/location/ts');
expect(element.all(by.css('hash-location code')).get(0).getText()).toEqual('/bar/baz');
});
});

View File

@ -17,13 +17,14 @@ import {PathLocationComponent} from './path_location_component';
selector: 'example-app',
template: `<hash-location></hash-location><path-location></path-location>`
})
export class AppComponent {
export class ExampleAppComponent {
}
@NgModule({
declarations: [AppComponent, PathLocationComponent, HashLocationComponent],
declarations: [ExampleAppComponent, PathLocationComponent, HashLocationComponent],
providers: [{provide: APP_BASE_HREF, useValue: '/'}],
imports: [BrowserModule],
bootstrap: [ExampleAppComponent]
})
export class AppModule {
}

View File

@ -1,12 +0,0 @@
/**
* @license
* Copyright Google Inc. 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 {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {TestsAppModuleNgFactory} from './test_module.ngfactory';
platformBrowserDynamic().bootstrapModuleFactory(TestsAppModuleNgFactory);

View File

@ -7,8 +7,7 @@
*/
import {$, ExpectedConditions, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../_common/e2e_util';
function waitForElement(selector: string) {
const EC = ExpectedConditions;

View File

@ -7,22 +7,21 @@
*/
import {CommonModule} from '@angular/common';
import {COMPILER_OPTIONS, Compiler, CompilerFactory, Component, Injectable, Injector, NgModule, NgModuleFactory} from '@angular/core';
import {Compiler, Component, Injectable, Injector, NgModule, NgModuleFactory} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {JitCompilerFactory} from '@angular/platform-browser-dynamic';
// #docregion SimpleExample
@Component({selector: 'hello-world', template: 'Hello World!'})
export class HelloWorld {
class HelloWorld {
}
@Component({
selector: 'ng-component-outlet-simple-example',
template: `<ng-container *ngComponentOutlet="HelloWorld"></ng-container>`
})
export class NgTemplateOutletSimpleExample {
class NgTemplateOutletSimpleExample {
// This field is necessary to expose HelloWorld to the template.
HelloWorld = HelloWorld;
}
@ -30,7 +29,7 @@ export class NgTemplateOutletSimpleExample {
// #docregion CompleteExample
@Injectable()
export class Greeter {
class Greeter {
suffix = '!';
}
@ -38,7 +37,7 @@ export class Greeter {
selector: 'complete-component',
template: `Complete: <ng-content></ng-content> <ng-content></ng-content>{{ greeter.suffix }}`
})
export class CompleteComponent {
class CompleteComponent {
constructor(public greeter: Greeter) {}
}
@ -49,7 +48,7 @@ export class CompleteComponent {
injector: myInjector;
content: myContent"></ng-container>`
})
export class NgTemplateOutletCompleteExample {
class NgTemplateOutletCompleteExample {
// This field is necessary to expose CompleteComponent to the template.
CompleteComponent = CompleteComponent;
myInjector: Injector;
@ -65,7 +64,7 @@ export class NgTemplateOutletCompleteExample {
// #docregion NgModuleFactoryExample
@Component({selector: 'other-module-component', template: `Other Module Component!`})
export class OtherModuleComponent {
class OtherModuleComponent {
}
@Component({
@ -74,7 +73,7 @@ export class OtherModuleComponent {
<ng-container *ngComponentOutlet="OtherModuleComponent;
ngModuleFactory: myModule;"></ng-container>`
})
export class NgTemplateOutletOtherModuleExample {
class NgTemplateOutletOtherModuleExample {
// This field is necessary to expose OtherModuleComponent to the template.
OtherModuleComponent = OtherModuleComponent;
myModule: NgModuleFactory<any>;
@ -92,7 +91,19 @@ export class NgTemplateOutletOtherModuleExample {
<hr/>
<ng-component-outlet-other-module-example></ng-component-outlet-other-module-example>`
})
export class AppComponent {
class ExampleApp {
}
@NgModule({
imports: [BrowserModule],
declarations: [
ExampleApp, NgTemplateOutletSimpleExample, NgTemplateOutletCompleteExample,
NgTemplateOutletOtherModuleExample, HelloWorld, CompleteComponent
],
entryComponents: [HelloWorld, CompleteComponent],
bootstrap: [ExampleApp]
})
export class AppModule {
}
@NgModule({
@ -102,26 +113,3 @@ export class AppComponent {
})
export class OtherModule {
}
export function createCompiler(compilerFactory: CompilerFactory) {
return compilerFactory.createCompiler();
}
@NgModule({
imports: [BrowserModule],
declarations: [
AppComponent, NgTemplateOutletSimpleExample, NgTemplateOutletCompleteExample,
NgTemplateOutletOtherModuleExample, HelloWorld, CompleteComponent
],
entryComponents: [HelloWorld, CompleteComponent],
providers: [
// Setup the JIT compiler that is not set up by default because the examples
// are bootstrapped using their NgModule factory. Since this example uses the
// JIT compiler, we manually set it up for this module.
{provide: COMPILER_OPTIONS, useValue: {}, multi: true},
{provide: CompilerFactory, useClass: JitCompilerFactory, deps: [COMPILER_OPTIONS]},
{provide: Compiler, useFactory: createCompiler, deps: [CompilerFactory]}
]
})
export class AppModule {
}

View File

@ -7,7 +7,7 @@
*/
import {$, ExpectedConditions, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../_common/e2e_util';
function waitForElement(selector: string) {
const EC = ExpectedConditions;
@ -16,7 +16,7 @@ function waitForElement(selector: string) {
}
describe('ngIf', () => {
const URL = '/ngIf';
const URL = 'common/ngIf/ts/';
afterEach(verifyNoBrowserErrors);
describe('ng-if-simple', () => {

View File

@ -21,7 +21,7 @@ import {Subject} from 'rxjs';
<div *ngIf="show">Text to show</div>
`
})
export class NgIfSimple {
class NgIfSimple {
show: boolean = true;
}
// #enddocregion
@ -37,7 +37,7 @@ export class NgIfSimple {
<ng-template #elseBlock>Alternate text while primary text is hidden</ng-template>
`
})
export class NgIfElse {
class NgIfElse {
show: boolean = true;
}
// #enddocregion
@ -56,7 +56,7 @@ export class NgIfElse {
<ng-template #elseBlock>Alternate text while primary text is hidden</ng-template>
`
})
export class NgIfThenElse implements OnInit {
class NgIfThenElse implements OnInit {
thenBlock: TemplateRef<any>|null = null;
show: boolean = true;
@ -85,7 +85,7 @@ export class NgIfThenElse implements OnInit {
<ng-template #loading let-user>Waiting... (user is {{user|json}})</ng-template>
`
})
export class NgIfAs {
class NgIfAs {
userObservable = new Subject<{first: string, last: string}>();
first = ['John', 'Mike', 'Mary', 'Bob'];
firstIndex = 0;
@ -116,12 +116,13 @@ export class NgIfAs {
<hr>
`
})
export class AppComponent {
class ExampleApp {
}
@NgModule({
imports: [BrowserModule],
declarations: [AppComponent, NgIfSimple, NgIfElse, NgIfThenElse, NgIfAs],
declarations: [ExampleApp, NgIfSimple, NgIfElse, NgIfThenElse, NgIfAs],
bootstrap: [ExampleApp]
})
export class AppModule {
}

View File

@ -7,7 +7,7 @@
*/
import {$, ExpectedConditions, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../_common/e2e_util';
function waitForElement(selector: string) {
const EC = ExpectedConditions;
@ -16,7 +16,7 @@ function waitForElement(selector: string) {
}
describe('ngTemplateOutlet', () => {
const URL = '/ngTemplateOutlet';
const URL = 'common/ngTemplateOutlet/ts/';
afterEach(verifyNoBrowserErrors);
describe('ng-template-outlet-example', () => {

View File

@ -26,7 +26,7 @@ import {BrowserModule} from '@angular/platform-browser';
<ng-template #svk let-person="localSk"><span>Ahoj {{person}}!</span></ng-template>
`
})
export class NgTemplateOutletExample {
class NgTemplateOutletExample {
myContext = {$implicit: 'World', localSk: 'Svet'};
}
// #enddocregion
@ -36,12 +36,13 @@ export class NgTemplateOutletExample {
selector: 'example-app',
template: `<ng-template-outlet-example></ng-template-outlet-example>`
})
export class AppComponent {
class ExampleApp {
}
@NgModule({
imports: [BrowserModule],
declarations: [AppComponent, NgTemplateOutletExample],
declarations: [ExampleApp, NgTemplateOutletExample],
bootstrap: [ExampleApp]
})
export class AppModule {
}

View File

@ -58,7 +58,7 @@ export class AsyncObservablePipeComponent {
// protractor will not see us. Also we want to have this outside the docregion so as not to confuse
// the reader.
function setInterval(fn: Function, delay: number) {
const zone = (window as any)['Zone'].current;
const zone = Zone.current;
let rootZone = zone;
while (rootZone.parent) {
rootZone = rootZone.parent;

View File

@ -7,7 +7,7 @@
*/
import {$, ExpectedConditions, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../_common/e2e_util';
function waitForElement(selector: string) {
const EC = ExpectedConditions;
@ -17,7 +17,7 @@ function waitForElement(selector: string) {
describe('pipe', () => {
afterEach(verifyNoBrowserErrors);
const URL = '/pipes';
const URL = '/common/pipes/ts/';
describe('async', () => {
it('should resolve and display promise', () => {

View File

@ -59,19 +59,19 @@ import {TitleCasePipeComponent} from './titlecase_pipe';
<keyvalue-pipe></keyvalue-pipe>
`
})
export class AppComponent {
export class ExampleAppComponent {
}
@NgModule({
declarations: [
AsyncPromisePipeComponent, AsyncObservablePipeComponent, AppComponent, JsonPipeComponent,
AsyncPromisePipeComponent, AsyncObservablePipeComponent, ExampleAppComponent, JsonPipeComponent,
DatePipeComponent, DeprecatedDatePipeComponent, LowerUpperPipeComponent, TitleCasePipeComponent,
NumberPipeComponent, DeprecatedNumberPipeComponent, PercentPipeComponent,
DeprecatedPercentPipeComponent, CurrencyPipeComponent, DeprecatedCurrencyPipeComponent,
SlicePipeStringComponent, SlicePipeListComponent, I18nPluralPipeComponent,
I18nSelectPipeComponent, KeyValuePipeComponent
NumberPipeComponent, PercentPipeComponent, DeprecatedPercentPipeComponent,
CurrencyPipeComponent, DeprecatedCurrencyPipeComponent, SlicePipeStringComponent,
SlicePipeListComponent, I18nPluralPipeComponent, I18nSelectPipeComponent, KeyValuePipeComponent
],
imports: [BrowserModule],
bootstrap: [ExampleAppComponent]
})
export class AppModule {
}

View File

@ -1,17 +0,0 @@
/**
* @license
* Copyright Google Inc. 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 protractorUtils = require('@angular/bazel/protractor-utils');
const protractor = require('protractor');
module.exports = async function(config) {
const {port} = await protractorUtils.runServer(config.workspace, config.server, '-port', []);
const serverUrl = `http://localhost:${port}`;
protractor.browser.baseUrl = serverUrl;
};

View File

@ -1,41 +0,0 @@
/**
* @license
* Copyright Google Inc. 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 {Component, NgModule} from '@angular/core';
import {RouterModule} from '@angular/router';
import * as locationExample from './location/ts/module';
import * as ngComponentOutletExample from './ngComponentOutlet/ts/module';
import * as ngIfExample from './ngIf/ts/module';
import * as ngTemplateOutletExample from './ngTemplateOutlet/ts/module';
import * as pipesExample from './pipes/ts/module';
@Component({selector: 'example-app', template: '<router-outlet></router-outlet>'})
export class TestsAppComponent {
}
@NgModule({
imports: [
locationExample.AppModule, ngComponentOutletExample.AppModule, ngIfExample.AppModule,
ngTemplateOutletExample.AppModule, pipesExample.AppModule,
// Router configuration so that the individual e2e tests can load their
// app components.
RouterModule.forRoot([
{path: 'location', component: locationExample.AppComponent},
{path: 'ngComponentOutlet', component: ngComponentOutletExample.AppComponent},
{path: 'ngIf', component: ngIfExample.AppComponent},
{path: 'ngTemplateOutlet', component: ngTemplateOutletExample.AppComponent},
{path: 'pipes', component: pipesExample.AppComponent},
])
],
declarations: [TestsAppComponent],
bootstrap: [TestsAppComponent]
})
export class TestsAppModule {
}

View File

@ -1,13 +0,0 @@
package(default_visibility = ["//visibility:public"])
load("//tools:defaults.bzl", "ng_module")
ng_module(
name = "compiler_examples",
srcs = glob(["**/*.ts"]),
deps = [
"//packages/core",
"//packages/platform-browser",
"//packages/platform-browser-dynamic",
],
)

View File

@ -7,13 +7,11 @@
*/
import {UrlResolver} from '@angular/compiler';
import {Component, NgModule} from '@angular/core';
import {NgModule} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
@Component({selector: 'my-app', template: 'empty'})
class MyApp {
}
let MyApp: any;
// #docregion url_resolver
class MyUrlResolver extends UrlResolver {

View File

@ -1,63 +0,0 @@
package(default_visibility = ["//visibility:public"])
load("//packages/bazel:index.bzl", "protractor_web_test_suite")
load("//tools:defaults.bzl", "ng_module", "ts_library")
load("@build_bazel_rules_typescript//:defs.bzl", "ts_devserver")
ng_module(
name = "core_examples",
srcs = glob(
["**/*.ts"],
exclude = [
"**/*_spec.ts",
"**/*_howto.ts",
],
),
# TODO: FW-1004 Type checking is currently not complete.
type_check = False,
deps = [
"//packages/animations",
"//packages/core",
"//packages/platform-browser",
"//packages/platform-browser-dynamic",
"//packages/platform-browser/animations",
"//packages/router",
],
)
ts_library(
name = "core_e2e_tests_lib",
testonly = True,
srcs = glob(["**/e2e_test/*_spec.ts"]),
tsconfig = "//packages/examples:tsconfig-e2e.json",
deps = [
"//packages/examples/test-utils",
"@ngdeps//@types/jasminewd2",
"@ngdeps//protractor",
],
)
ts_devserver(
name = "devserver",
entry_module = "@angular/examples/core/main",
index_html = "//packages/examples:index.html",
port = 4200,
scripts = ["@ngdeps//node_modules/tslib:tslib.js"],
static_files = [
"@ngdeps//node_modules/zone.js:dist/zone.js",
"@ngdeps//node_modules/zone.js:dist/task-tracking.js",
],
deps = [":core_examples"],
)
protractor_web_test_suite(
name = "protractor_tests",
data = ["//packages/bazel/src/protractor/utils"],
on_prepare = ":start-server.js",
server = ":devserver",
deps = [
":core_e2e_tests_lib",
"@ngdeps//protractor",
"@ngdeps//selenium-webdriver",
],
)

View File

@ -7,7 +7,7 @@
*/
import {$, ExpectedConditions, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../../_common/e2e_util';
function waitForElement(selector: string) {
const EC = ExpectedConditions;
@ -19,7 +19,7 @@ describe('animation example', () => {
afterEach(verifyNoBrowserErrors);
describe('index view', () => {
const URL = '/animation/dsl/';
const URL = '/core/animation/ts/dsl/';
it('should list out the current collection of items', () => {
browser.get(URL);

View File

@ -5,5 +5,4 @@
* 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
*/
export {AppModule, MyExpandoCmp as AppComponent} from './animation_example';
export {AppModule} from './animation_example';

View File

@ -7,7 +7,7 @@
*/
import {ElementFinder, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../../_common/e2e_util';
describe('contentChild example', () => {
afterEach(verifyNoBrowserErrors);
@ -15,7 +15,7 @@ describe('contentChild example', () => {
let result: ElementFinder;
beforeEach(() => {
browser.get('/di/contentChild');
browser.get('/core/di/ts/contentChild/index.html');
button = element(by.css('button'));
result = element(by.css('div'));
});

View File

@ -17,5 +17,3 @@ import {ContentChildComp, Pane, Tab} from './content_child_example';
})
export class AppModule {
}
export {ContentChildComp as AppComponent};

View File

@ -7,7 +7,7 @@
*/
import {ElementFinder, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../../_common/e2e_util';
describe('contentChildren example', () => {
afterEach(verifyNoBrowserErrors);
@ -16,7 +16,7 @@ describe('contentChildren example', () => {
let resultNested: ElementFinder;
beforeEach(() => {
browser.get('/di/contentChildren');
browser.get('/core/di/ts/contentChildren/index.html');
button = element(by.css('button'));
resultTopLevel = element(by.css('.top-level'));
resultNested = element(by.css('.nested'));

View File

@ -17,5 +17,3 @@ import {ContentChildrenComp, Pane, Tab} from './content_children_example';
})
export class AppModule {
}
export {ContentChildrenComp as AppComponent};

View File

@ -7,7 +7,7 @@
*/
import {ElementFinder, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../../_common/e2e_util';
describe('viewChild example', () => {
afterEach(verifyNoBrowserErrors);
@ -15,7 +15,7 @@ describe('viewChild example', () => {
let result: ElementFinder;
beforeEach(() => {
browser.get('/di/viewChild');
browser.get('/core/di/ts/viewChild/index.html');
button = element(by.css('button'));
result = element(by.css('div'));
});

View File

@ -15,5 +15,3 @@ import {Pane, ViewChildComp} from './view_child_example';
{imports: [BrowserModule], declarations: [ViewChildComp, Pane], bootstrap: [ViewChildComp]})
export class AppModule {
}
export {ViewChildComp as AppComponent};

View File

@ -8,7 +8,7 @@
import {ElementFinder, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../../_common/e2e_util';
describe('viewChildren example', () => {
afterEach(verifyNoBrowserErrors);
@ -16,7 +16,7 @@ describe('viewChildren example', () => {
let result: ElementFinder;
beforeEach(() => {
browser.get('/di/viewChildren');
browser.get('/core/di/ts/viewChildren/index.html');
button = element(by.css('button'));
result = element(by.css('div'));
});

View File

@ -18,5 +18,3 @@ import {Pane, ViewChildrenComp} from './view_children_example';
})
export class AppModule {
}
export {ViewChildrenComp as AppComponent};

View File

@ -1,17 +0,0 @@
/**
* @license
* Copyright Google Inc. 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 protractorUtils = require('@angular/bazel/protractor-utils');
const protractor = require('protractor');
module.exports = async function(config) {
const {port} = await protractorUtils.runServer(config.workspace, config.server, '-port', []);
const serverUrl = `http://localhost:${port}`;
protractor.browser.baseUrl = serverUrl;
};

View File

@ -1,44 +0,0 @@
/**
* @license
* Copyright Google Inc. 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 {Component, NgModule} from '@angular/core';
import {RouterModule} from '@angular/router';
import * as animationDslExample from './animation/ts/dsl/module';
import * as diContentChildExample from './di/ts/contentChild/module';
import * as diContentChildrenExample from './di/ts/contentChildren/module';
import * as diViewChildExample from './di/ts/viewChild/module';
import * as diViewChildrenExample from './di/ts/viewChildren/module';
import * as testabilityWhenStableExample from './testability/ts/whenStable/module';
@Component({selector: 'example-app', template: '<router-outlet></router-outlet>'})
export class TestsAppComponent {
}
@NgModule({
imports: [
animationDslExample.AppModule, diContentChildExample.AppModule,
diContentChildrenExample.AppModule, diViewChildExample.AppModule,
diViewChildrenExample.AppModule, testabilityWhenStableExample.AppModule,
// Router configuration so that the individual e2e tests can load their
// app components.
RouterModule.forRoot([
{path: 'animation/dsl', component: animationDslExample.AppComponent},
{path: 'di/contentChild', component: diContentChildExample.AppComponent},
{path: 'di/contentChildren', component: diContentChildrenExample.AppComponent},
{path: 'di/viewChild', component: diViewChildExample.AppComponent},
{path: 'di/viewChildren', component: diViewChildrenExample.AppComponent},
{path: 'testability/whenStable', component: testabilityWhenStableExample.AppComponent},
])
],
declarations: [TestsAppComponent],
bootstrap: [TestsAppComponent]
})
export class TestsAppModule {
}

View File

@ -7,19 +7,13 @@
*/
import {browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../../test-utils';
// Declare the global "window" and "document" constant since we don't want to add the "dom"
// TypeScript lib for the e2e specs that execute code in the browser and reference such
// global constants.
declare const window: any;
declare const document: any;
import {verifyNoBrowserErrors} from '../../../../../_common/e2e_util';
describe('testability example', () => {
afterEach(verifyNoBrowserErrors);
describe('using task tracking', () => {
const URL = '/testability/whenStable/';
const URL = '/core/testability/ts/whenStable/';
it('times out with a list of tasks', done => {
browser.get(URL);
@ -28,7 +22,7 @@ describe('testability example', () => {
// Script that runs in the browser and calls whenStable with a timeout.
let waitWithResultScript = function(done: any) {
let rootEl = document.querySelector('example-app');
let testability = window.getAngularTestability(rootEl);
let testability = (window as any).getAngularTestability(rootEl);
testability.whenStable((didWork: boolean, tasks: any) => { done(tasks); }, 1000);
};

View File

@ -5,4 +5,4 @@
* 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
*/
export {AppModule, StableTestCmp as AppComponent} from './testability_example';
export {AppModule} from './testability_example';

View File

@ -1,23 +0,0 @@
load("//tools:defaults.bzl", "jasmine_node_test", "ts_library")
ts_library(
name = "fake_async_lib",
srcs = [
"example_spec.ts",
"fake_async.ts",
],
deps = [
"//packages/core/testing",
"@ngdeps//@types/jasmine",
"@ngdeps//@types/node",
],
)
jasmine_node_test(
name = "test",
bootstrap = ["angular/tools/testing/init_node_spec.js"],
deps = [
":fake_async_lib",
"//tools/testing:node",
],
)

View File

@ -1,12 +0,0 @@
/**
* @license
* Copyright Google Inc. 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 the "fake_async" example that registers tests which are shown as examples. These need
// to be valid tests, so we run them here. Note that we need to add this layer of abstraction here
// because the "jasmine_node_test" rule only picks up test files with the "_spec.ts" file suffix.
import './fake_async';

View File

@ -6,7 +6,7 @@
* found in the LICENSE file at https://angular.io/license
*/
/* tslint:disable:no-console */
import {Component, Directive, EventEmitter, NgModule} from '@angular/core';
import {Component, Directive, EventEmitter} from '@angular/core';
// #docregion component-input
@Component({
@ -63,10 +63,4 @@ export class MyOutputComponent {
onEverySecond() { console.log('second'); }
onEveryFiveSeconds() { console.log('five seconds'); }
}
// #enddocregion component-output-interval
@NgModule({
declarations: [BankAccountComponent, MyInputComponent, IntervalDirComponent, MyOutputComponent]
})
export class AppModule {
}
// #enddocregion component-output-interval

View File

@ -13,10 +13,8 @@ import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {MyComponent} from './my_component';
enableProdMode();
@NgModule({imports: [BrowserModule], declarations: [MyComponent], bootstrap: [MyComponent]})
export class AppModule {
@NgModule({imports: [BrowserModule], bootstrap: [MyComponent]})
class AppModule {
}
platformBrowserDynamic().bootstrapModule(AppModule);
// #enddocregion

View File

@ -1,59 +0,0 @@
package(default_visibility = ["//visibility:public"])
load("//packages/bazel:index.bzl", "protractor_web_test_suite")
load("//tools:defaults.bzl", "ng_module", "ts_library")
load("@build_bazel_rules_typescript//:defs.bzl", "ts_devserver")
ng_module(
name = "forms_examples",
srcs = glob(
["**/*.ts"],
exclude = ["**/*_spec.ts"],
),
# TODO: FW-1004 Type checking is currently not complete.
type_check = False,
deps = [
"//packages/core",
"//packages/forms",
"//packages/platform-browser",
"//packages/platform-browser-dynamic",
"//packages/router",
],
)
ts_library(
name = "forms_e2e_tests_lib",
testonly = True,
srcs = glob(["**/e2e_test/*_spec.ts"]),
tsconfig = "//packages/examples:tsconfig-e2e.json",
deps = [
"//packages/examples/test-utils",
"//packages/private/testing",
"@ngdeps//@types/jasminewd2",
"@ngdeps//protractor",
],
)
ts_devserver(
name = "devserver",
entry_module = "@angular/examples/forms/main",
index_html = "//packages/examples:index.html",
port = 4200,
scripts = ["@ngdeps//node_modules/tslib:tslib.js"],
static_files = [
"@ngdeps//node_modules/zone.js:dist/zone.js",
],
deps = [":forms_examples"],
)
protractor_web_test_suite(
name = "protractor_tests",
data = ["//packages/bazel/src/protractor/utils"],
on_prepare = ":start-server.js",
server = ":devserver",
deps = [
":forms_e2e_tests_lib",
"@ngdeps//protractor",
"@ngdeps//selenium-webdriver",
],
)

View File

@ -1,12 +0,0 @@
/**
* @license
* Copyright Google Inc. 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 {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {TestsAppModuleNgFactory} from './test_module.ngfactory';
platformBrowserDynamic().bootstrapModuleFactory(TestsAppModuleNgFactory);

View File

@ -1,17 +0,0 @@
/**
* @license
* Copyright Google Inc. 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 protractorUtils = require('@angular/bazel/protractor-utils');
const protractor = require('protractor');
module.exports = async function(config) {
const {port} = await protractorUtils.runServer(config.workspace, config.server, '-port', []);
const serverUrl = `http://localhost:${port}`;
protractor.browser.baseUrl = serverUrl;
};

View File

@ -1,58 +0,0 @@
/**
* @license
* Copyright Google Inc. 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 {Component, NgModule} from '@angular/core';
import {RouterModule} from '@angular/router';
import * as formBuilderExample from './ts/formBuilder/module';
import * as nestedFormArrayExample from './ts/nestedFormArray/module';
import * as nestedFormGroupExample from './ts/nestedFormGroup/module';
import * as ngModelGroupExample from './ts/ngModelGroup/module';
import * as radioButtonsExample from './ts/radioButtons/module';
import * as reactiveRadioButtonsExample from './ts/reactiveRadioButtons/module';
import * as reactiveSelectControlExample from './ts/reactiveSelectControl/module';
import * as selectControlExample from './ts/selectControl/module';
import * as simpleFormExample from './ts/simpleForm/module';
import * as simpleFormControlExample from './ts/simpleFormControl/module';
import * as simpleFormGroupExample from './ts/simpleFormGroup/module';
import * as simpleNgModelExample from './ts/simpleNgModel/module';
@Component({selector: 'example-app', template: '<router-outlet></router-outlet>'})
export class TestsAppComponent {
}
@NgModule({
imports: [
formBuilderExample.AppModule, nestedFormArrayExample.AppModule,
nestedFormGroupExample.AppModule, ngModelGroupExample.AppModule, radioButtonsExample.AppModule,
reactiveRadioButtonsExample.AppModule, reactiveSelectControlExample.AppModule,
selectControlExample.AppModule, simpleFormExample.AppModule, simpleFormControlExample.AppModule,
simpleFormGroupExample.AppModule, simpleNgModelExample.AppModule,
// Router configuration so that the individual e2e tests can load their
// app components.
RouterModule.forRoot([
{path: 'formBuilder', component: formBuilderExample.AppComponent},
{path: 'nestedFormArray', component: nestedFormArrayExample.AppComponent},
{path: 'nestedFormGroup', component: nestedFormGroupExample.AppComponent},
{path: 'ngModelGroup', component: ngModelGroupExample.AppComponent},
{path: 'radioButtons', component: radioButtonsExample.AppComponent},
{path: 'reactiveRadioButtons', component: reactiveRadioButtonsExample.AppComponent},
{path: 'reactiveSelectControl', component: reactiveSelectControlExample.AppComponent},
{path: 'selectControl', component: selectControlExample.AppComponent},
{path: 'simpleForm', component: simpleFormExample.AppComponent},
{path: 'simpleFormControl', component: simpleFormControlExample.AppComponent},
{path: 'simpleFormGroup', component: simpleFormGroupExample.AppComponent},
{path: 'simpleNgModel', component: simpleNgModelExample.AppComponent}
])
],
declarations: [TestsAppComponent],
bootstrap: [TestsAppComponent]
})
export class TestsAppModule {
}

View File

@ -7,7 +7,7 @@
*/
import {ElementArrayFinder, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../_common/e2e_util';
describe('formBuilder example', () => {
afterEach(verifyNoBrowserErrors);
@ -15,7 +15,7 @@ describe('formBuilder example', () => {
let paragraphs: ElementArrayFinder;
beforeEach(() => {
browser.get('/formBuilder');
browser.get('/forms/ts/formBuilder/index.html');
inputs = element.all(by.css('input'));
paragraphs = element.all(by.css('p'));
});

View File

@ -9,14 +9,12 @@
import {NgModule} from '@angular/core';
import {ReactiveFormsModule} from '@angular/forms';
import {BrowserModule} from '@angular/platform-browser';
import {DisabledFormControlComponent, FormBuilderComp} from './form_builder_example';
import {FormBuilderComp} from './form_builder_example';
@NgModule({
imports: [BrowserModule, ReactiveFormsModule],
declarations: [FormBuilderComp, DisabledFormControlComponent],
declarations: [FormBuilderComp],
bootstrap: [FormBuilderComp]
})
export class AppModule {
}
export {FormBuilderComp as AppComponent};

View File

@ -7,7 +7,7 @@
*/
import {ElementArrayFinder, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../_common/e2e_util';
describe('nestedFormArray example', () => {
afterEach(verifyNoBrowserErrors);
@ -15,7 +15,7 @@ describe('nestedFormArray example', () => {
let buttons: ElementArrayFinder;
beforeEach(() => {
browser.get('/nestedFormArray');
browser.get('/forms/ts/nestedFormArray/index.html');
inputs = element.all(by.css('input'));
buttons = element.all(by.css('button'));
});

View File

@ -18,5 +18,3 @@ import {NestedFormArray} from './nested_form_array_example';
})
export class AppModule {
}
export {NestedFormArray as AppComponent};

View File

@ -7,7 +7,7 @@
*/
import {ElementFinder, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../_common/e2e_util';
describe('nestedFormGroup example', () => {
afterEach(verifyNoBrowserErrors);
@ -16,7 +16,7 @@ describe('nestedFormGroup example', () => {
let button: ElementFinder;
beforeEach(() => {
browser.get('/nestedFormGroup');
browser.get('/forms/ts/nestedFormGroup/index.html');
firstInput = element(by.css('[formControlName="first"]'));
lastInput = element(by.css('[formControlName="last"]'));
button = element(by.css('button:not([type="submit"])'));

View File

@ -18,5 +18,3 @@ import {NestedFormGroupComp} from './nested_form_group_example';
})
export class AppModule {
}
export {NestedFormGroupComp as AppComponent};

View File

@ -7,7 +7,7 @@
*/
import {ElementArrayFinder, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../_common/e2e_util';
describe('ngModelGroup example', () => {
afterEach(verifyNoBrowserErrors);
@ -15,7 +15,7 @@ describe('ngModelGroup example', () => {
let buttons: ElementArrayFinder;
beforeEach(() => {
browser.get('/ngModelGroup');
browser.get('/forms/ts/ngModelGroup/index.html');
inputs = element.all(by.css('input'));
buttons = element.all(by.css('button'));
});

View File

@ -18,5 +18,3 @@ import {NgModelGroupComp} from './ng_model_group_example';
})
export class AppModule {
}
export {NgModelGroupComp as AppComponent};

View File

@ -7,7 +7,7 @@
*/
import {ElementArrayFinder, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../_common/e2e_util';
describe('radioButtons example', () => {
afterEach(verifyNoBrowserErrors);
@ -15,7 +15,7 @@ describe('radioButtons example', () => {
let paragraphs: ElementArrayFinder;
beforeEach(() => {
browser.get('/radioButtons');
browser.get('/forms/ts/radioButtons/index.html');
inputs = element.all(by.css('input'));
paragraphs = element.all(by.css('p'));
});

View File

@ -18,5 +18,3 @@ import {RadioButtonComp} from './radio_button_example';
})
export class AppModule {
}
export {RadioButtonComp as AppComponent};

View File

@ -7,14 +7,14 @@
*/
import {ElementArrayFinder, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../_common/e2e_util';
describe('radioButtons example', () => {
afterEach(verifyNoBrowserErrors);
let inputs: ElementArrayFinder;
beforeEach(() => {
browser.get('/reactiveRadioButtons');
browser.get('/forms/ts/reactiveRadioButtons/index.html');
inputs = element.all(by.css('input'));
});

View File

@ -18,5 +18,3 @@ import {ReactiveRadioButtonComp} from './reactive_radio_button_example';
})
export class AppModule {
}
export {ReactiveRadioButtonComp as AppComponent};

View File

@ -7,7 +7,7 @@
*/
import {ElementArrayFinder, ElementFinder, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../_common/e2e_util';
describe('reactiveSelectControl example', () => {
afterEach(verifyNoBrowserErrors);
@ -16,7 +16,7 @@ describe('reactiveSelectControl example', () => {
let p: ElementFinder;
beforeEach(() => {
browser.get('/reactiveSelectControl');
browser.get('/forms/ts/reactiveSelectControl/index.html');
select = element(by.css('select'));
options = element.all(by.css('option'));
p = element(by.css('p'));

View File

@ -18,5 +18,3 @@ import {ReactiveSelectComp} from './reactive_select_control_example';
})
export class AppModule {
}
export {ReactiveSelectComp as AppComponent};

View File

@ -7,7 +7,7 @@
*/
import {ElementArrayFinder, ElementFinder, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../_common/e2e_util';
describe('selectControl example', () => {
afterEach(verifyNoBrowserErrors);
@ -16,7 +16,7 @@ describe('selectControl example', () => {
let p: ElementFinder;
beforeEach(() => {
browser.get('/selectControl');
browser.get('/forms/ts/selectControl/index.html');
select = element(by.css('select'));
options = element.all(by.css('option'));
p = element(by.css('p'));

View File

@ -18,5 +18,3 @@ import {SelectControlComp} from './select_control_example';
})
export class AppModule {
}
export {SelectControlComp as AppComponent};

View File

@ -7,7 +7,7 @@
*/
import {ElementArrayFinder, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../_common/e2e_util';
describe('simpleForm example', () => {
afterEach(verifyNoBrowserErrors);
@ -15,7 +15,7 @@ describe('simpleForm example', () => {
let paragraphs: ElementArrayFinder;
beforeEach(() => {
browser.get('/simpleForm');
browser.get('/forms/ts/simpleForm/index.html');
inputs = element.all(by.css('input'));
paragraphs = element.all(by.css('p'));
});

View File

@ -18,5 +18,3 @@ import {SimpleFormComp} from './simple_form_example';
})
export class AppModule {
}
export {SimpleFormComp as AppComponent};

View File

@ -7,7 +7,7 @@
*/
import {ElementFinder, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../_common/e2e_util';
describe('simpleFormControl example', () => {
afterEach(verifyNoBrowserErrors);
@ -18,7 +18,7 @@ describe('simpleFormControl example', () => {
let statusP: ElementFinder;
beforeEach(() => {
browser.get('/simpleFormControl');
browser.get('/forms/ts/simpleFormControl/index.html');
input = element(by.css('input'));
valueP = element(by.css('p:first-of-type'));
statusP = element(by.css('p:last-of-type'));

View File

@ -18,5 +18,3 @@ import {SimpleFormControl} from './simple_form_control_example';
})
export class AppModule {
}
export {SimpleFormControl as AppComponent};

View File

@ -7,7 +7,7 @@
*/
import {ElementFinder, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../_common/e2e_util';
describe('formControlName example', () => {
afterEach(verifyNoBrowserErrors);
@ -17,7 +17,7 @@ describe('formControlName example', () => {
let lastInput: ElementFinder;
beforeEach(() => {
browser.get('/simpleFormGroup');
browser.get('/forms/ts/simpleFormGroup/index.html');
firstInput = element(by.css('[formControlName="first"]'));
lastInput = element(by.css('[formControlName="last"]'));
});

View File

@ -18,5 +18,3 @@ import {SimpleFormGroup} from './simple_form_group_example';
})
export class AppModule {
}
export {SimpleFormGroup as AppComponent};

View File

@ -18,5 +18,3 @@ import {SimpleNgModelComp} from './simple_ng_model_example';
})
export class AppModule {
}
export {SimpleNgModelComp as AppComponent};

View File

@ -1 +0,0 @@
package(default_visibility = ["//visibility:public"])

View File

@ -1,15 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Angular Examples</title>
<base href="/">
<!-- Prevent the browser from requesting any favicon. This could throw off the console
output checks. -->
<link rel="icon" href="data:,">
</head>
<body>
<example-app>Loading...</example-app>
</body>
</html>

View File

@ -1,14 +0,0 @@
package(default_visibility = ["//visibility:public"])
load("//tools:defaults.bzl", "ng_module")
ng_module(
name = "platform_browser_examples",
srcs = glob(["**/*.ts"]),
deps = [
"//packages/compiler",
"//packages/core",
"//packages/platform-browser",
"//packages/platform-browser-dynamic",
],
)

View File

@ -11,7 +11,7 @@ import {Component, NgModule} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
@Component({selector: 'my-component', template: 'text'})
@Component({selector: 'my-component'})
class MyAppComponent {
}

View File

@ -1,11 +0,0 @@
package(default_visibility = ["//visibility:public"])
load("//tools:defaults.bzl", "ts_library")
ts_library(
name = "test-utils",
srcs = ["index.ts"],
deps = [
"@ngdeps//@types/selenium-webdriver",
],
)

View File

@ -1,43 +0,0 @@
/**
* @license
* Copyright Google Inc. 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
*/
/* tslint:disable:no-console */
import {WebDriver, logging} from 'selenium-webdriver';
declare var browser: WebDriver;
declare var expect: any;
// TODO (juliemr): remove this method once this becomes a protractor plugin
export async function verifyNoBrowserErrors() {
const browserLog = await browser.manage().logs().get('browser');
const collectedErrors: any[] = [];
browserLog.forEach(logEntry => {
const msg = logEntry.message;
// Since we currently use the `ts_devserver` from the Bazel TypeScript rules, which does
// fallback to the "index.html" file for HTML5 pushState routing but does always serve the
// expected fallback with a 404 status code, the browser will print a message about the 404,
// while the page loaded properly. Ideally the "ts_devserver" would allow us to opt-in for
// just returning a 200 status code, but the devserver is intended to be kept manually, so
// we manually filter this error before ensuring there are no console errors.
// TODO: This is a current limitation of using the "ts_devserver" with Angular routing.
// Tracked with: TOOL-629
if (msg.includes(
`Failed to load resource: the server responded with a status of 404 (Not Found)`)) {
return;
}
console.log('>> ' + msg, logEntry);
if (logEntry.level.value >= logging.Level.INFO.value) {
collectedErrors.push(msg);
}
});
expect(collectedErrors).toEqual([]);
}

17
packages/examples/test.sh Executable file
View File

@ -0,0 +1,17 @@
#!/usr/bin/env bash
set -u -e -o pipefail
(
cd `dirname $0`
./build.sh
gulp serve-examples &
trap "kill $!" EXIT
(
cd ../../
NODE_PATH=${NODE_PATH:-}:dist/all
$(npm bin)/protractor protractor-examples-e2e.conf.js --bundles=true
)
)

View File

@ -1,13 +0,0 @@
package(default_visibility = ["//visibility:public"])
load("//tools:defaults.bzl", "ts_library")
ts_library(
name = "testing_examples",
srcs = glob(["**/*.ts"]),
tsconfig = "//packages:tsconfig-test.json",
deps = [
"@ngdeps//@types/jasmine",
"@ngdeps//@types/node",
],
)

View File

@ -0,0 +1,22 @@
{
"extends": "../tsconfig-build.json",
"compilerOptions": {
"module": "commonjs",
"emitDecoratorMetadata": true,
"baseUrl": ".",
"rootDir": ".",
"paths": {
"@angular/*": ["../../dist/packages-dist/*"],
"rxjs/*": ["../../node_modules/rxjs/*"]
},
"outDir": "../../dist/examples",
"types": ["angular"]
},
"include": [
"../../node_modules/@types/jasminewd2/index.d.ts",
"../types.d.ts",
"**/*.ts"
]
}

View File

@ -1,6 +0,0 @@
{
"compilerOptions": {
"lib": ["es2015"],
"types": ["node", "jasminewd2"]
}
}

View File

@ -0,0 +1,18 @@
// WARNING:
// This file is used to build the e2e tests only.
// The rest of the files are included in `/packages/tsconfig.json`.
{
"extends": "../tsconfig.json",
"compilerOptions": {
"types": []
},
"include": [
"../../node_modules/@types/jasminewd2/index.d.ts",
"../types.d.ts",
"**/e2e_test/*"
],
"exclude": []
}

View File

@ -1,4 +0,0 @@
exports_files([
"tsconfig-build.json",
"start-server.js",
])

View File

@ -1,17 +0,0 @@
/**
* @license
* Copyright Google Inc. 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 protractorUtils = require('@angular/bazel/protractor-utils');
const protractor = require('protractor');
module.exports = async function(config) {
const {port} = await protractorUtils.runServer(config.workspace, config.server, '-port', []);
const serverUrl = `http://localhost:${port}`;
protractor.browser.baseUrl = serverUrl;
};

View File

@ -1,14 +0,0 @@
package(default_visibility = ["//visibility:public"])
load("//packages/examples/upgrade:upgrade_example.bzl", "create_upgrade_example_targets")
create_upgrade_example_targets(
name = "full",
srcs = glob(
["**/*.ts"],
exclude = ["**/*_spec.ts"],
),
assets = ["styles.css"],
e2e_srcs = glob(["e2e_test/*_spec.ts"]),
entry_module = "@angular/examples/upgrade/static/ts/full/module",
)

View File

@ -7,11 +7,11 @@
*/
import {browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../../_common/e2e_util';
function loadPage() {
browser.rootEl = 'example-app';
browser.get('/');
browser.get('/upgrade/static/ts/full/');
}
describe('upgrade/static (full)', () => {

View File

@ -1,13 +0,0 @@
package(default_visibility = ["//visibility:public"])
load("//packages/examples/upgrade:upgrade_example.bzl", "create_upgrade_example_targets")
create_upgrade_example_targets(
name = "lite-multi-shared",
srcs = glob(
["**/*.ts"],
exclude = ["**/*_spec.ts"],
),
e2e_srcs = glob(["e2e_test/*_spec.ts"]),
entry_module = "@angular/examples/upgrade/static/ts/lite-multi-shared/module",
)

View File

@ -8,7 +8,7 @@
import {browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../../_common/e2e_util';
describe('upgrade/static (lite with multiple downgraded modules and shared root module)', () => {
@ -16,7 +16,7 @@ describe('upgrade/static (lite with multiple downgraded modules and shared root
const compB = element(by.css('ng2-b'));
const compC = element(by.css('ng2-c'));
beforeEach(() => browser.get('/'));
beforeEach(() => browser.get('/upgrade/static/ts/lite-multi-shared/'));
afterEach(verifyNoBrowserErrors);
it('should share the same injectable instance across downgraded modules A and B', () => {

View File

@ -1,13 +0,0 @@
package(default_visibility = ["//visibility:public"])
load("//packages/examples/upgrade:upgrade_example.bzl", "create_upgrade_example_targets")
create_upgrade_example_targets(
name = "lite-multi",
srcs = glob(
["**/*.ts"],
exclude = ["**/*_spec.ts"],
),
e2e_srcs = glob(["e2e_test/*_spec.ts"]),
entry_module = "@angular/examples/upgrade/static/ts/lite-multi/module",
)

View File

@ -8,14 +8,14 @@
import {browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../../_common/e2e_util';
describe('upgrade/static (lite with multiple downgraded modules)', () => {
const navButtons = element.all(by.css('nav button'));
const mainContent = element(by.css('main'));
beforeEach(() => browser.get('/'));
beforeEach(() => browser.get('/upgrade/static/ts/lite-multi/'));
afterEach(verifyNoBrowserErrors);
it('should correctly bootstrap multiple downgraded modules', () => {

View File

@ -1,14 +0,0 @@
package(default_visibility = ["//visibility:public"])
load("//packages/examples/upgrade:upgrade_example.bzl", "create_upgrade_example_targets")
create_upgrade_example_targets(
name = "lite",
srcs = glob(
["**/*.ts"],
exclude = ["e2e_test/*"],
),
assets = ["styles.css"],
e2e_srcs = glob(["e2e_test/*.ts"]),
entry_module = "@angular/examples/upgrade/static/ts/lite/module",
)

View File

@ -7,13 +7,13 @@
*/
import {ElementArrayFinder, ElementFinder, browser, by, element} from 'protractor';
import {verifyNoBrowserErrors} from '../../../../../test-utils';
import {verifyNoBrowserErrors} from '../../../../../_common/e2e_util';
import {addCustomMatchers} from './e2e_util';
function loadPage() {
browser.rootEl = 'example-app';
browser.get('/');
browser.get('/upgrade/static/ts/lite/');
}
describe('upgrade/static (lite)', () => {

View File

@ -1,6 +0,0 @@
{
"compilerOptions": {
"lib": ["dom", "es2015"],
"types": ["angular"]
}
}

View File

@ -1,66 +0,0 @@
load("//packages/bazel:index.bzl", "protractor_web_test_suite")
load("//tools:defaults.bzl", "ng_module", "ts_library")
load("@build_bazel_rules_typescript//:defs.bzl", "ts_devserver")
"""
Macro that can be used to create the Bazel targets for an "upgrade" example. Since the
upgrade examples bootstrap their application manually, and we cannot serve all examples,
we need to define the devserver for each example. This macro reduces code duplication
for defining these targets.
"""
def create_upgrade_example_targets(name, srcs, e2e_srcs, entry_module, assets = []):
ng_module(
name = "%s_sources" % name,
srcs = srcs,
# TODO: FW-1004 Type checking is currently not complete.
type_check = False,
deps = [
"@ngdeps//@types/angular",
"//packages/core",
"//packages/platform-browser",
"//packages/platform-browser-dynamic",
"//packages/upgrade/static",
],
tsconfig = "//packages/examples/upgrade:tsconfig-build.json",
)
ts_library(
name = "%s_e2e_lib" % name,
srcs = e2e_srcs,
testonly = True,
deps = [
"@ngdeps//@types/jasminewd2",
"@ngdeps//protractor",
"//packages/examples/test-utils",
"//packages/private/testing",
],
tsconfig = "//packages/examples:tsconfig-e2e.json",
)
ts_devserver(
name = "devserver",
port = 4200,
entry_module = entry_module,
static_files = [
"@ngdeps//node_modules/zone.js:dist/zone.js",
"@ngdeps//node_modules/angular:angular.js",
"@ngdeps//node_modules/reflect-metadata:Reflect.js",
],
index_html = "//packages/examples:index.html",
scripts = ["@ngdeps//node_modules/tslib:tslib.js"],
deps = [":%s_sources" % name],
data = assets,
)
protractor_web_test_suite(
name = "%s_protractor" % name,
data = ["//packages/bazel/src/protractor/utils"],
on_prepare = "//packages/examples/upgrade:start-server.js",
server = ":devserver",
deps = [
":%s_e2e_lib" % name,
"@ngdeps//protractor",
"@ngdeps//selenium-webdriver",
],
)

View File

@ -33,12 +33,7 @@
"common/locales",
"compiler-cli/integrationtest",
"elements/schematics",
// Do not build the example e2e spec files since those require custom typings and
// aren't required to build all packages.
"examples/**/e2e_test/*",
// Exclude the "main.ts" files for each example group because this file is used by
// Bazel to launch the devserver and uses AOT compilation.
"examples/*/main.ts",
"platform-server/integrationtest",
"router/test/aot_ngsummary_test",
]

View File

@ -0,0 +1,35 @@
/**
* @license
* Copyright Google Inc. 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
*/
// Make sure that the command line is read as the first thing
// as this could exit node if the help script should be printed.
require('./dist/all/e2e_util/e2e_util').readCommandLine();
require('reflect-metadata');
Error.stackTraceLimit = 9999;
exports.config = {
onPrepare: function() { beforeEach(function() { browser.ignoreSynchronization = false; }); },
allScriptsTimeout: 11000,
specs: ['dist/examples/**/e2e_test/*_spec.js'],
capabilities: {
'browserName': 'chrome',
// Enables concurrent testing. Currently runs four e2e files in parallel.
shardTestFiles: true,
maxInstances: 4,
},
directConnect: true,
baseUrl: 'http://localhost:8001/',
framework: 'jasmine2',
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 60000,
print: function(msg) { console.log(msg); },
},
useAllAngular2AppRoots: true
};

Some files were not shown because too many files have changed in this diff Show More