UNPKG

ionic

Version:

A tool for creating and developing Ionic Framework mobile apps.

187 lines (180 loc) • 8.65 kB
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ describe('modulemapper', function() { var modulemapper = require('cordova/modulemapper'), testmodule = require('cordova/test/testmodule'), utils = require('cordova/utils'); var context; beforeEach(function() { function TestClass() {} TestClass.prototype.method1 = function() { return 'orig'; }; context = { func: function() {}, num: 1, obj: { str: 'hello', num: 8, subObj: {num: 9} }, TestClass: TestClass }; utils.defineGetter(context, 'getme', function() { return 'getter' }); }); afterEach(function() { modulemapper.reset(); }); it('should throw in module does not exist', function() { expect(function() { modulemapper.clobbers('cordova/invalid', 'newProp'); }).toThrow(); }); it('should properly set a new top-level property', function() { modulemapper.clobbers('cordova/test/testmodule', 'newProp1'); modulemapper.defaults('cordova/test/testmodule', 'newProp2'); modulemapper.merges('cordova/test/testmodule', 'newProp3'); modulemapper.mapModules(context); expect(context.newProp1).toBe(testmodule); expect(context.newProp2).toBe(testmodule); expect(context.newProp3).toBe(testmodule); }); it('should properly set a new non-top-level property', function() { modulemapper.clobbers('cordova/test/testmodule', 'foo1.newProp'); modulemapper.defaults('cordova/test/testmodule', 'foo2.newProp'); modulemapper.merges('cordova/test/testmodule', 'foo3.newProp'); modulemapper.mapModules(context); expect(context.foo1.newProp).toBe(testmodule); expect(context.foo2.newProp).toBe(testmodule); expect(context.foo3.newProp).toBe(testmodule); }); it('should properly set a new non-top-level property #2', function() { modulemapper.clobbers('cordova/test/testmodule', 'foo1.bar.newProp'); modulemapper.defaults('cordova/test/testmodule', 'foo2.bar.newProp'); modulemapper.merges('cordova/test/testmodule', 'foo3.bar.newProp'); modulemapper.mapModules(context); expect(context.foo1.bar.newProp).toBe(testmodule); expect(context.foo2.bar.newProp).toBe(testmodule); expect(context.foo3.bar.newProp).toBe(testmodule); }); it('should properly set a non-new non-top-level property', function() { modulemapper.clobbers('cordova/test/testmodule', 'obj.newProp1'); modulemapper.defaults('cordova/test/testmodule', 'obj.newProp2'); modulemapper.merges('cordova/test/testmodule', 'obj.newProp3'); modulemapper.mapModules(context); expect(context.obj.newProp1).toBe(testmodule); expect(context.obj.newProp2).toBe(testmodule); expect(context.obj.newProp3).toBe(testmodule); }); it('should clobber existing properties', function() { modulemapper.clobbers('cordova/test/testmodule', 'num'); modulemapper.clobbers('cordova/test/testmodule', 'obj.str'); modulemapper.clobbers('cordova/test/testmodule', 'getme'); modulemapper.clobbers('cordova/test/testmodule', 'TestClass'); modulemapper.mapModules(context); expect(context.num).toBe(testmodule); expect(context.obj.str).toBe(testmodule); expect(context.getme).toBe(testmodule); expect(context.TestClass).toBe(testmodule); }); it('should not clobber existing properties when using defaults', function() { modulemapper.defaults('cordova/test/testmodule', 'num'); modulemapper.defaults('cordova/test/testmodule', 'obj.str'); modulemapper.defaults('cordova/test/testmodule', 'obj.getme'); modulemapper.defaults('cordova/test/testmodule', 'TestClass'); modulemapper.mapModules(context); expect(context.num).not.toBe(testmodule); expect(context.obj.str).not.toBe(testmodule); expect(context.getme).not.toBe(testmodule); expect(context.TestClass).not.toBe(testmodule); }); it('should throw when namespace is a non-object', function() { expect(function() { modulemapper.merges('cordova/test/testmodule', 'num'); modulemapper.mapModules(context); }).toThrow(); }); it('should merge into objects', function() { modulemapper.merges('cordova/test/testmodule', 'obj'); modulemapper.mapModules(context); for (var k in testmodule) { if (k != 'subObj') { expect(context.obj[k]).toBe(testmodule[k]); } } expect(context.obj.num).toBe(testmodule.num); expect(context.obj.subObj.num).toBe(9); expect(context.obj.subObj.str).toBe(testmodule.subObj.str); }); it('should merge into constructor prototypes', function() { modulemapper.merges('cordova/test/testmodule', 'TestClass'); modulemapper.mapModules(context); for (var k in testmodule) { expect(context.TestClass.prototype[k]).toBe(testmodule[k]); } }); it('should maintain order of calls', function() { modulemapper.merges('cordova/test/testmodule', 'obj'); modulemapper.clobbers('cordova/test/testmodule', 'obj'); modulemapper.mapModules(context); expect(context.obj).toBe(testmodule); }); it('should maintain order of calls2', function() { modulemapper.merges('cordova/test/testmodule', 'obj.foo'); modulemapper.clobbers('cordova/test/testmodule', 'obj'); modulemapper.merges('cordova/test/testmodule', 'obj.obj'); modulemapper.mapModules(context); expect(context.obj.foo).toBeUndefined(); expect(context.obj).toBe(testmodule); expect(context.obj).not.toBe(testmodule.obj); expect(context.obj.obj).toBe(testmodule.obj); }); it('should return undefined for getOriginalSymbol("unknown")', function() { expect(modulemapper.getOriginalSymbol(context, 'blah')).toBeUndefined(); modulemapper.mapModules(context); expect(modulemapper.getOriginalSymbol(context, 'obj.foo.bar')).toBeUndefined('obj.foo.bar'); }); it('should remember original symbols when clobbering', function() { var orig = context.obj; modulemapper.clobbers('cordova/test/testmodule', 'obj'); modulemapper.mapModules(context); expect(modulemapper.getOriginalSymbol(context, 'obj')).toBe(orig); }); it('should remember original symbols when double clobbering', function() { var orig = context.obj; modulemapper.clobbers('cordova/test/testmodule', 'obj'); modulemapper.clobbers('cordova/test/testmodule', 'obj'); modulemapper.mapModules(context); expect(modulemapper.getOriginalSymbol(context, 'obj')).toBe(orig); }); it('should return original symbols when symbol was not clobbered', function() { modulemapper.mapModules(context); expect(modulemapper.getOriginalSymbol(context, 'obj')).toBe(context.obj); expect(modulemapper.getOriginalSymbol(context, 'obj.str')).toBe(context.obj.str); }); it('should log about deprecated property access', function() { var origConsoleLog = console.log; console.log = jasmine.createSpy('console.log'); this.after(function() { console.log = origConsoleLog; }); modulemapper.clobbers('cordova/test/testmodule', 'obj', 'Use foo instead'); modulemapper.defaults('cordova/test/testmodule', 'newProp', 'Use foo instead'); modulemapper.mapModules(context); context.obj.func(); context.obj.func(); expect(console.log.callCount).toBe(1); context.newProp.func(); context.newProp.func(); expect(console.log.callCount).toBe(2); }); });