mirror of
https://github.com/visgl/react-map-gl.git
synced 2025-12-08 20:16:02 +00:00
183 lines
3.7 KiB
JavaScript
183 lines
3.7 KiB
JavaScript
import test from 'tape-catch';
|
|
import {getDynamicPosition, ANCHOR_POSITION} from '../../src/utils/dynamic-position';
|
|
|
|
const ANCHORS = Object.keys(ANCHOR_POSITION);
|
|
|
|
// * @param {String} anchor - type of the anchor, one of 'top', 'bottom',
|
|
// 'left', 'right', 'top-left', 'top-right', 'bottom-left' , and 'bottom-right'
|
|
|
|
const TEST_CASES = [
|
|
{
|
|
opts: {
|
|
x: 0,
|
|
y: 0,
|
|
width: 10,
|
|
height: 10,
|
|
selfWidth: 20,
|
|
selfHeight: 20
|
|
},
|
|
expected: (input, output) => output === 'top-left',
|
|
message: 'Very large content'
|
|
},
|
|
{
|
|
opts: {
|
|
x: 50,
|
|
y: 50,
|
|
width: 100,
|
|
height: 100,
|
|
selfWidth: 20,
|
|
selfHeight: 20
|
|
},
|
|
expected: (input, output) => input === output,
|
|
message: 'Very large container'
|
|
},
|
|
{
|
|
opts: {
|
|
x: 50,
|
|
y: 50,
|
|
width: 100,
|
|
height: 100,
|
|
selfWidth: 20,
|
|
selfHeight: 20,
|
|
padding: 45
|
|
},
|
|
expected: (input, output) => output === 'top-left',
|
|
message: 'Very large padding'
|
|
},
|
|
{
|
|
opts: {
|
|
x: 50,
|
|
y: 10,
|
|
width: 100,
|
|
height: 20,
|
|
selfWidth: 20,
|
|
selfHeight: 20
|
|
},
|
|
expected: (input, output) => {
|
|
if (input.endsWith('right')) {
|
|
return output === 'right';
|
|
}
|
|
return output === 'left';
|
|
},
|
|
message: 'Very short container'
|
|
},
|
|
{
|
|
opts: {
|
|
x: 10,
|
|
y: 50,
|
|
width: 100,
|
|
height: 100,
|
|
selfWidth: 20,
|
|
selfHeight: 20
|
|
},
|
|
expected: (input, output) => {
|
|
switch (input) {
|
|
case 'top':
|
|
case 'top-left':
|
|
return output === 'top-right';
|
|
case 'left':
|
|
return output === 'right';
|
|
case 'bottom':
|
|
case 'bottom-left':
|
|
return output === 'bottom-right';
|
|
default:
|
|
return input === output;
|
|
}
|
|
},
|
|
message: 'Left border'
|
|
},
|
|
{
|
|
opts: {
|
|
x: 90,
|
|
y: 50,
|
|
width: 100,
|
|
height: 100,
|
|
selfWidth: 20,
|
|
selfHeight: 20
|
|
},
|
|
expected: (input, output) => {
|
|
switch (input) {
|
|
case 'top':
|
|
case 'top-right':
|
|
return output === 'top-left';
|
|
case 'right':
|
|
return output === 'left';
|
|
case 'bottom':
|
|
case 'bottom-right':
|
|
return output === 'bottom-left';
|
|
default:
|
|
return input === output;
|
|
}
|
|
},
|
|
message: 'Right border'
|
|
},
|
|
{
|
|
opts: {
|
|
x: 50,
|
|
y: 10,
|
|
width: 100,
|
|
height: 100,
|
|
selfWidth: 20,
|
|
selfHeight: 20
|
|
},
|
|
expected: (input, output) => {
|
|
switch (input) {
|
|
case 'left':
|
|
case 'top-left':
|
|
return output === 'bottom-left';
|
|
case 'top':
|
|
return output === 'bottom';
|
|
case 'right':
|
|
case 'top-right':
|
|
return output === 'bottom-right';
|
|
default:
|
|
return input === output;
|
|
}
|
|
},
|
|
message: 'Top border'
|
|
},
|
|
{
|
|
opts: {
|
|
x: 50,
|
|
y: 90,
|
|
width: 100,
|
|
height: 100,
|
|
selfWidth: 20,
|
|
selfHeight: 20
|
|
},
|
|
expected: (input, output) => {
|
|
switch (input) {
|
|
case 'left':
|
|
case 'bottom-left':
|
|
return output === 'top-left';
|
|
case 'bottom':
|
|
return output === 'top';
|
|
case 'right':
|
|
case 'bottom-right':
|
|
return output === 'top-right';
|
|
default:
|
|
return input === output;
|
|
}
|
|
},
|
|
message: 'Bottom border'
|
|
}
|
|
];
|
|
|
|
test('getDynamicPosition', t => {
|
|
TEST_CASES.forEach(testCase => {
|
|
|
|
ANCHORS.forEach(anchor => {
|
|
const params = Object.assign({anchor}, testCase.opts);
|
|
const result = getDynamicPosition(params);
|
|
|
|
if (testCase.expected(result)) {
|
|
t.fail(`Incorrect position: gets '${result}' from ${JSON.stringify(params)}`);
|
|
}
|
|
});
|
|
|
|
t.pass(testCase.message);
|
|
});
|
|
|
|
t.end();
|
|
});
|