var NodeContainer = html2canvas.NodeContainer;

describe('Borders', function() {
    $('#borders div').each(function(i, node) {
        it($(this).attr('style'), function() {
            [
                'borderTopWidth',
                'borderRightWidth',
                'borderBottomWidth',
                'borderLeftWidth'
            ].forEach(function(prop) {
                var result = $(node).css(prop);
                // older IE's don't necessarily return px even with jQuery
                if (result === 'thin') {
                    result = '1px';
                } else if (result === 'medium') {
                    result = '3px';
                } else if (result === 'thick') {
                    result = '5px';
                }
                var container = new NodeContainer(node, null);
                expect(container.css(prop)).to.be(result);
            });
        });
    });
});

describe('Padding', function() {
    $('#padding div').each(function(i, node) {
        it($(this).attr('style'), function() {
            ['paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft'].forEach(function(prop) {
                var container = new NodeContainer(node, null);
                var result = container.css(prop);
                expect(result).to.contain('px');
                expect(result, $(node).css(prop));
            });
        });
    });
});

describe('Background-position', function() {
    $('#backgroundPosition div').each(function(i, node) {
        it($(this).attr('style'), function() {
            var prop = 'backgroundPosition';
            var img = new Image();
            img.width = 50;
            img.height = 50;

            var container = new NodeContainer(node, null);
            var item = container.css(prop),
                backgroundPosition = container.parseBackgroundPosition(
                    html2canvas.utils.getBounds(node),
                    img
                ),
                split = window.getComputedStyle
                    ? $(node).css(prop).split(' ')
                    : [$(node).css(prop + 'X'), $(node).css(prop + 'Y')];

            var testEl = $('<div />').css({
                position: 'absolute',
                left: split[0],
                top: split[1]
            });

            testEl.appendTo(node);

            expect(backgroundPosition.left).to.equal(Math.floor(parseFloat(testEl.css('left'))));
            expect(backgroundPosition.top).to.equal(Math.floor(parseFloat(testEl.css('top'))));

            testEl.remove();
        });
    });
});

describe('Text-shadow', function() {
    $('#textShadows div').each(function(i, node) {
        var index = i + 1;
        var container = new NodeContainer(node, null);
        var shadows = container.parseTextShadows();
        it(node.style.textShadow, function() {
            if (i === 0) {
                expect(shadows.length).to.equal(0);
            } else {
                expect(shadows.length).to.equal(i >= 6 ? 2 : 1);
                expect(shadows[0].offsetX).to.equal(i);
                expect(shadows[0].offsetY).to.equal(i);
                if (i < 2) {
                    expect(shadows[0].color.toString()).to.equal('rgba(0,0,0,0)');
                } else if (i % 2 === 0) {
                    expect(shadows[0].color.toString()).to.equal('rgb(2,2,2)');
                } else {
                    var opacity = '0.2';
                    expect(shadows[0].color.toString()).to.match(/rgba\(2,2,2,(0.2|0\.199219)\)/);
                }

                // only testing blur once
                if (i === 1) {
                    expect(shadows[0].blur).to.equal('1');
                }
            }
        });
    });
});

describe('Background-image', function() {
    test_parse_background_image(
        'url("te)st")',
        {
            prefix: '',
            method: 'url',
            value: 'url("te)st")',
            args: ['te)st'],
            image: null
        },
        'test quoted'
    );

    test_parse_background_image(
        'url("te,st")',
        {
            prefix: '',
            method: 'url',
            value: 'url("te,st")',
            args: ['te,st'],
            image: null
        },
        'test quoted'
    );

    test_parse_background_image(
        'url(te,st)',
        {
            prefix: '',
            method: 'url',
            value: 'url(te,st)',
            args: ['te,st'],
            image: null
        },
        'test quoted'
    );

    test_parse_background_image(
        'url(test)',
        {
            prefix: '',
            method: 'url',
            value: 'url(test)',
            args: ['test'],
            image: null
        },
        'basic url'
    );

    test_parse_background_image(
        'url("test")',
        {
            prefix: '',
            method: 'url',
            value: 'url("test")',
            args: ['test'],
            image: null
        },
        'quoted url'
    );

    test_parse_background_image(
        'url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)',
        {
            prefix: '',
            method: 'url',
            value:
                'url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)',
            args: [
                'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'
            ],
            image: null
        },
        'data url'
    );

    test_parse_background_image(
        'linear-gradient(red,black)',
        {
            prefix: '',
            method: 'linear-gradient',
            value: 'linear-gradient(red,black)',
            args: ['red', 'black'],
            image: null
        },
        'linear-gradient'
    );

    test_parse_background_image(
        'linear-gradient(top,rgb(255,0,0),rgb(0,0,0))',
        {
            prefix: '',
            method: 'linear-gradient',
            value: 'linear-gradient(top,rgb(255,0,0),rgb(0,0,0))',
            args: ['top', 'rgb(255,0,0)', 'rgb(0,0,0)'],
            image: null
        },
        'linear-gradient w/ rgb()'
    );

    test_parse_background_image(
        '-webkit-linear-gradient(red,black)',
        {
            prefix: '-webkit-',
            method: 'linear-gradient',
            value: '-webkit-linear-gradient(red,black)',
            args: ['red', 'black'],
            image: null
        },
        'prefixed linear-gradient'
    );

    test_parse_background_image(
        'linear-gradient(red,black), url(test), url("test"),\n none, ',
        [
            {
                prefix: '',
                method: 'linear-gradient',
                value: 'linear-gradient(red,black)',
                args: ['red', 'black'],
                image: null
            },
            {prefix: '', method: 'url', value: 'url(test)', args: ['test'], image: null},
            {prefix: '', method: 'url', value: 'url("test")', args: ['test'], image: null},
            {prefix: '', method: 'none', value: 'none', args: [], image: null}
        ],
        'multiple backgrounds'
    );

    function test_parse_background_image(value, expected, name) {
        it(name, function() {
            expect(html2canvas.utils.parseBackgrounds(value)).to.eql(
                Array.isArray(expected) ? expected : [expected]
            );
        });
    }
});