Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 6028514

Browse files
authoredJun 13, 2016
Merge pull request #279 from NativeScript/hdeshev/appium
Add appium E2E tests for the router
2 parents ab3ff84 + b3b8a8e commit 6028514

26 files changed

+411
-321
lines changed
 

‎.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,4 @@ before_script:
3939
script:
4040
- tns platform add android
4141
- tns test android --emulator --justlaunch
42+
- npm run appium-android

‎nativescript-angular/application.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import "zone.js/dist/zone-node"
33

44
import 'reflect-metadata';
55
import './polyfills/array';
6+
import {rendererLog, rendererError} from "./trace";
67
import {SanitizationService} from '@angular/core/src/security';
78
import {isPresent, Type, print} from '@angular/core/src/facade/lang';
89
import {ReflectiveInjector, reflector, coreLoadAndBootstrap, createPlatform,
@@ -107,18 +108,18 @@ export function nativeScriptBootstrap(appComponentType: any, customProviders?: P
107108
let onLoadedHandler = function(args) {
108109
page.off('loaded', onLoadedHandler);
109110
//profiling.stop('application-start');
110-
console.log('Page loaded');
111+
rendererLog('Page loaded');
111112

112113
//profiling.start('ng-bootstrap');
113-
console.log('BOOTSTRAPPING...');
114+
rendererLog('BOOTSTRAPPING...');
114115
bootstrap(appComponentType, customProviders).then((appRef) => {
115116
//profiling.stop('ng-bootstrap');
116-
console.log('ANGULAR BOOTSTRAP DONE.');
117+
rendererLog('ANGULAR BOOTSTRAP DONE.');
117118
resolve(appRef);
118119
}, (err) => {
119-
console.log('ERROR BOOTSTRAPPING ANGULAR');
120+
rendererError('ERROR BOOTSTRAPPING ANGULAR');
120121
let errorMessage = err.message + "\n\n" + err.stack;
121-
console.log(errorMessage);
122+
rendererError(errorMessage);
122123

123124
let view = new TextView();
124125
view.text = errorMessage;

‎nativescript-angular/directives/list-view-comp.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {View} from 'ui/core/view';
2222
import {NgView} from '../view-util';
2323
import {ObservableArray} from 'data/observable-array';
2424
import {LayoutBase} from 'ui/layouts/layout-base';
25+
import {rendererLog, rendererError} from "../trace";
2526
const NG_VIEW = "_ngViewRef";
2627

2728
export class ListItemContext {
@@ -98,15 +99,15 @@ export class ListViewComponent {
9899
let viewRef: EmbeddedViewRef<ListItemContext>;
99100

100101
if (args.view) {
101-
console.log("ListView.onItemLoading: " + index + " - Reusing existing view");
102+
rendererLog("ListView.onItemLoading: " + index + " - Reusing existing view");
102103
viewRef = args.view[NG_VIEW];
103104
// getting angular view from original element (in cases when ProxyViewContainer is used NativeScript internally wraps it in a StackLayout)
104105
if (!viewRef) {
105106
viewRef = (args.view._subViews && args.view._subViews.length > 0) ? args.view._subViews[0][NG_VIEW] : undefined;
106107
}
107108
}
108109
else {
109-
console.log("ListView.onItemLoading: " + index + " - Creating view from template");
110+
rendererLog("ListView.onItemLoading: " + index + " - Creating view from template");
110111
viewRef = this.loader.createEmbeddedView(this.itemTemplate, new ListItemContext(), 0);
111112
args.view = getSingleViewFromViewRef(viewRef);
112113
args.view[NG_VIEW] = viewRef;

‎nativescript-angular/directives/tab-view.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {ElementRef, Directive, Input, TemplateRef, ViewContainerRef} from "@angular/core";
22
import {TabView, TabViewItem} from "ui/tab-view";
33
import * as utils from '../common/utils';
4+
import {rendererLog, rendererError} from "../trace";
45
import {isBlank} from '@angular/core/src/facade/lang';
56

67
@Directive({
@@ -31,7 +32,7 @@ export class TabViewDirective {
3132
ngAfterViewInit() {
3233
this.viewInitialized = true;
3334
debugger;
34-
console.log("this._selectedIndex: " + this._selectedIndex);
35+
rendererLog("this._selectedIndex: " + this._selectedIndex);
3536
if (!isBlank(this._selectedIndex)) {
3637
this.tabView.selectedIndex = this._selectedIndex;
3738
}

‎nativescript-angular/dom_adapter.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {SanitizationService} from '@angular/core/src/security';
33
import {Parse5DomAdapter} from '@angular/platform-server';
44
import {setRootDomAdapter} from '@angular/platform-browser/src/dom/dom_adapter';
55
import {Type} from '@angular/core/src/facade/lang';
6+
import {rendererLog, rendererError} from "./trace";
67

78
export enum SecurityContext {
89
NONE,
@@ -35,7 +36,7 @@ export class NativeScriptSanitizationService extends SanitizationService {
3536

3637
export class NativeScriptDomAdapter extends Parse5DomAdapter {
3738
static makeCurrent() {
38-
console.log("Setting DOM");
39+
rendererLog("Setting DOM");
3940
setRootDomAdapter(new NativeScriptDomAdapter());
4041
}
4142

‎nativescript-angular/renderer.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,11 @@ import {View} from "ui/core/view";
1212
import * as application from "application";
1313
import {topmost} from 'ui/frame';
1414
import {Page} from 'ui/page';
15-
import {traceLog, ViewUtil, NgView} from "./view-util";
15+
import {ViewUtil, NgView} from "./view-util";
16+
import {rendererLog as traceLog} from "./trace";
1617
import {escapeRegexSymbols} from "utils/utils";
1718
import { Device } from "platform";
1819

19-
export { rendererTraceCategory } from "./view-util";
20-
2120
@Injectable()
2221
export class NativeScriptRootRenderer implements RootRenderer {
2322
private _rootView: View = null;

‎nativescript-angular/router/common.ts

Lines changed: 0 additions & 7 deletions
This file was deleted.

‎nativescript-angular/router/ns-location-strategy.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import application = require("application");
22
import { LocationStrategy } from '@angular/common';
33
import { NgZone, ApplicationRef, Inject, forwardRef } from '@angular/core';
4-
import { log } from "./common";
4+
import { routerLog } from "../trace";
55
import { topmost } from "ui/frame";
66

77
interface LocationState {
@@ -20,18 +20,18 @@ export class NSLocationStrategy extends LocationStrategy {
2020
private _isPageNavigatingForward: boolean = false;
2121

2222
path(): string {
23-
log("NSLocationStrategy.path()");
23+
routerLog("NSLocationStrategy.path()");
2424
let state = this.peekState();
2525
return state ? state.url : "/";
2626
}
2727

2828
prepareExternalUrl(internal: string): string {
29-
log("NSLocationStrategy.prepareExternalUrl() internal: " + internal);
29+
routerLog("NSLocationStrategy.prepareExternalUrl() internal: " + internal);
3030
return internal;
3131
}
3232

3333
pushState(state: any, title: string, url: string, queryParams: string): void {
34-
log(`NSLocationStrategy.pushState state: ${state}, title: ${title}, url: ${url}, queryParams: ${queryParams}`);
34+
routerLog(`NSLocationStrategy.pushState state: ${state}, title: ${title}, url: ${url}, queryParams: ${queryParams}`);
3535

3636
let isNewPage = this._isPageNavigatingForward;
3737
this._isPageNavigatingForward = false;
@@ -46,12 +46,12 @@ export class NSLocationStrategy extends LocationStrategy {
4646
}
4747

4848
replaceState(state: any, title: string, url: string, queryParams: string): void {
49-
log(`NSLocationStrategy.replaceState state: ${state}, title: ${title}, url: ${url}, queryParams: ${queryParams}`);
49+
routerLog(`NSLocationStrategy.replaceState state: ${state}, title: ${title}, url: ${url}, queryParams: ${queryParams}`);
5050
throw new Error("Not implemented");
5151
}
5252

5353
forward(): void {
54-
log("NSLocationStrategy.forward");
54+
routerLog("NSLocationStrategy.forward");
5555
throw new Error("Not implemented");
5656
}
5757

@@ -65,30 +65,30 @@ export class NSLocationStrategy extends LocationStrategy {
6565
state = this.states.pop();
6666
count++;
6767
}
68-
log("NSLocationStrategy.back() while navigating back. States popped: " + count)
68+
routerLog("NSLocationStrategy.back() while navigating back. States popped: " + count)
6969
this.callPopState(state, true);
7070
} else {
7171
let state = this.peekState();
7272
if (state.isPageNavigation) {
7373
// This was a page navigation - so navigate through frame.
74-
log("NSLocationStrategy.back() while not navigating back but top state is page - will call frame.goback()")
74+
routerLog("NSLocationStrategy.back() while not navigating back but top state is page - will call frame.goback()")
7575
topmost().goBack();
7676
} else {
7777
// Nested navigation - just pop the state
78-
log("NSLocationStrategy.back() while not navigating back but top state is not page - just pop")
78+
routerLog("NSLocationStrategy.back() while not navigating back but top state is not page - just pop")
7979
this.callPopState(this.states.pop(), true);
8080
}
8181
}
8282

8383
}
8484

8585
onPopState(fn: (_: any) => any): void {
86-
log("NSLocationStrategy.onPopState");
86+
routerLog("NSLocationStrategy.onPopState");
8787
this.popStateCallbacks.push(fn);
8888
}
8989

9090
getBaseHref(): string {
91-
log("NSLocationStrategy.getBaseHref()");
91+
routerLog("NSLocationStrategy.getBaseHref()");
9292
return "";
9393
}
9494

@@ -108,15 +108,15 @@ export class NSLocationStrategy extends LocationStrategy {
108108

109109
// Methods for syncing with page navigation in PageRouterOutlet
110110
public beginBackPageNavigation() {
111-
log("NSLocationStrategy.startGoBack()");
111+
routerLog("NSLocationStrategy.startGoBack()");
112112
if (this._isPageNavigationgBack) {
113113
throw new Error("Calling startGoBack while going back.")
114114
}
115115
this._isPageNavigationgBack = true;
116116
}
117117

118118
public finishBackPageNavigation() {
119-
log("NSLocationStrategy.finishBackPageNavigation()");
119+
routerLog("NSLocationStrategy.finishBackPageNavigation()");
120120
if (!this._isPageNavigationgBack) {
121121
throw new Error("Calling endGoBack while not going back.")
122122
}
@@ -128,7 +128,7 @@ export class NSLocationStrategy extends LocationStrategy {
128128
}
129129

130130
public navigateToNewPage() {
131-
log("NSLocationStrategy.navigateToNewPage()");
131+
routerLog("NSLocationStrategy.navigateToNewPage()");
132132
if (this._isPageNavigatingForward) {
133133
throw new Error("Calling navigateToNewPage while already navigating to new page.")
134134
}

‎nativescript-angular/router/ns-router-link.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {Directive, Input} from '@angular/core';
22
import {isString} from '@angular/core/src/facade/lang';
33
import {Router, Instruction} from '@angular/router-deprecated';
4-
import { log } from "./common";
4+
import {routerLog} from "../trace";
55

66
/**
77
* The NSRouterLink directive lets you link to specific parts of your app.
@@ -55,7 +55,7 @@ export class NSRouterLink {
5555
}
5656

5757
onTap(): void {
58-
log("NSRouterLink onTap() instruction: " + JSON.stringify(this._navigationInstruction))
58+
routerLog("NSRouterLink onTap() instruction: " + JSON.stringify(this._navigationInstruction))
5959
this._router.navigateByInstruction(this._navigationInstruction);
6060
}
6161
}

‎nativescript-angular/router/ns-router.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {NSLocationStrategy} from './ns-location-strategy';
55
import {ROUTER_PROVIDERS} from '@angular/router-deprecated';
66
import {LocationStrategy} from '@angular/common';
77
import {provide} from '@angular/core';
8-
import { CATEGORY } from "./common";
8+
export {routerTraceCategory} from "../trace";
99

1010
export const NS_ROUTER_PROVIDERS: any[] = [
1111
ROUTER_PROVIDERS,
@@ -17,5 +17,3 @@ export const NS_ROUTER_DIRECTIVES: Type[] = [
1717
NSRouterLink,
1818
PageRouterOutlet
1919
];
20-
21-
export const routerTraceCategory = CATEGORY;

‎nativescript-angular/router/page-router-outlet.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {topmost} from "ui/frame";
1919
import {Page, NavigatedData} from "ui/page";
2020
import {DEVICE} from "../platform-providers";
2121
import {Device} from "platform";
22-
import {log} from "./common";
22+
import {routerLog} from "../trace";
2323
import {NSLocationStrategy} from "./ns-location-strategy";
2424
import {DetachedLoader} from "../common/detached-loader";
2525
import {ViewUtil} from "../view-util";
@@ -106,7 +106,7 @@ export class PageRouterOutlet extends RouterOutlet {
106106
}
107107

108108
private activateOnGoBack(nextInstruction: ComponentInstruction, previousInstruction: ComponentInstruction): Promise<any> {
109-
log("PageRouterOutlet.activate() - Back naviation, so load from cache: " + nextInstruction.componentType.name);
109+
routerLog("PageRouterOutlet.activate() - Back naviation, so load from cache: " + nextInstruction.componentType.name);
110110

111111
this.location.finishBackPageNavigation();
112112

@@ -134,14 +134,14 @@ export class PageRouterOutlet extends RouterOutlet {
134134
];
135135

136136
if (this.isInitalPage) {
137-
log("PageRouterOutlet.activate() inital page - just load component: " + componentType.name);
137+
routerLog("PageRouterOutlet.activate() inital page - just load component: " + componentType.name);
138138
this.isInitalPage = false;
139139
resultPromise = this.compiler.resolveComponent(componentType).then((componentFactory) => {
140140
const childInjector = ReflectiveInjector.resolveAndCreate(providersArray, this.containerRef.parentInjector);
141141
return this.containerRef.createComponent(componentFactory, this.containerRef.length, childInjector, null);
142142
});
143143
} else {
144-
log("PageRouterOutlet.activate() forward navigation - create detached loader in the loader container: " + componentType.name);
144+
routerLog("PageRouterOutlet.activate() forward navigation - create detached loader in the loader container: " + componentType.name);
145145

146146
const page = new Page();
147147
providersArray.push(provide(Page, { useValue: page }));
@@ -215,7 +215,7 @@ export class PageRouterOutlet extends RouterOutlet {
215215
}
216216

217217
if (this.location.isPageNavigatingBack()) {
218-
log("PageRouterOutlet.deactivate() while going back - should destroy: " + instruction.componentType.name)
218+
routerLog("PageRouterOutlet.deactivate() while going back - should destroy: " + instruction.componentType.name)
219219
return next.then((_) => {
220220
const popedItem = this.refCache.pop();
221221
const popedRef = popedItem.componentRef;
@@ -275,7 +275,7 @@ export class PageRouterOutlet extends RouterOutlet {
275275
StringMapWrapper.equals(nextInstruction.params, this.currentInstruction.params));
276276
}
277277

278-
log("PageRouterOutlet.routerCanReuse(): " + result);
278+
routerLog("PageRouterOutlet.routerCanReuse(): " + result);
279279
return PromiseWrapper.resolve(result);
280280
}
281281

@@ -311,6 +311,6 @@ export class PageRouterOutlet extends RouterOutlet {
311311
}
312312

313313
private log(method: string, nextInstruction: ComponentInstruction) {
314-
log("PageRouterOutlet." + method + " isBack: " + this.location.isPageNavigatingBack() + " nextUrl: " + nextInstruction.urlPath);
314+
routerLog("PageRouterOutlet." + method + " isBack: " + this.location.isPageNavigatingBack() + " nextUrl: " + nextInstruction.urlPath);
315315
}
316316
}

‎nativescript-angular/trace.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import {write, categories, messageType} from "trace";
2+
3+
export const rendererTraceCategory = "ns-renderer";
4+
export const routerTraceCategory = "ns-router";
5+
6+
export function rendererLog(msg): void {
7+
write(msg, rendererTraceCategory);
8+
}
9+
10+
export function rendererError(message: string): void {
11+
write(message, rendererTraceCategory, messageType.error);
12+
}
13+
14+
export function routerLog(message: string): void {
15+
write(message, routerTraceCategory);
16+
}
17+
18+
export function styleError(message: string): void {
19+
write(message, categories.Style, messageType.error);
20+
}

‎nativescript-angular/view-util.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,19 @@ import * as styleProperty from "ui/styling/style-property";
99
import {StyleProperty, getPropertyByName, withStyleProperty} from "ui/styling/style-property";
1010
import {ValueSource} from "ui/core/dependency-observable";
1111
import { ActionBar, ActionItem, NavigationButton } from "ui/action-bar";
12-
import trace = require("trace");
1312
import {device, platformNames, Device} from "platform";
13+
import {rendererLog as traceLog, styleError} from "./trace";
1414

1515
const IOS_PREFX: string = "@ios:";
1616
const ANDROID_PREFX: string = "@android:";
1717
const whiteSpaceSplitter = /\s+/;
1818

19-
export const rendererTraceCategory = "ns-renderer";
2019
export type ViewExtensions = ViewExtensions;
2120
export type NgView = NgView;
2221
export type NgLayoutBase = LayoutBase & ViewExtensions;
2322
export type NgContentView = ContentView & ViewExtensions;
2423
export type BeforeAttachAction = (view: View) => void;
2524

26-
export function traceLog(msg) {
27-
trace.write(msg, rendererTraceCategory);
28-
}
29-
3025
export function isView(view: any): view is NgView {
3126
return view instanceof View;
3227
}
@@ -298,7 +293,7 @@ export class ViewUtil {
298293
try {
299294
view.style._setValue(property, value, ValueSource.Local);
300295
} catch (ex) {
301-
trace.write("Error setting property: " + property.name + " view: " + view + " value: " + value + " " + ex, trace.categories.Style, trace.messageType.error);
296+
styleError("Error setting property: " + property.name + " view: " + view + " value: " + value + " " + ex);
302297
}
303298
}
304299

‎ng-sample/app/app.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,10 @@
77

88
// this import should be first in order to load some required settings (like globals and reflect-metadata)
99
import { nativeScriptBootstrap } from "nativescript-angular/application";
10-
import { NS_ROUTER_PROVIDERS, routerTraceCategory } from "nativescript-angular/router";
11-
import { rendererTraceCategory } from "nativescript-angular/renderer";
10+
import { NS_ROUTER_PROVIDERS } from "nativescript-angular/router";
11+
import { rendererTraceCategory, routerTraceCategory } from "nativescript-angular/trace";
1212

1313
import trace = require("trace");
14-
//trace.setCategories(routerTraceCategory + ", " + rendererTraceCategory);
15-
// trace.setCategories(rendererTraceCategory);
1614
trace.setCategories(routerTraceCategory);
1715
trace.enable();
1816

@@ -41,4 +39,4 @@ import {LoginTest} from "./examples/navigation/login-test";
4139
//nativeScriptBootstrap(ModalTest);
4240
//nativeScriptBootstrap(PlatfromDirectivesTest);
4341
//nativeScriptBootstrap(RouterOutletTest, [NS_ROUTER_PROVIDERS]);
44-
nativeScriptBootstrap(LoginTest, [NS_ROUTER_PROVIDERS]);
42+
nativeScriptBootstrap(LoginTest, [NS_ROUTER_PROVIDERS]);

‎tests/Makefile

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
RENDERER_DIR := ../nativescript-angular
2+
RENDERER_SRC := $(shell find "$(RENDERER_DIR)" -iname '*.ts')
3+
RENDERER_COMPILED := node_modules/nativescript-angular-latest.txt
4+
RENDERER_LINKED := node_modules/renderer-linked.txt
5+
SEMVER_CLEANED := node_modules/semver-cleaned.txt
6+
APK := platforms/android/build/outputs/apk/ngtests-debug.apk
7+
APP_SRC := $(shell find "app" -type f)
8+
9+
$(APK): $(APP_SRC) $(RENDERER_COMPILED)
10+
tns build android
11+
@touch $@
12+
13+
appium-android: $(APK) $(SEMVER_CLEANED)
14+
./node_modules/.bin/nativescript-dev-appium android
15+
16+
$(RENDERER_LINKED):
17+
#npm link nativescript-angular
18+
@mkdir -p node_modules
19+
@touch $@
20+
21+
$(SEMVER_CLEANED):
22+
tns install
23+
find -L node_modules -iname '*.gz' -delete
24+
@touch $@
25+
26+
clean:
27+
@rm -rf node_modules platforms
28+
29+
$(RENDERER_COMPILED): $(RENDERER_SRC) $(RENDERER_LINKED)
30+
#cd "$(RENDERER_DIR)" && ./node_modules/.bin/tsc
31+
npm install "$(RENDERER_DIR)" --production
32+
@touch $@
33+
34+
run-android: $(RENDERER_COMPILED) $(SEMVER_CLEANED)
35+
tns livesync android
36+
37+
.PHONY: run-android clean appium-android

‎tests/app/app.component.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import {Component} from "@angular/core";
2+
import {SinglePageMain} from "./single-page-main.component";
3+
import {MultiPageMain} from "./multi-page-main.component";
24

35
@Component({
46
selector: "my-app",
7+
directives: [SinglePageMain, MultiPageMain],
58
template: `
6-
<StackLayout orientation="vertical">
7-
<Label [text]="message" class="title" (tap)="message = 'OHAI'"></Label>
8-
</StackLayout>
9+
<multi-page-main></multi-page-main>
10+
<!--
11+
<single-page-main *ngIf="true"></single-page-main>
12+
-->
913
`,
1014
})
1115
export class AppComponent {

‎tests/app/base.component.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import {ROUTER_DIRECTIVES, Router, OnActivate, OnDeactivate, CanReuse, OnReuse,
2+
RouteParams, ComponentInstruction, RouteConfig } from '@angular/router-deprecated';
3+
import {Component, OpaqueToken} from "@angular/core";
4+
export const HOOKS_LOG = new OpaqueToken("Hooks log");
5+
6+
export class BaseComponent implements OnActivate, OnDeactivate {
7+
protected name: string = "";
8+
9+
constructor(protected hooksLog: string[]) {
10+
}
11+
12+
routerOnActivate(nextInstruction: ComponentInstruction, prevInstruction: ComponentInstruction): any {
13+
this.log("activate", nextInstruction, prevInstruction);
14+
}
15+
16+
routerOnDeactivate(nextInstruction: ComponentInstruction, prevInstruction: ComponentInstruction): any {
17+
this.log("deactivate", nextInstruction, prevInstruction);
18+
}
19+
20+
private log(method: string, nextInstruction: ComponentInstruction, prevInstruction: ComponentInstruction) {
21+
this.hooksLog.push(this.name + "." + method + " " + nextInstruction.urlPath + " " + (prevInstruction ? prevInstruction.urlPath : null));
22+
}
23+
}

‎tests/app/first.component.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import {ROUTER_DIRECTIVES, Router, OnActivate, OnDeactivate, CanReuse, OnReuse,
2+
RouteParams, RouteData, ComponentInstruction, RouteConfig } from '@angular/router-deprecated';
3+
import {Component, Inject} from "@angular/core";
4+
import {HOOKS_LOG, BaseComponent} from "./base.component";
5+
6+
@Component({
7+
selector: "first-comp",
8+
template: `
9+
<StackLayout>
10+
<Label [automationText]="'first-' + id" [text]="'First: ' + id"></Label>
11+
<Button [automationText]="'first-navigate-' + id" text="Go to second" (tap)="gotoSecond()"></Button>
12+
<TextView [automationText]="'hooks-log-' + id" [text]="hooksLog"></TextView>
13+
<TextView [text]="'hooks-log-' + id"></TextView>
14+
</StackLayout>
15+
`
16+
})
17+
export class FirstComponent extends BaseComponent {
18+
name = "first";
19+
20+
constructor(private router: Router, private routeData: RouteData, @Inject(HOOKS_LOG) hooksLog: string[]) {
21+
super(hooksLog);
22+
}
23+
24+
ngOnInit() {
25+
this.id = this.routeData.get('id');
26+
}
27+
28+
public id: string = ""
29+
30+
gotoSecond() {
31+
this.router.navigateByUrl("/second");
32+
}
33+
}

‎tests/app/main.ts

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,56 @@
11
// this import should be first in order to load some required settings (like globals and reflect-metadata)
2-
import {nativeScriptBootstrap} from "nativescript-angular/application";
2+
import {nativeScriptBootstrap, bootstrap} from "nativescript-angular/application";
33
import {AppComponent} from "./app.component";
44
import {GestureComponent} from "./snippets/gestures.component";
55
import {LayoutsComponent} from "./snippets/layouts.component";
66
import {IconFontComponent} from "./snippets/icon-font.component";
7+
import {NS_ROUTER_DIRECTIVES, NS_ROUTER_PROVIDERS} from "nativescript-angular/router/ns-router";
8+
import {APP_ROOT_VIEW} from "nativescript-angular/platform-providers";
9+
import {Page} from "ui/page";
10+
import {Label} from "ui/label";
11+
import {StackLayout} from "ui/layouts/stack-layout";
12+
import * as application from "application";
13+
//nativeScriptBootstrap(AppComponent, [NS_ROUTER_PROVIDERS]);
14+
import {HOOKS_LOG} from "./base.component";
15+
import {MultiPageMain} from "./multi-page-main.component";
16+
import {SinglePageMain} from "./single-page-main.component";
17+
import {provide, OpaqueToken} from "@angular/core";
718

8-
nativeScriptBootstrap(AppComponent);
19+
import { rendererTraceCategory, routerTraceCategory } from "nativescript-angular/trace";
20+
21+
import trace = require("trace");
22+
//trace.setCategories(rendererTraceCategory + "," + routerTraceCategory);
23+
trace.enable();
24+
25+
//nativeScriptBootstrap(MultiPageMain, [NS_ROUTER_PROVIDERS]);
926
// nativeScriptBootstrap(GestureComponent);
1027
// nativeScriptBootstrap(LayoutsComponent);
1128
// nativeScriptBootstrap(IconFontComponent);
29+
application.start({
30+
create: (): Page => {
31+
const page = new Page();
32+
const root = new StackLayout();
33+
page.content = root;
34+
35+
let onLoadedHandler = function(args) {
36+
page.off('loaded', onLoadedHandler);
37+
//profiling.stop('application-start');
38+
console.log('Page loaded');
39+
40+
//profiling.start('ng-bootstrap');
41+
console.log('BOOTSTRAPPING TEST APPS...');
42+
//bootstrap(MultiPageMain, [NS_ROUTER_PROVIDERS]);
43+
const rootViewProvider = provide(APP_ROOT_VIEW, { useValue: root });
44+
let singlePageHooksLog = []
45+
const singlePageHooksLogProvider = provide(HOOKS_LOG, { useValue: singlePageHooksLog });
46+
bootstrap(SinglePageMain, [rootViewProvider, singlePageHooksLogProvider, NS_ROUTER_PROVIDERS]);
47+
let multiPageHooksLog = []
48+
const multiPageHooksLogProvider = provide(HOOKS_LOG, { useValue: multiPageHooksLog });
49+
bootstrap(MultiPageMain, [rootViewProvider, multiPageHooksLogProvider, NS_ROUTER_PROVIDERS]);
50+
}
51+
52+
page.on('loaded', onLoadedHandler);
53+
54+
return page;
55+
}
56+
});
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import {ROUTER_DIRECTIVES, Router, OnActivate, OnDeactivate, CanReuse, OnReuse,
2+
RouteParams, ComponentInstruction, RouteConfig } from '@angular/router-deprecated';
3+
import {NS_ROUTER_DIRECTIVES, NS_ROUTER_PROVIDERS} from "nativescript-angular/router/ns-router";
4+
import {Component, ElementRef} from "@angular/core";
5+
import {Location, LocationStrategy} from '@angular/common';
6+
import {FirstComponent} from "./first.component";
7+
import {SecondComponent} from "./second.component";
8+
9+
@Component({
10+
selector: "multi-page-main",
11+
directives: [ROUTER_DIRECTIVES, NS_ROUTER_DIRECTIVES],
12+
template: `
13+
<Label text="Multi-page router"></Label>
14+
<page-router-outlet></page-router-outlet>
15+
`
16+
17+
})
18+
@RouteConfig([
19+
{ path: '/first', name: 'First', component: FirstComponent, useAsDefault: true , data: {id: "multi-page"}},
20+
{ path: '/second', name: 'Second', component: SecondComponent, data: {id: "multi-page"} }
21+
])
22+
export class MultiPageMain {
23+
constructor(
24+
public elementRef: ElementRef,
25+
public router: Router,
26+
public location: LocationStrategy) {
27+
}
28+
}

‎tests/app/second.component.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import {ROUTER_DIRECTIVES, Router, OnActivate, OnDeactivate, CanReuse, OnReuse,
2+
RouteParams, RouteData, ComponentInstruction, RouteConfig } from '@angular/router-deprecated';
3+
import {Component, Inject} from "@angular/core";
4+
import {HOOKS_LOG, BaseComponent} from "./base.component";
5+
6+
@Component({
7+
selector: "second-comp",
8+
template: `
9+
<StackLayout>
10+
<Label [automationText]="'second-' + id" [text]="'Second: ' + id"></Label>
11+
<Button [automationText]="'second-navigate-' + id" text="Go to first" (tap)="gotoFirst()"></Button>
12+
<TextView [automationText]="'hooks-log-' + id" [text]="hooksLog"></TextView>
13+
<TextView [text]="'hooks-log-' + id"></TextView>
14+
</StackLayout>
15+
`
16+
})
17+
export class SecondComponent extends BaseComponent {
18+
constructor(private router: Router, private routeData: RouteData, @Inject(HOOKS_LOG) hooksLog: string[]) {
19+
super(hooksLog);
20+
}
21+
22+
ngOnInit() {
23+
this.id = this.routeData.get('id');
24+
}
25+
26+
public id: string = ""
27+
name = "second";
28+
29+
gotoFirst() {
30+
this.router.navigateByUrl("/first");
31+
}
32+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import {ROUTER_DIRECTIVES, Router, OnActivate, OnDeactivate, CanReuse, OnReuse,
2+
RouteParams, ComponentInstruction, RouteConfig } from '@angular/router-deprecated';
3+
import {Component, ElementRef} from "@angular/core";
4+
import {Location, LocationStrategy} from '@angular/common';
5+
import {FirstComponent} from "./first.component";
6+
import {SecondComponent} from "./second.component";
7+
8+
@Component({
9+
selector: "single-page-main",
10+
directives: [ROUTER_DIRECTIVES],
11+
template: `
12+
<Label text="Single-page router"></Label>
13+
<router-outlet></router-outlet>
14+
`
15+
16+
})
17+
@RouteConfig([
18+
{ path: '/first', name: 'First', component: FirstComponent, useAsDefault: true , data: {id: "single-page"}},
19+
{ path: '/second', name: 'Second', component: SecondComponent, data: {id: "single-page"} }
20+
])
21+
export class SinglePageMain {
22+
constructor(
23+
public elementRef: ElementRef,
24+
public router: Router,
25+
public location: LocationStrategy) {
26+
}
27+
}

‎tests/app/tests/router.ts

Lines changed: 0 additions & 250 deletions
This file was deleted.

‎tests/e2e-tests/multi-page-routing.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
"use strict";
2+
var nsAppium = require("nativescript-dev-appium");
3+
4+
describe("multi page routing", function () {
5+
this.timeout(120000);
6+
var driver;
7+
8+
before(function () {
9+
driver = nsAppium.createDriver();
10+
});
11+
12+
after(function () {
13+
return driver
14+
.quit()
15+
.finally(function () {
16+
console.log("Driver quit successfully");
17+
});
18+
});
19+
20+
it("loads default path", function () {
21+
return driver
22+
.elementByAccessibilityId("first-multi-page")
23+
.should.eventually.exist
24+
.text().should.eventually.equal("First: multi-page")
25+
});
26+
27+
it("navigates and returns", function () {
28+
var expectedHookLog = [
29+
"first.activate first null",
30+
"first.deactivate second first",
31+
"second.activate second first",
32+
"second.deactivate first second",
33+
"first.activate first second"].join(",");
34+
return driver
35+
.elementByAccessibilityId("first-navigate-multi-page")
36+
.should.eventually.exist
37+
.tap()
38+
.elementByAccessibilityId("second-multi-page")
39+
.should.eventually.exist
40+
.text().should.eventually.equal("Second: multi-page")
41+
.elementByAccessibilityId("second-navigate-multi-page")
42+
.should.eventually.exist
43+
.tap()
44+
.elementByAccessibilityId("first-multi-page")
45+
.should.eventually.exist
46+
.text().should.eventually.equal("First: multi-page")
47+
.elementByAccessibilityId("hooks-log-multi-page")
48+
.text().should.eventually.equal(expectedHookLog)
49+
});
50+
});
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
"use strict";
2+
var nsAppium = require("nativescript-dev-appium");
3+
4+
describe("single page routing", function () {
5+
this.timeout(120000);
6+
var driver;
7+
8+
before(function () {
9+
driver = nsAppium.createDriver();
10+
});
11+
12+
after(function () {
13+
return driver
14+
.quit()
15+
.finally(function () {
16+
console.log("Driver quit successfully");
17+
});
18+
});
19+
20+
it("loads default path", function () {
21+
return driver
22+
.elementByAccessibilityId("first-single-page")
23+
.should.eventually.exist
24+
.text().should.eventually.equal("First: single-page")
25+
});
26+
27+
it("navigates, returns and fires hooks", function () {
28+
var expectedHookLog = [
29+
"first.activate first null",
30+
"first.deactivate second first",
31+
"second.activate second first",
32+
"second.deactivate first second",
33+
"first.activate first second"].join(",");
34+
35+
36+
return driver
37+
.elementByAccessibilityId("first-navigate-single-page")
38+
.should.eventually.exist
39+
.tap()
40+
.elementByAccessibilityId("second-single-page")
41+
.should.eventually.exist
42+
.text().should.eventually.equal("Second: single-page")
43+
.elementByAccessibilityId("second-navigate-single-page")
44+
.should.eventually.exist
45+
.tap()
46+
.elementByAccessibilityId("first-single-page")
47+
.should.eventually.exist
48+
.text().should.eventually.equal("First: single-page")
49+
.elementByAccessibilityId("hooks-log-single-page")
50+
.text().should.eventually.equal(expectedHookLog)
51+
});
52+
});

‎tests/package.json

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
{
22
"nativescript": {
3-
"id": "org.nativescript.helloworldng",
3+
"id": "org.nativescript.ngtests",
44
"tns-android": {
55
"version": "2.0.0"
66
},
77
"tns-ios": {
88
"version": "2.0.0"
99
}
1010
},
11-
"name": "nativescript-hello-world-ng",
11+
"name": "ngtests",
1212
"main": "app.js",
1313
"version": "1.0.0",
1414
"author": "Telerik <support@telerik.com>",
15-
"description": "Nativescript Angular Hello World template",
15+
"description": "Angular tests",
1616
"license": "BSD",
1717
"keywords": [
1818
"telerik",
@@ -24,10 +24,6 @@
2424
"appbuilder",
2525
"template"
2626
],
27-
"repository": {
28-
"type": "git",
29-
"url": "git://github.com/NativeScript/template-hello-world-ng"
30-
},
3127
"homepage": "http://nativescript.org",
3228
"dependencies": {
3329
"nativescript-unit-test-runner": "^0.3.3",
@@ -54,6 +50,7 @@
5450
"babel-types": "6.8.1",
5551
"babylon": "6.8.0",
5652
"chai": "^3.5.0",
53+
"chai-as-promised": "^5.3.0",
5754
"filewalker": "0.1.2",
5855
"grunt-cli": "^1.2.0",
5956
"karma": "^0.13.19",
@@ -63,11 +60,15 @@
6360
"karma-nativescript-launcher": "^0.4.0",
6461
"lazy": "1.0.11",
6562
"mocha": "^2.4.5",
63+
"nativescript-dev-appium": "^0.0.10",
6664
"nativescript-dev-typescript": "^0.3.1",
6765
"shelljs": "^0.5.3",
68-
"typescript": "1.8.2"
66+
"typescript": "^1.8.10",
67+
"wd": "0.4.0"
6968
},
7069
"scripts": {
71-
"updateTests": "grunt updateTests"
70+
"updateTests": "grunt updateTests",
71+
"appium-android": "tns build android && nativescript-dev-appium android",
72+
"appium-ios-simulator": "tns build ios && nativescript-dev-appium ios-simulator"
7273
}
7374
}

0 commit comments

Comments
 (0)
Please sign in to comment.