/**
    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.
*/

/* eslint no-useless-escape : 0 */

var path = require('path');
var xml_helpers = require('../../src/util/xml-helpers');
var et = require('elementtree');

/* eslint-disable no-multi-str */

var title = et.XML('<title>HELLO</title>');
var usesNetworkOne = et.XML('<uses-permission ' +
            'android:name="PACKAGE_NAME.permission.C2D_MESSAGE"/>');
var usesNetworkTwo = et.XML('<uses-permission android:name=\
            "PACKAGE_NAME.permission.C2D_MESSAGE" />');
var usesReceive = et.XML('<uses-permission android:name=\
            "com.google.android.c2dm.permission.RECEIVE"/>');
var helloTagOne = et.XML('<h1>HELLO</h1>');
var goodbyeTag = et.XML('<h1>GOODBYE</h1>');
var helloTagTwo = et.XML('<h1>  HELLO  </h1>');

var TEST_XML = '<?xml version="1.0" encoding="UTF-8"?>\n' +
    '<widget xmlns     = "http://www.w3.org/ns/widgets"\n' +
    '        xmlns:cdv = "http://cordova.apache.org/ns/1.0"\n' +
    '        id        = "io.cordova.hellocordova"\n' +
    '        version   = "0.0.1">\n' +
    '    <name>Hello Cordova</name>\n' +
    '    <description>\n' +
    '        A sample Apache Cordova application that responds to the deviceready event.\n' +
    '    </description>\n' +
    '    <author href="http://cordova.io" email="dev@cordova.apache.org">\n' +
    '        Apache Cordova Team\n' +
    '    </author>\n' +
    '    <content src="index.html" />\n' +
    '    <access origin="*" />\n' +
    '    <preference name="fullscreen" value="true" />\n' +
    '    <preference name="webviewbounce" value="true" />\n' +
    '</widget>\n';

/* eslint-enable no-multi-str */

describe('xml-helpers', function () {
    describe('parseElementtreeSync', function () {
        it('Test 001 : should parse xml with a byte order mark', function () {
            var xml_path = path.join(__dirname, '../fixtures/projects/windows/bom_test.xml');
            expect(function () {
                xml_helpers.parseElementtreeSync(xml_path);
            }).not.toThrow();
        });
    });
    describe('equalNodes', function () {
        it('Test 002 : should return false for different tags', function () {
            expect(xml_helpers.equalNodes(usesNetworkOne, title)).toBe(false);
        });

        it('Test 003 : should return true for identical tags', function () {
            expect(xml_helpers.equalNodes(usesNetworkOne, usesNetworkTwo)).toBe(true);
        });

        it('Test 004 : should return false for different attributes', function () {
            expect(xml_helpers.equalNodes(usesNetworkOne, usesReceive)).toBe(false);
        });

        it('Test 005 : should distinguish between text', function () {
            expect(xml_helpers.equalNodes(helloTagOne, goodbyeTag)).toBe(false);
        });

        it('Test 006 : should ignore whitespace in text', function () {
            expect(xml_helpers.equalNodes(helloTagOne, helloTagTwo)).toBe(true);
        });

        describe('should compare children', function () {
            it('Test 007: by child quantity', function () {
                var one = et.XML('<i><b>o</b></i>');
                var two = et.XML('<i><b>o</b><u></u></i>');

                expect(xml_helpers.equalNodes(one, two)).toBe(false);
            });

            it('Test 008 : by child equality', function () {
                var one = et.XML('<i><b>o</b></i>');
                var two = et.XML('<i><u></u></i>');
                var uno = et.XML('<i>\n<b>o</b>\n</i>');

                expect(xml_helpers.equalNodes(one, uno)).toBe(true);
                expect(xml_helpers.equalNodes(one, two)).toBe(false);
            });
        });
    });
    describe('pruneXML', function () {
        var config_xml;

        beforeEach(function () {
            config_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, '../fixtures/projects/android/res/xml/config.xml'));
        });

        it('Test 009 : should remove any children that match the specified selector', function () {
            var children = config_xml.findall('plugins/plugin');
            xml_helpers.pruneXML(config_xml, children, 'plugins');
            expect(config_xml.find('plugins').getchildren().length).toEqual(0);
        });
        it('Test 010 : should do nothing if the children cannot be found', function () {
            var children = [title];
            xml_helpers.pruneXML(config_xml, children, 'plugins');
            expect(config_xml.find('plugins').getchildren().length).toEqual(17);
        });
        it('Test 011 : should be able to handle absolute selectors', function () {
            var children = config_xml.findall('plugins/plugin');
            xml_helpers.pruneXML(config_xml, children, '/cordova/plugins');
            expect(config_xml.find('plugins').getchildren().length).toEqual(0);
        });
        it('Test 012 : should be able to handle absolute selectors with wildcards', function () {
            var children = config_xml.findall('plugins/plugin');
            xml_helpers.pruneXML(config_xml, children, '/*/plugins');
            expect(config_xml.find('plugins').getchildren().length).toEqual(0);
        });
    });

    describe('pruneXMLRestore', function () {
        var android_manifest_xml;

        beforeEach(function () {
            android_manifest_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, '../fixtures/projects/android/AndroidManifest.xml'));
        });
        it('Test 013 : should restore attributes at the specified selector', function () {
            var xml = {
                oldAttrib: { 'android:icon': '@drawable/icon', 'android:label': '@string/app_name', 'android:debuggable': 'false' }
            };
            xml_helpers.pruneXMLRestore(android_manifest_xml, 'application', xml);
            var applicationAttr = android_manifest_xml.find('application').attrib;
            expect(Object.keys(applicationAttr).length).toEqual(3);
            expect(applicationAttr['android:debuggable']).toEqual('false');
        });
        it('Test 014 : should do nothing if the old attributes cannot be found', function () {
            var xml = {
                notOldAttrib: { 'android:icon': '@drawable/icon', 'android:label': '@string/app_name', 'android:debuggable': 'false' }
            };
            xml_helpers.pruneXMLRestore(android_manifest_xml, 'application', xml);
            var applicationAttr = android_manifest_xml.find('application').attrib;
            expect(Object.keys(applicationAttr).length).toEqual(3);
            expect(applicationAttr['android:debuggable']).toEqual('true');
        });
        it('Test 015 : should be able to handle absolute selectors', function () {
            var xml = {
                oldAttrib: { 'android:icon': '@drawable/icon', 'android:label': '@string/app_name', 'android:debuggable': 'false' }
            };
            xml_helpers.pruneXMLRestore(android_manifest_xml, '/manifest/application', xml);
            var applicationAttr = android_manifest_xml.find('application').attrib;
            expect(Object.keys(applicationAttr).length).toEqual(3);
            expect(applicationAttr['android:debuggable']).toEqual('false');
        });
        it('Test 016 : should be able to handle absolute selectors with wildcards', function () {
            var xml = {
                oldAttrib: { 'android:name': 'ChildApp', 'android:label': '@string/app_name', 'android:configChanges': 'orientation|keyboardHidden', 'android:enabled': 'true' }
            };
            xml_helpers.pruneXMLRestore(android_manifest_xml, '/*/*/activity', xml);
            var activityAttr = android_manifest_xml.find('application/activity').attrib;
            expect(Object.keys(activityAttr).length).toEqual(4);
            expect(activityAttr['android:enabled']).toEqual('true');
        });
        it('Test 017 : should be able to handle xpath selectors', function () {
            var xml = {
                oldAttrib: { 'android:name': 'com.phonegap.DroidGap', 'android:label': '@string/app_name', 'android:configChanges': 'orientation|keyboardHidden', 'android:enabled': 'true' }
            };
            xml_helpers.pruneXMLRestore(android_manifest_xml, 'application/activity[@android:name=\"com.phonegap.DroidGap\"]', xml);
            var activityAttr = android_manifest_xml.find('application/activity[@android:name=\"com.phonegap.DroidGap\"]').attrib;
            expect(Object.keys(activityAttr).length).toEqual(4);
            expect(activityAttr['android:enabled']).toEqual('true');
        });
    });

    describe('graftXML', function () {
        var config_xml, plugin_xml;

        beforeEach(function () {
            config_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, '../fixtures/projects/android/res/xml/config.xml'));
            plugin_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, '../fixtures/plugins/ChildBrowser/plugin.xml'));
        });

        it('Test 018 : should add children to the specified selector', function () {
            var children = plugin_xml.find('config-file').getchildren();
            xml_helpers.graftXML(config_xml, children, 'plugins');
            expect(config_xml.find('plugins').getchildren().length).toEqual(19);
        });
        it('Test 019 : should be able to handle absolute selectors', function () {
            var children = plugin_xml.find('config-file').getchildren();
            xml_helpers.graftXML(config_xml, children, '/cordova');
            expect(config_xml.findall('access').length).toEqual(3);
        });
        it('Test 020 : should be able to handle absolute selectors with wildcards', function () {
            var children = plugin_xml.find('config-file').getchildren();
            xml_helpers.graftXML(config_xml, children, '/*');
            expect(config_xml.findall('access').length).toEqual(3);
        });
        it('Test 020-1 : should create parent', function () {
            var config_xml0 = xml_helpers.parseElementtreeSync(path.join(__dirname, '../fixtures/test-config0.xml'));
            var children = plugin_xml.find('platform[@name="ios"]/config-file').getchildren();
            xml_helpers.graftXML(config_xml0, children, '/widget/plugins');
            expect(config_xml0.find('plugins').getchildren().length).toEqual(1);
        });
    });

    describe('graftXMLMerge', function () {
        var plugin_xml, android_manifest_xml;

        beforeEach(function () {
            plugin_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, '../fixtures/plugins/org.test.editconfigtest/plugin.xml'));
            android_manifest_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, '../fixtures/projects/android/AndroidManifest.xml'));
        });
        it('Test 021 : should merge attributes at specified selector', function () {
            var children = plugin_xml.find('platform/edit-config[@mode=\"merge\"]').getchildren();
            xml_helpers.graftXMLMerge(android_manifest_xml, children, 'application/activity[@android:name=\"com.phonegap.DroidGap\"]', {});
            var activityAttr = android_manifest_xml.find('application/activity[@android:name=\"com.phonegap.DroidGap\"]').attrib;
            expect(Object.keys(activityAttr).length).toEqual(4);
            expect(activityAttr['android:enabled']).toEqual('true');
            expect(activityAttr['android:configChanges']).toEqual('keyboardHidden');
        });
        it('Test 022 : should be able to handle absolute selectors', function () {
            var children = plugin_xml.find('platform/edit-config[@mode=\"merge\"]').getchildren();
            xml_helpers.graftXMLMerge(android_manifest_xml, children, '/manifest/application/activity[@android:name=\"com.phonegap.DroidGap\"]', {});
            var activityAttr = android_manifest_xml.find('application/activity[@android:name=\"com.phonegap.DroidGap\"]').attrib;
            expect(Object.keys(activityAttr).length).toEqual(4);
            expect(activityAttr['android:enabled']).toEqual('true');
            expect(activityAttr['android:configChanges']).toEqual('keyboardHidden');
        });
        it('Test 023 : should be able to handle absolute selectors with wildcards', function () {
            var children = plugin_xml.find('platform/edit-config[@mode=\"merge\"]').getchildren();
            xml_helpers.graftXMLMerge(android_manifest_xml, children, '/*/*/activity[@android:name=\"com.phonegap.DroidGap\"]', {});
            var activityAttr = android_manifest_xml.find('application/activity[@android:name=\"com.phonegap.DroidGap\"]').attrib;
            expect(Object.keys(activityAttr).length).toEqual(4);
            expect(activityAttr['android:enabled']).toEqual('true');
            expect(activityAttr['android:configChanges']).toEqual('keyboardHidden');
        });
        it('Test 024 : should be able to handle xpath selectors', function () {
            var children = plugin_xml.find('platform/edit-config[@mode=\"merge\"]').getchildren();
            xml_helpers.graftXMLMerge(android_manifest_xml, children, 'application/activity[@android:name=\"com.phonegap.DroidGap\"]', {});
            var activityAttr = android_manifest_xml.find('application/activity[@android:name=\"com.phonegap.DroidGap\"]').attrib;
            expect(Object.keys(activityAttr).length).toEqual(4);
            expect(activityAttr['android:enabled']).toEqual('true');
            expect(activityAttr['android:configChanges']).toEqual('keyboardHidden');
        });
    });

    describe('graftXMLOverwrite', function () {
        var plugin_xml, android_manifest_xml;

        beforeEach(function () {
            plugin_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, '../fixtures/plugins/org.test.editconfigtest/plugin.xml'));
            android_manifest_xml = xml_helpers.parseElementtreeSync(path.join(__dirname, '../fixtures/projects/android/AndroidManifest.xml'));
        });
        it('Test 025 : should overwrite attributes at specified selector', function () {
            var children = plugin_xml.find('platform/edit-config[@mode=\"overwrite\"]').getchildren();
            xml_helpers.graftXMLOverwrite(android_manifest_xml, children, 'application/activity', {});
            var activityAttr = android_manifest_xml.find('application/activity').attrib;
            expect(Object.keys(activityAttr).length).toEqual(3);
            expect(activityAttr['android:enabled']).toEqual('true');
            expect(activityAttr['android:configChanges']).not.toBeDefined();
        });
        it('Test 026 : should be able to handle absolute selectors', function () {
            var children = plugin_xml.find('platform/edit-config[@mode=\"overwrite\"]').getchildren();
            xml_helpers.graftXMLOverwrite(android_manifest_xml, children, '/manifest/application/activity', {});
            var activityAttr = android_manifest_xml.find('application/activity').attrib;
            expect(Object.keys(activityAttr).length).toEqual(3);
            expect(activityAttr['android:enabled']).toEqual('true');
            expect(activityAttr['android:configChanges']).not.toBeDefined();
        });
        it('Test 027 : should be able to handle absolute selectors with wildcards', function () {
            var children = plugin_xml.find('platform/edit-config[@mode=\"overwrite\"]').getchildren();
            xml_helpers.graftXMLOverwrite(android_manifest_xml, children, '/*/*/activity', {});
            var activityAttr = android_manifest_xml.find('application/activity').attrib;
            expect(Object.keys(activityAttr).length).toEqual(3);
            expect(activityAttr['android:enabled']).toEqual('true');
            expect(activityAttr['android:configChanges']).not.toBeDefined();
        });
        it('Test 028 : should be able to handle xpath selectors', function () {
            var children = plugin_xml.find('platform/edit-config[@mode=\"overwrite\"]').getchildren();
            xml_helpers.graftXMLOverwrite(android_manifest_xml, children, 'application/activity[@android:name=\"ChildApp\"]', {});
            var activityAttr = android_manifest_xml.find('application/activity').attrib;
            expect(Object.keys(activityAttr).length).toEqual(3);
            expect(activityAttr['android:enabled']).toEqual('true');
            expect(activityAttr['android:configChanges']).not.toBeDefined();
        });
    });

    describe('mergeXml', function () {
        var dstXml;
        beforeEach(function () {
            dstXml = et.XML(TEST_XML);
        });

        it('Test 029 : should merge attributes and text of the root element without clobbering', function () {
            var testXml = et.XML('<widget foo="bar" id="NOTANID">TEXT</widget>');
            xml_helpers.mergeXml(testXml, dstXml);
            expect(dstXml.attrib.foo).toEqual('bar');
            expect(dstXml.attrib.id).not.toEqual('NOTANID');
            expect(dstXml.text).not.toEqual('TEXT');
        });

        it('Test 030 : should merge attributes and text of the root element with clobbering', function () {
            var testXml = et.XML('<widget foo="bar" id="NOTANID">TEXT</widget>');
            xml_helpers.mergeXml(testXml, dstXml, 'foo', true);
            expect(dstXml.attrib.foo).toEqual('bar');
            expect(dstXml.attrib.id).toEqual('NOTANID');
            expect(dstXml.text).toEqual('TEXT');
        });

        it('Test 031 : should handle attributes values with quotes correctly', function () {
            var testXml = et.XML('<widget><quote foo="some \'quoted\' string" bar="another &quot;quoted&quot; string" baz="&quot;mixed&quot; \'quotes\'" /></widget>');
            xml_helpers.mergeXml(testXml, dstXml);
            expect(dstXml.find('quote')).toBeDefined();
            expect(dstXml.find('quote').attrib.foo).toEqual('some \'quoted\' string');
            expect(dstXml.find('quote').attrib.bar).toEqual('another "quoted" string');
            expect(dstXml.find('quote').attrib.baz).toEqual('"mixed" \'quotes\'');
        });

        it('Test 032 : should not merge platform tags with the wrong platform', function () {
            var testXml = et.XML('<widget><platform name="bar"><testElement testAttrib="value">testTEXT</testElement></platform></widget>');
            var origCfg = et.tostring(dstXml);

            xml_helpers.mergeXml(testXml, dstXml, 'foo', true);
            expect(et.tostring(dstXml)).toEqual(origCfg);
        });

        it('Test 033 : should merge platform tags with the correct platform', function () {
            var testXml = et.XML('<widget><platform name="bar"><testElement testAttrib="value">testTEXT</testElement></platform></widget>');
            var origCfg = et.tostring(dstXml);

            xml_helpers.mergeXml(testXml, dstXml, 'bar', true);
            expect(et.tostring(dstXml)).not.toEqual(origCfg);
            var testElement = dstXml.find('testElement');
            expect(testElement).toBeDefined();
            expect(testElement.attrib.testAttrib).toEqual('value');
            expect(testElement.text).toEqual('testTEXT');
        });

        it('Test 034 : should merge singleton children without clobber', function () {
            var testXml = et.XML('<widget><author testAttrib="value" href="http://www.nowhere.com">SUPER_AUTHOR</author></widget>');

            xml_helpers.mergeXml(testXml, dstXml);
            var testElements = dstXml.findall('author');
            expect(testElements).toBeDefined();
            expect(testElements.length).toEqual(1);
            expect(testElements[0].attrib.testAttrib).toEqual('value');
            expect(testElements[0].attrib.href).toEqual('http://cordova.io');
            expect(testElements[0].attrib.email).toEqual('dev@cordova.apache.org');
            expect(testElements[0].text).toContain('Apache Cordova Team');
        });

        it('Test 035 : should merge singleton name without clobber', function () {
            var testXml = et.XML('<widget><name>SUPER_NAME</name></widget>');

            xml_helpers.mergeXml(testXml, dstXml);
            var testElements = dstXml.findall('name');
            expect(testElements).toBeDefined();
            expect(testElements.length).toEqual(1);
            expect(testElements[0].text).toContain('Hello Cordova');
        });

        it('Test 036 : should clobber singleton children with clobber', function () {
            var testXml = et.XML('<widget><author testAttrib="value" href="http://www.nowhere.com">SUPER_AUTHOR</author></widget>');

            xml_helpers.mergeXml(testXml, dstXml, '', true);
            var testElements = dstXml.findall('author');
            expect(testElements).toBeDefined();
            expect(testElements.length).toEqual(1);
            expect(testElements[0].attrib.testAttrib).toEqual('value');
            expect(testElements[0].attrib.href).toEqual('http://www.nowhere.com');
            expect(testElements[0].attrib.email).toEqual('dev@cordova.apache.org');
            expect(testElements[0].text).toEqual('SUPER_AUTHOR');
        });

        it('Test 037 : should merge singleton name with clobber', function () {
            var testXml = et.XML('<widget><name>SUPER_NAME</name></widget>');

            xml_helpers.mergeXml(testXml, dstXml, '', true);
            var testElements = dstXml.findall('name');
            expect(testElements).toBeDefined();
            expect(testElements.length).toEqual(1);
            expect(testElements[0].text).toContain('SUPER_NAME');
        });

        it('Test 038 : should append non singelton children', function () {
            var testXml = et.XML('<widget><preference num="1"/> <preference num="2"/></widget>');

            xml_helpers.mergeXml(testXml, dstXml, '', true);
            var testElements = dstXml.findall('preference');
            expect(testElements.length).toEqual(4);
        });

        it('Test 039 : should handle namespaced elements', function () {
            var testXml = et.XML('<widget><foo:bar testAttrib="value">testText</foo:bar></widget>');

            xml_helpers.mergeXml(testXml, dstXml, 'foo', true);
            var testElement = dstXml.find('foo:bar');
            expect(testElement).toBeDefined();
            expect(testElement.attrib.testAttrib).toEqual('value');
            expect(testElement.text).toEqual('testText');
        });

        it('Test 040 : should not append duplicate non singelton children', function () {
            var testXml = et.XML('<widget><preference name="fullscreen" value="true"/></widget>');

            xml_helpers.mergeXml(testXml, dstXml, '', true);
            var testElements = dstXml.findall('preference');
            expect(testElements.length).toEqual(2);
        });

        it('Test 041 : should not skip partial duplicate non singelton children', function () {
            // remove access tags from dstXML
            var testElements = dstXml.findall('access');
            for (var i = 0; i < testElements.length; i++) {
                dstXml.remove(testElements[i]);
            }
            testElements = dstXml.findall('access');
            expect(testElements.length).toEqual(0);
            // add an external whitelist access tag
            var testXml = et.XML('<widget><access origin="*" launch-external="yes"/></widget>');
            xml_helpers.mergeXml(testXml, dstXml, '', true);
            testElements = dstXml.findall('access');
            expect(testElements.length).toEqual(1);
            // add an internal whitelist access tag
            testXml = et.XML('<widget><access origin="*"/></widget>');
            xml_helpers.mergeXml(testXml, dstXml, '', true);
            testElements = dstXml.findall('access');
            expect(testElements.length).toEqual(2);

        });

        it('Test 042 : should remove duplicate preferences (by name attribute value)', function () {
            var testXml = et.XML(
                '<?xml version="1.0" encoding="UTF-8"?>\n' +
                '<widget xmlns     = "http://www.w3.org/ns/widgets"\n' +
                '        xmlns:cdv = "http://cordova.apache.org/ns/1.0"\n' +
                '        id        = "io.cordova.hellocordova"\n' +
                '        version   = "0.0.1">\n' +
                '    <preference name="Orientation" value="default" />\n' +
                '    <preference name="Orientation" value="portrait" />\n' +
                '    <preference name="Orientation" value="landscape" />\n' +
                '    <platform name="ios">\n' +
                '        <preference name="Orientation" value="all" />\n' +
                '        <preference name="Orientation" value="portrait" />\n' +
                '    </platform>\n' +
                '</widget>\n'
            );
            xml_helpers.mergeXml(testXml, dstXml, 'ios');
            var testElements = dstXml.findall('preference[@name="Orientation"]');
            expect(testElements.length).toEqual(1);
        });

        it('Test 043 : should merge preferences, with platform preferences written last', function () {
            var testXml = et.XML(
                '<?xml version="1.0" encoding="UTF-8"?>\n' +
                '<widget xmlns     = "http://www.w3.org/ns/widgets"\n' +
                '        xmlns:cdv = "http://cordova.apache.org/ns/1.0"\n' +
                '        id        = "io.cordova.hellocordova"\n' +
                '        version   = "0.0.1">\n' +
                '    <preference name="Orientation" value="default" />\n' +
                '    <platform name="ios">\n' +
                '        <preference name="Orientation" value="all" />\n' +
                '    </platform>\n' +
                '</widget>\n'
            );
            xml_helpers.mergeXml(testXml, dstXml, 'ios');
            var testElements = dstXml.findall('preference[@name="Orientation"]');
            expect(testElements.length).toEqual(1);
            expect(testElements[0].attrib.value).toEqual('all');
        });
    });
});
