Spaces:
Running
Running
/* eslint-env jest */ | |
import monitorLayoutReducer, { | |
addMonitorRect, moveMonitorRect, | |
resizeMonitorRect, removeMonitorRect, | |
getInitialPosition, PADDING, SCREEN_WIDTH, SCREEN_HEIGHT | |
} from '../../../src/reducers/monitor-layout'; | |
test('initialState', () => { | |
let defaultState; | |
expect(monitorLayoutReducer(defaultState /* state */, {type: 'anything'} /* action */)).toBeDefined(); | |
expect(monitorLayoutReducer(defaultState /* state */, {type: 'anything'} /* action */).monitors).toBeDefined(); | |
expect(monitorLayoutReducer(defaultState /* state */, {type: 'anything'} /* action */).savedMonitorPositions) | |
.toBeDefined(); | |
}); | |
test('addMonitorRect', () => { | |
let defaultState; | |
const monitorId = 1; | |
const monitorId2 = 2; | |
const upperStart = {x: 100, y: 100}; | |
const lowerEnd = {x: 200, y: 200}; | |
// Add a monitor rect | |
const reduxState = monitorLayoutReducer(defaultState, addMonitorRect(monitorId, upperStart, lowerEnd)); | |
expect(reduxState.monitors[monitorId]).toBeDefined(); | |
expect(reduxState.monitors[monitorId].upperStart).toEqual(upperStart); | |
expect(reduxState.monitors[monitorId].lowerEnd).toEqual(lowerEnd); | |
// Add monitor rect doesn't save position | |
expect(reduxState.savedMonitorPositions[monitorId]).toBeUndefined(); | |
const reduxState2 = monitorLayoutReducer(reduxState, moveMonitorRect(monitorId, 0, 0)); | |
// Add a second monitor rect | |
const reduxState3 = monitorLayoutReducer(reduxState2, addMonitorRect(monitorId2, upperStart, lowerEnd)); | |
expect(reduxState3.monitors[monitorId]).toBeDefined(); | |
expect(reduxState3.monitors[monitorId2]).toBeDefined(); | |
expect(reduxState3.monitors[monitorId2].upperStart).toEqual(upperStart); | |
expect(reduxState3.monitors[monitorId2].lowerEnd).toEqual(lowerEnd); | |
// Saved positions aren't changed by adding monitor | |
expect(reduxState3.savedMonitorPositions).toEqual(reduxState2.savedMonitorPositions); | |
}); | |
test('addMonitorRectWithSavedPosition', () => { | |
let defaultState; | |
const monitorId = 1; | |
const upperStart = {x: 100, y: 100}; | |
const lowerEnd = {x: 200, y: 200}; | |
// Add a monitor rect | |
const reduxState = monitorLayoutReducer(defaultState, | |
addMonitorRect(monitorId, upperStart, lowerEnd, true /* savePosition */)); | |
expect(reduxState.monitors[monitorId]).toBeDefined(); | |
expect(reduxState.monitors[monitorId].upperStart).toEqual(upperStart); | |
expect(reduxState.monitors[monitorId].lowerEnd).toEqual(lowerEnd); | |
// Save position | |
expect(reduxState.savedMonitorPositions[monitorId].x).toEqual(upperStart.x); | |
expect(reduxState.savedMonitorPositions[monitorId].y).toEqual(upperStart.y); | |
}); | |
test('invalidRect', () => { | |
let defaultState; | |
const reduxState = monitorLayoutReducer(defaultState /* state */, {type: 'initialize'} /* action */); | |
// Problem: x end is before x start | |
expect( | |
monitorLayoutReducer(reduxState, | |
addMonitorRect(1, {x: 100, y: 100}, {x: 10, y: 200}))) | |
.toEqual(reduxState); | |
// Problem: y end is before y start | |
expect( | |
monitorLayoutReducer(reduxState, | |
addMonitorRect(1, {x: 100, y: 100}, {x: 200, y: 10}))) | |
.toEqual(reduxState); | |
}); | |
test('invalidAddMonitorRect', () => { | |
let defaultState; | |
const monitorId = 1; | |
const upperStart = {x: 100, y: 100}; | |
const lowerEnd = {x: 200, y: 200}; | |
// Add a monitor rect | |
const reduxState = monitorLayoutReducer(defaultState, addMonitorRect(monitorId, upperStart, lowerEnd)); | |
// Try to add the same one | |
expect(monitorLayoutReducer(reduxState, addMonitorRect(monitorId, upperStart, lowerEnd))) | |
.toEqual(reduxState); | |
}); | |
test('moveMonitorRect', () => { | |
let defaultState; | |
const monitorId = 1; | |
const monitorId2 = 2; | |
const width = 102; | |
const height = 101; | |
const upperStart = {x: 100, y: 100}; | |
const lowerEnd = {x: upperStart.x + width, y: upperStart.y + height}; | |
const movedToPosition = {x: 0, y: 0}; | |
const movedToPosition2 = {x: 543, y: 2}; | |
// Add a monitor rect and move it. Expect it to be in monitors state and saved positions. | |
const reduxState = monitorLayoutReducer(defaultState, addMonitorRect(monitorId, upperStart, lowerEnd)); | |
const reduxState2 = monitorLayoutReducer(reduxState, | |
moveMonitorRect(monitorId, movedToPosition.x, movedToPosition.y)); | |
expect(reduxState2.monitors[monitorId]).toBeDefined(); | |
expect(reduxState2.monitors[monitorId].upperStart).toEqual(movedToPosition); | |
expect(reduxState2.monitors[monitorId].lowerEnd.x).toEqual(movedToPosition.x + width); | |
expect(reduxState2.monitors[monitorId].lowerEnd.y).toEqual(movedToPosition.y + height); | |
expect(reduxState2.savedMonitorPositions[monitorId]).toBeDefined(); | |
expect(reduxState2.savedMonitorPositions[monitorId].x).toEqual(movedToPosition.x); | |
expect(reduxState2.savedMonitorPositions[monitorId].y).toEqual(movedToPosition.y); | |
// Add a second monitor rect and move it. Expect there to now be 2 saved positions. | |
const reduxState3 = monitorLayoutReducer(reduxState2, addMonitorRect(monitorId2, upperStart, lowerEnd)); | |
const reduxState4 = monitorLayoutReducer(reduxState3, | |
moveMonitorRect(monitorId2, movedToPosition2.x, movedToPosition2.y)); | |
expect(reduxState4.savedMonitorPositions[monitorId]).toEqual(reduxState2.savedMonitorPositions[monitorId]); | |
expect(reduxState4.savedMonitorPositions[monitorId2].x).toEqual(movedToPosition2.x); | |
expect(reduxState4.savedMonitorPositions[monitorId2].y).toEqual(movedToPosition2.y); | |
}); | |
test('invalidMoveMonitorRect', () => { | |
let defaultState; | |
let reduxState = monitorLayoutReducer(defaultState, {type: 'initialize'} /* action */); | |
const monitorId = 1; | |
// Try to move a monitor rect that doesn't exist | |
expect(monitorLayoutReducer(reduxState, moveMonitorRect(monitorId, 1 /* newX */, 1 /* newY */))) | |
.toEqual(reduxState); | |
// Add the monitor to move | |
reduxState = monitorLayoutReducer(reduxState, addMonitorRect(monitorId, {x: 100, y: 100}, {x: 200, y: 200})); | |
// Invalid newX | |
expect(monitorLayoutReducer(reduxState, moveMonitorRect(monitorId, 'Oregon' /* newX */, 1 /* newY */))) | |
.toEqual(reduxState); | |
// Invalid newY | |
expect(monitorLayoutReducer(reduxState, moveMonitorRect(monitorId, 1 /* newX */))) | |
.toEqual(reduxState); | |
}); | |
test('resizeMonitorRect', () => { | |
let defaultState; | |
const monitorId = 1; | |
const upperStart = {x: 100, y: 100}; | |
const newWidth = 10; | |
const newHeight = 20; | |
// Add a monitor rect and resize it | |
const reduxState = monitorLayoutReducer(defaultState, addMonitorRect(monitorId, upperStart, {x: 200, y: 200})); | |
const reduxState2 = monitorLayoutReducer(reduxState, | |
resizeMonitorRect(monitorId, newWidth, newHeight)); | |
expect(reduxState2.monitors[monitorId]).toBeDefined(); | |
expect(reduxState2.monitors[monitorId].upperStart).toEqual(upperStart); | |
expect(reduxState2.monitors[monitorId].lowerEnd.x).toEqual(upperStart.x + newWidth); | |
expect(reduxState2.monitors[monitorId].lowerEnd.y).toEqual(upperStart.y + newHeight); | |
// Saved positions aren't changed by resizing monitor | |
expect(reduxState2.savedMonitorPositions).toEqual(reduxState.savedMonitorPositions); | |
}); | |
test('invalidResizeMonitorRect', () => { | |
let defaultState; | |
let reduxState = monitorLayoutReducer(defaultState, {type: 'initialize'} /* action */); | |
const monitorId = 1; | |
// Try to resize a monitor rect that doesn't exist | |
expect(monitorLayoutReducer(reduxState, resizeMonitorRect(monitorId, 1 /* newWidth */, 1 /* newHeight */))) | |
.toEqual(reduxState); | |
// Add the monitor to resize | |
reduxState = monitorLayoutReducer(reduxState, addMonitorRect(monitorId, {x: 100, y: 100}, {x: 200, y: 200})); | |
// Invalid newWidth | |
expect(monitorLayoutReducer(reduxState, resizeMonitorRect(monitorId, 'Oregon' /* newWidth */, 1 /* newHeight */))) | |
.toEqual(reduxState); | |
// Invalid newHeight | |
expect(monitorLayoutReducer(reduxState, moveMonitorRect(monitorId, 1 /* newWidth */))) | |
.toEqual(reduxState); | |
// newWidth < 0 | |
expect(monitorLayoutReducer(reduxState, resizeMonitorRect(monitorId, -1 /* newWidth */, 1 /* newHeight */))) | |
.toEqual(reduxState); | |
// newHeight < 0 | |
expect(monitorLayoutReducer(reduxState, resizeMonitorRect(monitorId, 1 /* newWidth */, -1 /* newHeight */))) | |
.toEqual(reduxState); | |
}); | |
test('removeMonitorRect', () => { | |
let defaultState; | |
const monitorId = 1; | |
// Add a monitor rect, move it, and remove it | |
const reduxState = monitorLayoutReducer(defaultState, addMonitorRect(monitorId, | |
{x: 100, y: 100}, | |
{x: 200, y: 200} | |
)); | |
const reduxState2 = monitorLayoutReducer(reduxState, moveMonitorRect(monitorId, 0, 0)); | |
const reduxState3 = monitorLayoutReducer(reduxState2, removeMonitorRect(monitorId)); | |
expect(reduxState3.monitors[monitorId]).toBeUndefined(); | |
// Check that saved positions aren't changed by removing monitor | |
expect(reduxState3.savedMonitorPositions).toEqual(reduxState2.savedMonitorPositions); | |
}); | |
test('invalidRemoveMonitorRect', () => { | |
let defaultState; | |
const reduxState = monitorLayoutReducer(defaultState, {type: 'initialize'} /* action */); | |
// Try to remove a monitor rect that doesn't exist | |
expect(monitorLayoutReducer(reduxState, resizeMonitorRect(1))) | |
.toEqual(reduxState); | |
}); | |
test('getInitialPosition_lineUpTopLeft', () => { | |
let defaultState; | |
const width = 100; | |
const height = 200; | |
// Add monitors to right and bottom, but there is a space in the top left | |
let reduxState = monitorLayoutReducer(defaultState, addMonitorRect(1, | |
{x: width + PADDING, y: 0}, | |
{x: 100, y: height} | |
)); | |
reduxState = monitorLayoutReducer(defaultState, addMonitorRect(2, | |
{x: 0, y: height + PADDING}, | |
{x: width, y: 100} | |
)); | |
// Check that the added monitor appears in the space | |
const rect = getInitialPosition(reduxState, 3, width, height); | |
expect(rect.upperStart).toBeDefined(); | |
expect(rect.lowerEnd).toBeDefined(); | |
expect(rect.lowerEnd.x - rect.upperStart.x).toEqual(width); | |
expect(rect.lowerEnd.y - rect.upperStart.y).toEqual(height); | |
expect(rect.upperStart.x).toEqual(PADDING); | |
expect(rect.upperStart.y).toEqual(PADDING); | |
}); | |
test('getInitialPosition_savedPosition', () => { | |
const monitorId = 1; | |
const savedX = 100; | |
const savedY = 200; | |
const width = 7; | |
const height = 8; | |
const reduxState = { | |
monitors: {}, | |
savedMonitorPositions: {[monitorId]: {x: savedX, y: savedY}} | |
}; | |
// Check that initial position uses saved state | |
const rect = getInitialPosition(reduxState, monitorId, width, height); | |
expect(rect.upperStart).toBeDefined(); | |
expect(rect.lowerEnd).toBeDefined(); | |
expect(rect.lowerEnd.x - rect.upperStart.x).toEqual(width); | |
expect(rect.lowerEnd.y - rect.upperStart.y).toEqual(height); | |
expect(rect.upperStart.x).toEqual(savedX); | |
expect(rect.upperStart.y).toEqual(savedY); | |
}); | |
test('getInitialPosition_lineUpLeft', () => { | |
let defaultState; | |
const monitor1EndY = 60; | |
// Add a monitor that takes up the upper left corner | |
const reduxState = monitorLayoutReducer(defaultState, addMonitorRect(1, {x: 0, y: 0}, {x: 100, y: monitor1EndY})); | |
// Check that added monitor is under it and lines up left | |
const rect = getInitialPosition(reduxState, 2, 20 /* width */, 20 /* height */); | |
expect(rect.upperStart.y >= monitor1EndY + PADDING).toBeTruthy(); | |
}); | |
test('getInitialPosition_lineUpTop', () => { | |
let defaultState; | |
const monitor1EndX = 100; | |
// Add a monitor that takes up the whole left side | |
const reduxState = monitorLayoutReducer(defaultState, addMonitorRect(1, | |
{x: 0, y: 0}, | |
{x: monitor1EndX, y: SCREEN_HEIGHT} | |
)); | |
// Check that added monitor is to the right of it and lines up top | |
const rect = getInitialPosition(reduxState, 2, 20 /* width */, 20 /* height */); | |
expect(rect.upperStart.y).toEqual(PADDING); | |
expect(rect.upperStart.x >= monitor1EndX + PADDING).toBeTruthy(); | |
}); | |
test('getInitialPosition_noRoom', () => { | |
let defaultState; | |
const width = 7; | |
const height = 8; | |
// Add a monitor that takes up the whole screen | |
const reduxState = monitorLayoutReducer(defaultState, addMonitorRect(1, | |
{x: 0, y: 0}, | |
{x: SCREEN_WIDTH, y: SCREEN_HEIGHT} | |
)); | |
// Check that added monitor exists somewhere (we don't care where) | |
const rect = getInitialPosition(reduxState, 2, width, height); | |
expect(rect.upperStart).toBeDefined(); | |
expect(rect.lowerEnd.x - rect.upperStart.x).toEqual(width); | |
expect(rect.lowerEnd.y - rect.upperStart.y).toEqual(height); | |
}); | |