mirror of
https://github.com/piskelapp/piskel.git
synced 2023-08-10 21:12:52 +03:00
Copy paste out of bounds : added SelectionManager unit tests
This commit is contained in:
parent
fdb5483e87
commit
99da69553c
@ -6,7 +6,9 @@ module.exports = function(config) {
|
|||||||
var mapToSrcFolder = function (path) {return ['src', path].join('/');};
|
var mapToSrcFolder = function (path) {return ['src', path].join('/');};
|
||||||
|
|
||||||
var piskelScripts = require('./src/piskel-script-list.js').scripts.map(mapToSrcFolder);
|
var piskelScripts = require('./src/piskel-script-list.js').scripts.map(mapToSrcFolder);
|
||||||
|
piskelScripts.push('test/js/testutils/**/*.js');
|
||||||
piskelScripts.push('test/js/**/*.js');
|
piskelScripts.push('test/js/**/*.js');
|
||||||
|
|
||||||
config.set({
|
config.set({
|
||||||
|
|
||||||
// base path that will be used to resolve all patterns (eg. files, exclude)
|
// base path that will be used to resolve all patterns (eg. files, exclude)
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
ns.BaseSelect = function() {
|
ns.BaseSelect = function() {
|
||||||
this.secondaryToolId = pskl.tools.drawing.Move.TOOL_ID;
|
this.secondaryToolId = pskl.tools.drawing.Move.TOOL_ID;
|
||||||
this.BodyRoot = $('body');
|
this.bodyRoot = $('body');
|
||||||
|
|
||||||
// Select's first point coordinates (set in applyToolAt)
|
// Select's first point coordinates (set in applyToolAt)
|
||||||
this.startCol = null;
|
this.startCol = null;
|
||||||
@ -81,12 +81,12 @@
|
|||||||
if (overlay.containsPixel(col, row)) {
|
if (overlay.containsPixel(col, row)) {
|
||||||
if (this.isInSelection(col, row)) {
|
if (this.isInSelection(col, row)) {
|
||||||
// We're hovering the selection, show the move tool:
|
// We're hovering the selection, show the move tool:
|
||||||
this.BodyRoot.addClass(this.secondaryToolId);
|
this.bodyRoot.addClass(this.secondaryToolId);
|
||||||
this.BodyRoot.removeClass(this.toolId);
|
this.bodyRoot.removeClass(this.toolId);
|
||||||
} else {
|
} else {
|
||||||
// We're not hovering the selection, show create selection tool:
|
// We're not hovering the selection, show create selection tool:
|
||||||
this.BodyRoot.addClass(this.toolId);
|
this.bodyRoot.addClass(this.toolId);
|
||||||
this.BodyRoot.removeClass(this.secondaryToolId);
|
this.bodyRoot.removeClass(this.secondaryToolId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
206
test/js/selection/SelectionManagerTest.js
Normal file
206
test/js/selection/SelectionManagerTest.js
Normal file
@ -0,0 +1,206 @@
|
|||||||
|
describe("SelectionManager suite", function() {
|
||||||
|
var black = '#000000';
|
||||||
|
var red = '#ff0000';
|
||||||
|
var transparent = Constants.TRANSPARENT_COLOR;
|
||||||
|
var B = black, R = red, T = transparent;
|
||||||
|
|
||||||
|
// shortcuts
|
||||||
|
var toFrameGrid = test.testutils.toFrameGrid;
|
||||||
|
var frameEqualsGrid = test.testutils.frameEqualsGrid;
|
||||||
|
|
||||||
|
// test objects
|
||||||
|
var selectionManager;
|
||||||
|
var selection;
|
||||||
|
var currentFrame;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Mock
|
||||||
|
*/
|
||||||
|
pskl.app.shortcutService = {
|
||||||
|
addShortcut : function () {}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Mock
|
||||||
|
*/
|
||||||
|
var piskelController = {
|
||||||
|
getCurrentFrame : function () {
|
||||||
|
return currentFrame;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
beforeEach(function() {
|
||||||
|
currentFrame = pskl.model.Frame.fromPixelGrid([
|
||||||
|
[B, R, T],
|
||||||
|
[R, B, R],
|
||||||
|
[T, R, B]
|
||||||
|
]);
|
||||||
|
|
||||||
|
selectionManager = new pskl.selection.SelectionManager(piskelController);
|
||||||
|
selectionManager.init();
|
||||||
|
|
||||||
|
selection = new pskl.selection.BaseSelection();
|
||||||
|
|
||||||
|
selection.pixels = [];
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check a basic copy paste scenario
|
||||||
|
*/
|
||||||
|
it("copy/paste OK", function () {
|
||||||
|
console.log('[SelectionManager] copy/paste OK');
|
||||||
|
selectMiddleLine();
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... copy');
|
||||||
|
selectionManager.copy();
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... check selection content after copy contains correct colors');
|
||||||
|
expect(selection.pixels.length).toBe(3); // or not to be ... lalalala ... french-only joke \o/
|
||||||
|
checkContainsPixel(selection.pixels, 1, 0, R);
|
||||||
|
checkContainsPixel(selection.pixels, 1, 1, B);
|
||||||
|
checkContainsPixel(selection.pixels, 1, 2, R);
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... move 1 row down');
|
||||||
|
selection.move(0, 1);
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... check pixels were shifted by two columns forward');
|
||||||
|
checkContainsPixel(selection.pixels, 2, 0, R);
|
||||||
|
checkContainsPixel(selection.pixels, 2, 1, B);
|
||||||
|
checkContainsPixel(selection.pixels, 2, 2, R);
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... paste');
|
||||||
|
selectionManager.paste();
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... check last line is identical to middle line after paste');
|
||||||
|
frameEqualsGrid(currentFrame, [
|
||||||
|
[B, R, T],
|
||||||
|
[R, B, R],
|
||||||
|
[R, B, R]
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check a basic cut paste scenario
|
||||||
|
*/
|
||||||
|
it("cut OK", function () {
|
||||||
|
console.log('[SelectionManager] cut OK');
|
||||||
|
selectMiddleLine();
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... cut');
|
||||||
|
selectionManager.cut();
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... check middle line was cut in the source frame');
|
||||||
|
frameEqualsGrid(currentFrame, [
|
||||||
|
[B, R, T],
|
||||||
|
[T, T, T],
|
||||||
|
[T, R, B]
|
||||||
|
]);
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... paste');
|
||||||
|
selectionManager.paste();
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... check middle line was restored by paste');
|
||||||
|
frameEqualsGrid(currentFrame, [
|
||||||
|
[B, R, T],
|
||||||
|
[R, B, R],
|
||||||
|
[T, R, B]
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check a copy paste scenario that goes out of the frame boundaries for copying and for pasting.
|
||||||
|
*/
|
||||||
|
it("copy/paste OK out of bounds", function () {
|
||||||
|
console.log('[SelectionManager] copy/paste OK out of bounds');
|
||||||
|
selectMiddleLine();
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... move 2 columns to the right');
|
||||||
|
selection.move(2, 0);
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... copy out of bounds');
|
||||||
|
selectionManager.copy();
|
||||||
|
console.log('[SelectionManager] ... check out of bound pixels were replaced by transparent pixels');
|
||||||
|
checkContainsPixel(selection.pixels, 1, 2, R);
|
||||||
|
checkContainsPixel(selection.pixels, 1, 3, T);
|
||||||
|
checkContainsPixel(selection.pixels, 1, 4, T);
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... move one column to the left');
|
||||||
|
selection.move(-1, 0);
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... check pixels were shifted by one column back');
|
||||||
|
checkContainsPixel(selection.pixels, 1, 1, R);
|
||||||
|
checkContainsPixel(selection.pixels, 1, 2, T);
|
||||||
|
checkContainsPixel(selection.pixels, 1, 3, T);
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... paste out of bounds');
|
||||||
|
selectionManager.paste();
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... check pixel at (1,1) is red after paste');
|
||||||
|
frameEqualsGrid(currentFrame, [
|
||||||
|
[B, R, T],
|
||||||
|
[R, R, R],
|
||||||
|
[T, R, B]
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check a cut paste scenario that goes out of the frame boundaries for cutting and for pasting.
|
||||||
|
*/
|
||||||
|
it("cut OK out of bounds", function () {
|
||||||
|
console.log('[SelectionManager] cut OK');
|
||||||
|
selectMiddleLine();
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... move 2 columns to the right');
|
||||||
|
selection.move(2, 0);
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... cut out of bounds');
|
||||||
|
selectionManager.cut();
|
||||||
|
console.log('[SelectionManager] ... check last pixel of midle line was cut in the source frame');
|
||||||
|
frameEqualsGrid(currentFrame, [
|
||||||
|
[B, R, T],
|
||||||
|
[R, B, T],
|
||||||
|
[T, R, B]
|
||||||
|
]);
|
||||||
|
|
||||||
|
selection.move(-1, 0);
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... paste out of bounds');
|
||||||
|
selectionManager.paste();
|
||||||
|
|
||||||
|
console.log('[SelectionManager] ... check middle line final state');
|
||||||
|
frameEqualsGrid(currentFrame, [
|
||||||
|
[B, R, T],
|
||||||
|
[R, R, T],
|
||||||
|
[T, R, B]
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Private helpers
|
||||||
|
var createPixel = function(row, col, color) {
|
||||||
|
return {
|
||||||
|
row : row,
|
||||||
|
col : col,
|
||||||
|
color : color
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var selectMiddleLine = function () {
|
||||||
|
console.log('[SelectionManager] ... select middle line');
|
||||||
|
selection.pixels.push(createPixel(1, 0));
|
||||||
|
selection.pixels.push(createPixel(1, 1));
|
||||||
|
selection.pixels.push(createPixel(1, 2));
|
||||||
|
|
||||||
|
expect(selectionManager.currentSelection).toBe(null);
|
||||||
|
console.log('[SelectionManager] ... send SELECTION_CREATED event for the test selection');
|
||||||
|
$.publish(Events.SELECTION_CREATED, [selection]);
|
||||||
|
expect(selectionManager.currentSelection).toBe(selection);
|
||||||
|
};
|
||||||
|
|
||||||
|
var checkContainsPixel = function (pixels, row, col, color) {
|
||||||
|
var containsPixel = pixels.some(function (pixel) {
|
||||||
|
return pixel.row == row && pixel.col == col && pixel.color == color;
|
||||||
|
});
|
||||||
|
expect(containsPixel).toBe(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user