mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-18 19:21:34 +08:00
322 lines
9.3 KiB
TypeScript
322 lines
9.3 KiB
TypeScript
import {
|
|
NavController,
|
|
Config,
|
|
Page,
|
|
ViewController
|
|
} from 'ionic/ionic';
|
|
|
|
|
|
export function run() {
|
|
describe("NavController", () => {
|
|
let nav;
|
|
|
|
class FirstPage {}
|
|
class SecondPage {}
|
|
class ThirdPage {}
|
|
|
|
function mockTransitionFn(enteringView, leavingView, opts, cb) {
|
|
let destroys = [];
|
|
|
|
nav._views.forEach(view => {
|
|
if (view) {
|
|
if (view.shouldDestroy) {
|
|
destroys.push(view);
|
|
|
|
} else if (view.state === 2 && view.shouldCache) {
|
|
view.shouldCache = false;
|
|
}
|
|
}
|
|
});
|
|
|
|
destroys.forEach(view => {
|
|
nav._remove(view);
|
|
view.destroy();
|
|
});
|
|
cb();
|
|
}
|
|
|
|
function mockCanGoBackFn() {
|
|
return true;
|
|
}
|
|
|
|
// beforeEach(inject([Compiler], compiler => {
|
|
beforeEach(() => {
|
|
nav = new NavController(null, null, new Config(), null, null, null, null, null);
|
|
nav._renderer = {
|
|
setElementAttribute: function(){},
|
|
setElementStyle: function(){}
|
|
};
|
|
});
|
|
|
|
it('should exist', () => {
|
|
expect(nav).not.toBeUndefined();
|
|
});
|
|
|
|
describe("getActive", () => {
|
|
it('should return null if there is no active view', () => {
|
|
var active = nav.getActive();
|
|
expect(active).toBe(null);
|
|
});
|
|
|
|
it('should return the last active page', () => {
|
|
let activeView = new ViewController();
|
|
activeView.state = 1; // ACTIVE_STATE
|
|
nav._add(activeView);
|
|
|
|
expect(nav.getActive()).toBe(activeView);
|
|
|
|
let secondActiveView = new ViewController();
|
|
secondActiveView.state = 1; // ACTIVE_STATE
|
|
nav._add(secondActiveView);
|
|
|
|
expect(nav.getActive()).toBe(secondActiveView);
|
|
});
|
|
|
|
it('should return the last active page thats not shouldDestroy', () => {
|
|
let view1 = new ViewController();
|
|
view1.state = 1; // ACTIVE_STATE
|
|
nav._add(view1);
|
|
expect(nav.getActive()).toBe(view1);
|
|
|
|
let view2 = new ViewController();
|
|
view2.state = 1; // ACTIVE_STATE
|
|
view2.shouldDestroy = true;
|
|
nav._add(view2);
|
|
expect(nav.getActive()).toBe(view1);
|
|
});
|
|
});
|
|
|
|
describe("push", () => {
|
|
it('should return a rejected Promise if componentType is falsy', done => {
|
|
let s = jasmine.createSpy('success');
|
|
let f = jasmine.createSpy('fail');
|
|
|
|
let promise = nav.push(undefined, {}, {});
|
|
|
|
promise.then(s, f).then(() => {
|
|
expect(s).not.toHaveBeenCalled();
|
|
expect(f).toHaveBeenCalled();
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('should throw an error if componentType truthy, but is not a function', () => {
|
|
let push = () => nav.push({}, {}, {});
|
|
expect(push).toThrow();
|
|
|
|
push = () => nav.push("string", {}, {});
|
|
expect(push).toThrow();
|
|
|
|
push = () => nav.push(42, {}, {});
|
|
expect(push).toThrow();
|
|
|
|
push = () => nav.push(true, {}, {});
|
|
expect(push).toThrow();
|
|
});
|
|
|
|
it('to add the pushed page to the nav stack', (done) => {
|
|
expect(FirstPage).toBeDefined();
|
|
expect(nav._views.length).toBe(0);
|
|
|
|
spyOn(nav, '_add').and.callThrough();
|
|
|
|
nav._transition = mockTransitionFn;
|
|
nav.push(FirstPage, {}, {}).then(() => {
|
|
expect(nav._add).toHaveBeenCalled();
|
|
expect(nav._views.length).toBe(1);
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("setPages", () => {
|
|
it('should return a resolved Promise if components is falsy', done => {
|
|
let s = jasmine.createSpy('success');
|
|
let f = jasmine.createSpy('fail');
|
|
|
|
let promise = nav.setPages();
|
|
|
|
promise.then(s, f).then(() => {
|
|
expect(s).toHaveBeenCalled();
|
|
expect(f).not.toHaveBeenCalled();
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('replace views with the supplied views', () => {
|
|
let vc1 = new ViewController(),
|
|
vc2 = new ViewController(),
|
|
vc3 = new ViewController();
|
|
nav._views = [vc1, vc2, vc3];
|
|
let arr = [FirstPage, SecondPage, ThirdPage];
|
|
|
|
nav._transition = mockTransitionFn;
|
|
nav.setPages(arr);
|
|
|
|
//_views[0] will be transitioned out of
|
|
expect(nav._views[1].componentType).toBe(FirstPage);
|
|
expect(nav._views[2].componentType).toBe(SecondPage);
|
|
expect(nav._views[3].componentType).toBe(ThirdPage);
|
|
});
|
|
|
|
});
|
|
|
|
describe("insert", () => {
|
|
it('insert page at the specified index', () => {
|
|
let view1 = new ViewController();
|
|
view1._loaded = true;
|
|
let view2 = new ViewController();
|
|
view2._loaded = true;
|
|
let view3 = new ViewController();
|
|
view3._loaded = true;
|
|
|
|
nav._views = [view1, view2, view3];
|
|
expect(nav._views[2].componentType).toBeUndefined();
|
|
nav.insert(2, FirstPage);
|
|
expect(nav._views[2].componentType).toBe(FirstPage);
|
|
});
|
|
|
|
it('push page if index >= _views.length', () => {
|
|
let view1 = new ViewController();
|
|
view1._loaded = true;
|
|
let view2 = new ViewController();
|
|
view2._loaded = true;
|
|
let view3 = new ViewController();
|
|
view3._loaded = true;
|
|
|
|
nav._views = [view1, view2, view3];
|
|
spyOn(nav, 'push').and.callThrough();
|
|
nav.insert(2, FirstPage);
|
|
expect(nav.push).not.toHaveBeenCalled();
|
|
|
|
nav._transition = mockTransitionFn;
|
|
nav.insert(4, FirstPage);
|
|
expect(nav._views[4].componentType).toBe(FirstPage);
|
|
expect(nav.push).toHaveBeenCalled();
|
|
|
|
nav.setTransitioning(false);
|
|
|
|
nav.insert(10, FirstPage);
|
|
expect(nav._views[5].componentType).toBe(FirstPage);
|
|
expect(nav.push.calls.count()).toBe(2);
|
|
});
|
|
|
|
});
|
|
|
|
describe("setRoot", () => {
|
|
it('remove previous views and set root', () => {
|
|
let vc1 = new ViewController(),
|
|
vc2 = new ViewController(),
|
|
vc3 = new ViewController();
|
|
nav._views = [vc1, vc2, vc3];
|
|
expect(nav._views.length).toBe(3);
|
|
|
|
nav._transition = mockTransitionFn;
|
|
nav.setRoot(FirstPage);
|
|
//_views[0] will be transitioned out of
|
|
expect(nav._views.length).toBe(2);
|
|
expect(nav._views[1].componentType).toBe(FirstPage);
|
|
});
|
|
});
|
|
|
|
describe("first", () => {
|
|
it('should get the first item', () => {
|
|
let vc1 = new ViewController(),
|
|
vc2 = new ViewController(null, FirstPage),
|
|
vc3 = new ViewController(null, SecondPage);
|
|
nav._views = [vc1, vc2, vc3];
|
|
|
|
expect(nav.first()).toBe(vc1);
|
|
});
|
|
it('should get the first item that isnt being destroyed', () => {
|
|
let vc1 = new ViewController(),
|
|
vc2 = new ViewController(),
|
|
vc3 = new ViewController();
|
|
vc1.shouldDestroy = true;
|
|
nav._views = [vc1, vc2, vc3];
|
|
|
|
expect(nav.first()).toBe(vc2);
|
|
});
|
|
});
|
|
|
|
describe("popTo", () => {
|
|
it('should popTo 1st view', () => {
|
|
let vc1 = new ViewController(null, FirstPage),
|
|
vc2 = new ViewController(null, SecondPage),
|
|
vc3 = new ViewController(null, ThirdPage);
|
|
nav._views = [vc1, vc2, vc3];
|
|
|
|
nav._transition = mockTransitionFn;
|
|
nav.popTo(vc1);
|
|
|
|
expect(nav._views.length).toBe(1);
|
|
expect(nav._views[0].componentType).toBe(FirstPage);
|
|
});
|
|
});
|
|
|
|
describe("remove", () => {
|
|
it('should remove the view at the specified index', () => {
|
|
let vc1 = new ViewController(),
|
|
vc2 = new ViewController(null, FirstPage),
|
|
vc3 = new ViewController(null, SecondPage);
|
|
nav._views = [vc1, vc2, vc3];
|
|
expect(nav._views.length).toBe(3);
|
|
expect(nav._views[1].componentType).toBe(FirstPage);
|
|
|
|
nav.remove(1);
|
|
|
|
expect(nav._views.length).toBe(2);
|
|
expect(nav._views[1].componentType).toBe(SecondPage);
|
|
});
|
|
|
|
it('should pop if index is of active view', () => {
|
|
let vc1 = new ViewController(),
|
|
vc2 = new ViewController(null, FirstPage),
|
|
vc3 = new ViewController(null, SecondPage);
|
|
|
|
vc3.state = 1; //ACTIVE_STATE
|
|
nav._views = [vc1, vc2, vc3];
|
|
|
|
spyOn(nav, 'pop').and.callThrough();
|
|
|
|
nav.remove(1);
|
|
expect(nav.pop).not.toHaveBeenCalled();
|
|
|
|
nav.remove(1);
|
|
expect(nav.pop).toHaveBeenCalled();
|
|
|
|
});
|
|
});
|
|
|
|
describe("_setZIndex", () => {
|
|
it('should set zIndex 10 on first entering view', () => {
|
|
let enteringView = new ViewController();
|
|
enteringView.setPageRef({});
|
|
nav._setZIndex(enteringView, null, 'forward');
|
|
expect(enteringView.zIndex).toEqual(10);
|
|
});
|
|
|
|
it('should set zIndex 1 on second entering view', () => {
|
|
let leavingView = new ViewController();
|
|
leavingView.zIndex = 0;
|
|
leavingView._loaded = true;
|
|
let enteringView = new ViewController();
|
|
enteringView.setPageRef({});
|
|
nav._setZIndex(enteringView, leavingView, 'forward');
|
|
expect(enteringView.zIndex).toEqual(1);
|
|
});
|
|
|
|
it('should set zIndex 0 on entering view going back', () => {
|
|
let leavingView = new ViewController();
|
|
leavingView.zIndex = 1;
|
|
leavingView._loaded = true;
|
|
let enteringView = new ViewController();
|
|
enteringView.setPageRef({});
|
|
nav._setZIndex(enteringView, leavingView, 'back');
|
|
expect(enteringView.zIndex).toEqual(0);
|
|
});
|
|
});
|
|
|
|
});
|
|
}
|