141 lines
4.4 KiB
JavaScript
141 lines
4.4 KiB
JavaScript
"use strict";
|
|
|
|
const assert = require("node:assert/strict");
|
|
const path = require("node:path");
|
|
const test = require("node:test");
|
|
|
|
const repositoryRoot = path.resolve(__dirname, "..", "..");
|
|
const cutDrag = require(path.join(
|
|
repositoryRoot,
|
|
"src",
|
|
"MBN_STOCK_WEBVIEW.LegacyParityApp",
|
|
"Web",
|
|
"legacy-cut-drag.js"));
|
|
|
|
test("creates the original asymmetric mouse-down rectangle", () => {
|
|
const rectangle = cutDrag.createDragRectangle(
|
|
{ x: 100, y: 80 },
|
|
{ width: 10, height: 6 });
|
|
|
|
assert.deepEqual(rectangle, {
|
|
left: 90,
|
|
top: 74,
|
|
width: 10,
|
|
height: 6,
|
|
right: 100,
|
|
bottom: 80
|
|
});
|
|
assert.equal(Object.isFrozen(rectangle), true);
|
|
});
|
|
|
|
test("matches Rectangle.Contains right/bottom-exclusive drag decisions", () => {
|
|
const down = { x: 100, y: 80 };
|
|
const rectangle = cutDrag.createDragRectangle(
|
|
down,
|
|
{ width: 10, height: 6 });
|
|
|
|
assert.equal(cutDrag.shouldStart(rectangle, down), true, "same point");
|
|
assert.equal(
|
|
cutDrag.shouldStart(rectangle, { x: 101, y: 79 }), true, "right");
|
|
assert.equal(
|
|
cutDrag.shouldStart(rectangle, { x: 99, y: 81 }), true, "down");
|
|
assert.equal(
|
|
cutDrag.shouldStart(rectangle, { x: 89, y: 79 }), true, "left boundary crossed");
|
|
assert.equal(
|
|
cutDrag.shouldStart(rectangle, { x: 99, y: 73 }), true, "top boundary crossed");
|
|
assert.equal(
|
|
cutDrag.shouldStart(rectangle, { x: 90, y: 74 }), false, "inside upper-left");
|
|
|
|
assert.equal(
|
|
cutDrag.shouldStart(rectangle, { x: 90, y: 79 }), false, "left is inclusive");
|
|
assert.equal(
|
|
cutDrag.shouldStart(rectangle, { x: 99, y: 74 }), false, "top is inclusive");
|
|
assert.equal(
|
|
cutDrag.shouldStart(rectangle, { x: 100, y: 79 }), true, "right is exclusive");
|
|
assert.equal(
|
|
cutDrag.shouldStart(rectangle, { x: 99, y: 80 }), true, "bottom is exclusive");
|
|
});
|
|
|
|
test("validates finite coordinates and positive finite drag sizes", () => {
|
|
const validSize = { width: 4, height: 4 };
|
|
|
|
for (const down of [
|
|
null,
|
|
{ x: Number.NaN, y: 0 },
|
|
{ x: 0, y: Number.POSITIVE_INFINITY },
|
|
{ x: "0", y: 0 }
|
|
]) {
|
|
assert.throws(
|
|
() => cutDrag.createDragRectangle(down, validSize),
|
|
TypeError);
|
|
}
|
|
|
|
for (const dragSize of [
|
|
null,
|
|
{ width: 0, height: 1 },
|
|
{ width: 1, height: -1 },
|
|
{ width: Number.NaN, height: 1 },
|
|
{ width: 1, height: Number.POSITIVE_INFINITY }
|
|
]) {
|
|
assert.throws(
|
|
() => cutDrag.createDragRectangle({ x: 0, y: 0 }, dragSize),
|
|
RangeError);
|
|
}
|
|
|
|
const rectangle = cutDrag.createDragRectangle(
|
|
{ x: 4, y: 4 },
|
|
validSize);
|
|
assert.throws(
|
|
() => cutDrag.shouldStart(rectangle, { x: Number.NaN, y: 0 }),
|
|
TypeError);
|
|
});
|
|
|
|
test("maps DIP metrics to CSS pixels at 100 and 150 percent host DPI", () => {
|
|
assert.deepEqual(cutDrag.toCssDragSize(
|
|
{ width: 4, height: 6 }, 1, 1),
|
|
{ width: 4, height: 6 });
|
|
assert.deepEqual(cutDrag.toCssDragSize(
|
|
{ width: 4, height: 6 }, 1.5, 1.5),
|
|
{ width: 4, height: 6 });
|
|
});
|
|
|
|
test("accounts for a retained WebView browser zoom in pointer CSS coordinates", () => {
|
|
assert.deepEqual(cutDrag.toCssDragSize(
|
|
{ width: 4, height: 6 }, 1.5, 1.875),
|
|
{ width: 3.2, height: 4.8 });
|
|
assert.deepEqual(cutDrag.toCssDragSize(
|
|
{ width: 4, height: 6 }, 1, 1.25),
|
|
{ width: 3.2, height: 4.8 });
|
|
});
|
|
|
|
test("keeps fractional CSS boundaries after retained zoom conversion", () => {
|
|
const size = cutDrag.toCssDragSize({ width: 4, height: 4 }, 1, 1.25);
|
|
const rectangle = cutDrag.createDragRectangle({ x: 10.5, y: 10.5 }, size);
|
|
|
|
assert.equal(cutDrag.shouldStart(rectangle, { x: 7.31, y: 7.31 }), false);
|
|
assert.equal(cutDrag.shouldStart(rectangle, { x: 7.29, y: 7.31 }), true);
|
|
assert.equal(cutDrag.shouldStart(rectangle, { x: 7.31, y: 7.29 }), true);
|
|
assert.equal(cutDrag.shouldStart(rectangle, { x: 10.5, y: 10.49 }), true);
|
|
});
|
|
|
|
test("uses a neutral zoom ratio for missing or abnormal scale measurements", () => {
|
|
for (const scales of [
|
|
[0, 0],
|
|
[Number.NaN, Number.NaN],
|
|
[1, Number.POSITIVE_INFINITY],
|
|
[1, 0.1],
|
|
[1, 10]
|
|
]) {
|
|
assert.deepEqual(cutDrag.toCssDragSize(
|
|
{ width: 4, height: 6 }, scales[0], scales[1]),
|
|
{ width: 4, height: 6 });
|
|
}
|
|
});
|
|
|
|
test("publishes the same API as a browser global", () => {
|
|
assert.equal(globalThis.LegacyCutDrag, cutDrag);
|
|
assert.equal(typeof cutDrag.createDragRectangle, "function");
|
|
assert.equal(typeof cutDrag.shouldStart, "function");
|
|
assert.equal(typeof cutDrag.toCssDragSize, "function");
|
|
});
|