| /* |
| * 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 = cordova.require('cordova/modulemapper'); |
| var utils = cordova.require('cordova/utils'); |
| var context, testmodule; |
| |
| beforeEach(function () { |
| testmodule = { |
| func: function () {}, |
| num: 2, |
| obj: { str: 'hello' }, |
| subObj: { str: 'testSubObj' } |
| }; |
| cordova.define('cordova/test/testmodule', (r, e, module) => { |
| module.exports = testmodule; |
| }); |
| |
| 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(); |
| cordova.define.remove('cordova/test/testmodule'); |
| }); |
| |
| it('Test#001 : should throw in module does not exist', function () { |
| expect(function () { modulemapper.clobbers('cordova/invalid', 'newProp'); }).toThrow(); |
| }); |
| it('Test#002 : 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('Test#003 : 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('Test#004 : 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('Test#005 : 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('Test#006 : 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('Test#007 : 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('Test#008 : should throw when namespace is a non-object', function () { |
| expect(function () { |
| modulemapper.merges('cordova/test/testmodule', 'num'); |
| modulemapper.mapModules(context); |
| }).toThrow(); |
| }); |
| it('Test#009 : 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('Test#010 : 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('Test#011 : 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('Test#012 : 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('Test#013 : 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('Test#014 : 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('Test#015 : 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('Test#016 : 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('Test#017 : should log about deprecated property access', function () { |
| spyOn(console, 'log'); |
| 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).toHaveBeenCalledTimes(1); |
| context.newProp.func(); |
| context.newProp.func(); |
| expect(console.log).toHaveBeenCalledTimes(2); |
| }); |
| }); |