/** * "Beware of bugs in the above code; I have only proved it correct, not tried * it." * * ~ Donald Knuth */ // eslint-disable-next-line no-shadow-restricted-names (function($, ImageInput, undefined) { describe('ImageInput', function() { var state; beforeEach(function() { var $el; loadFixtures('imageinput.html'); $el = $('#imageinput_12345'); $el.append(createTestImage('cross_12345', 300, 400, 'red')); state = new ImageInput('12345'); }); it('initialization', function() { // Check that object's properties are present, and that the DOM // elements they reference exist. expect(state.el).toBeDefined(); expect(state.el).toExist(); expect(state.crossEl).toBeDefined(); expect(state.crossEl).toExist(); expect(state.inputEl).toBeDefined(); expect(state.inputEl).toExist(); expect(state.el).toHandle('click'); }); it('cross becomes visible after first click', function() { expect(state.crossEl.css('visibility')).toBe('hidden'); state.el.click(); expect(state.crossEl.css('visibility')).toBe('visible'); }); it('coordinates are updated [offsetX is set]', function() { var event, posX, posY, cssLeft, cssTop; // Set up of 'click' event. event = jQuery.Event( 'click', {offsetX: 35.3, offsetY: 42.7} ); // Calculating the expected coordinates. posX = event.offsetX; posY = event.offsetY; // Triggering 'click' event. jQuery(state.el).trigger(event); // Getting actual (new) coordinates, and testing them against the // expected. cssLeft = stripPx(state.crossEl.css('left')); cssTop = stripPx(state.crossEl.css('top')); expect(cssLeft).toBeCloseTo(posX - 15, 1); expect(cssTop).toBeCloseTo(posY - 15, 1); expect(state.inputEl.val()).toBe( '[' + Math.round(posX) + ',' + Math.round(posY) + ']' ); }); it('coordinates are updated [offsetX is NOT set]', function() { var offset = state.el.offset(), event, posX, posY, cssLeft, cssTop; // Set up of 'click' event. event = jQuery.Event( 'click', { offsetX: undefined, offsetY: undefined, pageX: 35.3, pageY: 42.7 } ); // Calculating the expected coordinates. posX = event.pageX - offset.left; posY = event.pageY - offset.top; // Triggering 'click' event. jQuery(state.el).trigger(event); // Getting actual (new) coordinates, and testing them against the // expected. cssLeft = stripPx(state.crossEl.css('left')); cssTop = stripPx(state.crossEl.css('top')); expect(cssLeft).toBeCloseTo(posX - 15, 1); expect(cssTop).toBeCloseTo(posY - 15, 1); expect(state.inputEl.val()).toBe( '[' + Math.round(posX) + ',' + Math.round(posY) + ']' ); }); }); // Instead of storing an image, and then including it in the template via // the tag, we will generate one on the fly. // // Create a simple image from a canvas. The canvas is filled by a colored // rectangle. function createTestImage(id, width, height, fillStyle) { var canvas, ctx, img; canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; ctx = canvas.getContext('2d'); ctx.fillStyle = fillStyle; ctx.fillRect(0, 0, width, height); img = document.createElement('img'); img.src = canvas.toDataURL('image/png'); img.id = id; return img; } // Strip the trailing 'px' substring from a CSS string containing the // `left` and `top` properties of an element's style. function stripPx(str) { return str.substring(0, str.length - 2); } }).call(this, window.jQuery, window.ImageInput);