/*
 * 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');
    var testmodule = require('cordova/test/testmodule');
    var 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);
    });
});
