@aics/vole-app 3.3.1 → 3.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/aics-image-viewer/components/App/index.js +1 -0
- package/es/aics-image-viewer/components/BottomPanel/index.js +48 -19
- package/es/aics-image-viewer/components/BottomPanel/styles.css +16 -7
- package/es/aics-image-viewer/components/CellViewerCanvasWrapper/index.js +39 -19
- package/es/aics-image-viewer/components/ControlPanel/index.js +2 -0
- package/es/aics-image-viewer/components/dimension_sliders/AxisClipSliders.js +148 -0
- package/es/aics-image-viewer/components/dimension_sliders/RotationSliders.js +167 -0
- package/es/aics-image-viewer/components/dimension_sliders/SliderRows.js +167 -0
- package/es/aics-image-viewer/components/{AxisClipSliders → dimension_sliders}/styles.css +7 -1
- package/es/aics-image-viewer/components/shared/NumericInput/index.js +4 -2
- package/es/aics-image-viewer/components/shared/SliderRow/index.js +2 -0
- package/es/aics-image-viewer/components/shared/SliderRow/styles.css +2 -1
- package/es/aics-image-viewer/shared/constants.js +1 -1
- package/es/aics-image-viewer/shared/utils/camera.js +122 -0
- package/es/aics-image-viewer/shared/utils/test/camera.test.js +127 -0
- package/es/aics-image-viewer/shared/utils/test/urlParsing.test.js +23 -702
- package/es/aics-image-viewer/shared/utils/urlParsing.js +14 -828
- package/es/aics-image-viewer/state/deserialize.js +437 -0
- package/es/aics-image-viewer/state/serialize.js +145 -0
- package/es/aics-image-viewer/state/test/deserialize.test.js +432 -0
- package/es/aics-image-viewer/state/test/serialize.test.js +97 -0
- package/es/aics-image-viewer/state/test/test_data.js +168 -0
- package/es/aics-image-viewer/state/types.js +265 -1
- package/package.json +2 -1
- package/type-declarations/aics-image-viewer/components/App/types.d.ts +1 -1
- package/type-declarations/aics-image-viewer/components/BottomPanel/index.d.ts +6 -3
- package/type-declarations/aics-image-viewer/components/CellViewerCanvasWrapper/index.d.ts +1 -0
- package/type-declarations/aics-image-viewer/components/{AxisClipSliders/index.d.ts → dimension_sliders/AxisClipSliders.d.ts} +2 -3
- package/type-declarations/aics-image-viewer/components/dimension_sliders/RotationSliders.d.ts +6 -0
- package/type-declarations/aics-image-viewer/components/dimension_sliders/SliderRows.d.ts +31 -0
- package/type-declarations/aics-image-viewer/components/shared/NumericInput/index.d.ts +1 -0
- package/type-declarations/aics-image-viewer/components/shared/SliderRow/index.d.ts +3 -1
- package/type-declarations/aics-image-viewer/shared/utils/camera.d.ts +19 -0
- package/type-declarations/aics-image-viewer/shared/utils/urlParsing.d.ts +1 -307
- package/type-declarations/aics-image-viewer/state/deserialize.d.ts +70 -0
- package/type-declarations/aics-image-viewer/state/serialize.d.ts +20 -0
- package/type-declarations/aics-image-viewer/state/types.d.ts +216 -0
- package/es/aics-image-viewer/components/AxisClipSliders/index.js +0 -295
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
2
|
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
3
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
4
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
5
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
6
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
7
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
3
8
|
function _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && o.reverse()); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
|
|
4
9
|
function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
|
|
5
10
|
function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; }
|
|
@@ -9,704 +14,20 @@ function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c
|
|
|
9
14
|
function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
|
|
10
15
|
function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
|
|
11
16
|
function _OverloadYield(e, d) { this.v = e, this.k = d; }
|
|
12
|
-
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
|
13
|
-
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
|
|
14
17
|
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
15
18
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
16
19
|
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
17
20
|
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
18
21
|
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
19
22
|
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
20
|
-
function
|
|
21
|
-
function
|
|
22
|
-
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
23
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
24
|
-
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
23
|
+
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
|
24
|
+
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
|
|
25
25
|
import { describe, expect, it } from "@jest/globals";
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
color: undefined,
|
|
32
|
-
enabled: undefined,
|
|
33
|
-
surfaceEnabled: undefined,
|
|
34
|
-
isovalue: undefined,
|
|
35
|
-
surfaceOpacity: undefined,
|
|
36
|
-
colorizeEnabled: undefined,
|
|
37
|
-
colorizeAlpha: undefined
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
//// VALUE PARSING ///////////////////////////////////////
|
|
41
|
-
|
|
42
|
-
describe("LEGACY_CONTROL_POINTS_REGEX", function () {
|
|
43
|
-
it("accepts single control points", function () {
|
|
44
|
-
var data = "1:0.5:ffffff";
|
|
45
|
-
expect(LEGACY_CONTROL_POINTS_REGEX.test(data)).toBe(true);
|
|
46
|
-
});
|
|
47
|
-
it("accepts multiple control points", function () {
|
|
48
|
-
var data = "1:0.5:ff0000,128:0.7:ffff00,255:1:ff0000";
|
|
49
|
-
expect(LEGACY_CONTROL_POINTS_REGEX.test(data)).toBe(true);
|
|
50
|
-
});
|
|
51
|
-
it("accepts negative numbers", function () {
|
|
52
|
-
var data = "-1:0.5:ff0000,-255:1:ff0000";
|
|
53
|
-
expect(LEGACY_CONTROL_POINTS_REGEX.test(data)).toBe(true);
|
|
54
|
-
});
|
|
55
|
-
it("allows 'w' as a placeholder for color strings", function () {
|
|
56
|
-
var data = "1:0.5:1,255:1:1";
|
|
57
|
-
expect(LEGACY_CONTROL_POINTS_REGEX.test(data)).toBe(true);
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
describe("CONTROL_POINTS_REGEX", function () {
|
|
61
|
-
it("accepts single control points", function () {
|
|
62
|
-
var data = "1:0.5:ffffff";
|
|
63
|
-
expect(CONTROL_POINTS_REGEX.test(data)).toBe(true);
|
|
64
|
-
});
|
|
65
|
-
it("accepts multiple control points", function () {
|
|
66
|
-
var data = "1:0.5:ff0000:128:0.7:ffff00:255:1:ff0000";
|
|
67
|
-
expect(CONTROL_POINTS_REGEX.test(data)).toBe(true);
|
|
68
|
-
});
|
|
69
|
-
it("accepts negative numbers", function () {
|
|
70
|
-
var data = "-1:0.5:ff0000:-255:1:ff0000";
|
|
71
|
-
expect(CONTROL_POINTS_REGEX.test(data)).toBe(true);
|
|
72
|
-
});
|
|
73
|
-
it("allows empty color strings", function () {
|
|
74
|
-
var data = "1:0.5:1:255:1:1";
|
|
75
|
-
expect(CONTROL_POINTS_REGEX.test(data)).toBe(true);
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
describe("parseKeyValueList", function () {
|
|
79
|
-
it("returns expected key value pairs", function () {
|
|
80
|
-
var data = "key1:value1,key2:value2";
|
|
81
|
-
var result = parseKeyValueList(data);
|
|
82
|
-
expect(result).toEqual({
|
|
83
|
-
key1: "value1",
|
|
84
|
-
key2: "value2"
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
it("decodes encoded key and value string names", function () {
|
|
88
|
-
var data = "ampersand%26:ampersand%26,comma%2C:comma%2C,colon%3A:colon%3A";
|
|
89
|
-
var result = parseKeyValueList(data);
|
|
90
|
-
expect(result).toEqual({
|
|
91
|
-
"ampersand&": "ampersand&",
|
|
92
|
-
"comma,": "comma,",
|
|
93
|
-
"colon:": "colon:"
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
it("ignores repeat colons in value string", function () {
|
|
97
|
-
var data = "key1:value1:extra:extra,key2:value2";
|
|
98
|
-
var result = parseKeyValueList(data);
|
|
99
|
-
expect(result).toEqual({
|
|
100
|
-
key1: "value1:extra:extra",
|
|
101
|
-
key2: "value2"
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
it("returns empty object for empty string", function () {
|
|
105
|
-
var data = "";
|
|
106
|
-
var result = parseKeyValueList(data);
|
|
107
|
-
expect(result).toEqual({});
|
|
108
|
-
});
|
|
109
|
-
it("parses example viewer channel settings", function () {
|
|
110
|
-
var data = "col:FF0000,clz:1,cza:0.5,isa:0.75,ven:1,sen:1,isv:128,lut:autoij:";
|
|
111
|
-
var result = parseKeyValueList(data);
|
|
112
|
-
expect(result).toEqual({
|
|
113
|
-
col: "FF0000",
|
|
114
|
-
clz: "1",
|
|
115
|
-
cza: "0.5",
|
|
116
|
-
isa: "0.75",
|
|
117
|
-
ven: "1",
|
|
118
|
-
sen: "1",
|
|
119
|
-
isv: "128",
|
|
120
|
-
lut: "autoij:"
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
it("removes trailing and leading whitespace", function () {
|
|
124
|
-
var data = " key1 : value1 , key2 : value2 , key3: value 3";
|
|
125
|
-
var result = parseKeyValueList(data);
|
|
126
|
-
expect(result).toEqual({
|
|
127
|
-
key1: "value1",
|
|
128
|
-
key2: "value2",
|
|
129
|
-
key3: "value 3"
|
|
130
|
-
});
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
describe("parseHexColorAsColorArray", function () {
|
|
134
|
-
it("parses hex values", function () {
|
|
135
|
-
expect(parseHexColorAsColorArray("000000")).toEqual([0, 0, 0]);
|
|
136
|
-
expect(parseHexColorAsColorArray("FFFFFF")).toEqual([255, 255, 255]);
|
|
137
|
-
expect(parseHexColorAsColorArray("ff0000")).toEqual([255, 0, 0]);
|
|
138
|
-
expect(parseHexColorAsColorArray("123456")).toEqual([18, 52, 86]);
|
|
139
|
-
expect(parseHexColorAsColorArray("7890ab")).toEqual([120, 144, 171]);
|
|
140
|
-
expect(parseHexColorAsColorArray("cdefef")).toEqual([205, 239, 239]);
|
|
141
|
-
expect(parseHexColorAsColorArray("ABCDEF")).toEqual([171, 205, 239]);
|
|
142
|
-
});
|
|
143
|
-
it("ignores unrecognized formats", function () {
|
|
144
|
-
expect(parseHexColorAsColorArray("f")).toBeUndefined();
|
|
145
|
-
expect(parseHexColorAsColorArray("fff")).toBeUndefined();
|
|
146
|
-
expect(parseHexColorAsColorArray("fffffff")).toBeUndefined();
|
|
147
|
-
expect(parseHexColorAsColorArray("hjklmn")).toBeUndefined();
|
|
148
|
-
});
|
|
149
|
-
it("parses the '1' code as white", function () {
|
|
150
|
-
expect(parseHexColorAsColorArray("1")).toEqual([255, 255, 255]);
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
describe("parseStringEnum", function () {
|
|
154
|
-
var TestEnum = /*#__PURE__*/function (TestEnum) {
|
|
155
|
-
TestEnum["SOME_VALUE"] = "some_value";
|
|
156
|
-
TestEnum["ANOTHER_VALUE"] = "another_value";
|
|
157
|
-
return TestEnum;
|
|
158
|
-
}({});
|
|
159
|
-
it("recognizes enum values", function () {
|
|
160
|
-
expect(parseStringEnum("some_value", TestEnum)).toEqual(TestEnum.SOME_VALUE);
|
|
161
|
-
expect(parseStringEnum("another_value", TestEnum)).toEqual(TestEnum.ANOTHER_VALUE);
|
|
162
|
-
});
|
|
163
|
-
it("returns default values for unrecognized enum values", function () {
|
|
164
|
-
expect(parseStringEnum("unexpected", TestEnum, undefined)).toEqual(undefined);
|
|
165
|
-
expect(parseStringEnum("unexpected", TestEnum, TestEnum.SOME_VALUE)).toEqual(TestEnum.SOME_VALUE);
|
|
166
|
-
});
|
|
167
|
-
});
|
|
168
|
-
describe("parseStringInt", function () {
|
|
169
|
-
it("parses int and undefined values", function () {
|
|
170
|
-
expect(parseStringInt("0", 0, 1000)).toEqual(0);
|
|
171
|
-
expect(parseStringInt("1", 0, 1000)).toEqual(1);
|
|
172
|
-
expect(parseStringInt("100", 0, 1000)).toEqual(100);
|
|
173
|
-
expect(parseStringInt("255", 0, 1000)).toEqual(255);
|
|
174
|
-
expect(parseStringInt("-1", -1000, 1000)).toEqual(-1);
|
|
175
|
-
});
|
|
176
|
-
it("returns undefined for undefined and NaN values", function () {
|
|
177
|
-
expect(parseStringInt("bad", -1000, 1000)).toEqual(undefined);
|
|
178
|
-
expect(parseStringInt("NaN", -1000, 1000)).toEqual(undefined);
|
|
179
|
-
expect(parseStringInt(undefined, -1000, 1000)).toEqual(undefined);
|
|
180
|
-
});
|
|
181
|
-
it("casts float values to integers", function () {
|
|
182
|
-
expect(parseStringInt("0.5", 0, 1000)).toEqual(0);
|
|
183
|
-
expect(parseStringInt("99.5", 0, 1000)).toEqual(99);
|
|
184
|
-
expect(parseStringInt("-10.5", -1000, 1000)).toEqual(-10);
|
|
185
|
-
});
|
|
186
|
-
it("applies clamping", function () {
|
|
187
|
-
expect(parseStringInt("0", 0, 255)).toEqual(0);
|
|
188
|
-
expect(parseStringInt("-1", 0, 255)).toEqual(0);
|
|
189
|
-
expect(parseStringInt("128", 0, 255)).toEqual(128);
|
|
190
|
-
expect(parseStringInt("255", 0, 255)).toEqual(255);
|
|
191
|
-
expect(parseStringInt("256", 0, 255)).toEqual(255);
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
describe("parseStringFloat", function () {
|
|
195
|
-
it("parses strings to float values", function () {
|
|
196
|
-
expect(parseStringFloat("0", -1000, 1000)).toEqual(0);
|
|
197
|
-
expect(parseStringFloat("1.0", -1000, 1000)).toEqual(1.0);
|
|
198
|
-
expect(parseStringFloat("0.5", -1000, 1000)).toEqual(0.5);
|
|
199
|
-
expect(parseStringFloat("128.5", -1000, 1000)).toEqual(128.5);
|
|
200
|
-
expect(parseStringFloat("495.344", -1000, 1000)).toEqual(495.344);
|
|
201
|
-
expect(parseStringFloat("-1", -1000, 1000)).toEqual(-1);
|
|
202
|
-
});
|
|
203
|
-
it("returns undefined for NaN or undefined values", function () {
|
|
204
|
-
expect(parseStringFloat("bad", -1000, 1000)).toEqual(undefined);
|
|
205
|
-
expect(parseStringFloat("NaN", -1000, 1000)).toEqual(undefined);
|
|
206
|
-
expect(parseStringFloat(undefined, -1000, 1000)).toEqual(undefined);
|
|
207
|
-
});
|
|
208
|
-
it("applies clamping", function () {
|
|
209
|
-
expect(parseStringFloat("0.5", 0, 1.0)).toEqual(0.5);
|
|
210
|
-
expect(parseStringFloat("1.0", 0, 1.0)).toEqual(1.0);
|
|
211
|
-
expect(parseStringFloat("1.1", 0, 1.0)).toEqual(1.0);
|
|
212
|
-
expect(parseStringFloat("0", 0, 1.0)).toEqual(0);
|
|
213
|
-
expect(parseStringFloat("-0.1", 0, 1.0)).toEqual(0);
|
|
214
|
-
});
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
//// SERIALIZE STATES ///////////////////////
|
|
218
|
-
|
|
219
|
-
describe("Channel state serialization", function () {
|
|
220
|
-
var DEFAULT_CHANNEL_STATE = {
|
|
221
|
-
name: "",
|
|
222
|
-
displayName: "",
|
|
223
|
-
color: [255, 0, 0],
|
|
224
|
-
volumeEnabled: true,
|
|
225
|
-
isosurfaceEnabled: true,
|
|
226
|
-
isovalue: 128,
|
|
227
|
-
opacity: 0.75,
|
|
228
|
-
colorizeEnabled: true,
|
|
229
|
-
colorizeAlpha: 0.5,
|
|
230
|
-
useControlPoints: false,
|
|
231
|
-
controlPoints: [{
|
|
232
|
-
x: 0,
|
|
233
|
-
opacity: 0.5,
|
|
234
|
-
color: [255, 255, 255]
|
|
235
|
-
}, {
|
|
236
|
-
x: 255,
|
|
237
|
-
opacity: 1.0,
|
|
238
|
-
color: [255, 255, 255]
|
|
239
|
-
}],
|
|
240
|
-
ramp: [0, 255],
|
|
241
|
-
plotMin: 0,
|
|
242
|
-
plotMax: 255,
|
|
243
|
-
keepIntensityRange: false
|
|
244
|
-
};
|
|
245
|
-
var DEFAULT_SERIALIZED_CHANNEL_STATE = {
|
|
246
|
-
col: "ff0000",
|
|
247
|
-
ven: "1",
|
|
248
|
-
sen: "1",
|
|
249
|
-
isv: "128",
|
|
250
|
-
isa: "0.75",
|
|
251
|
-
clz: "1",
|
|
252
|
-
cza: "0.5",
|
|
253
|
-
cpe: "0",
|
|
254
|
-
cpt: "0:0.5:1:255:1:1",
|
|
255
|
-
ram: "0:255",
|
|
256
|
-
pin: "0"
|
|
257
|
-
};
|
|
258
|
-
|
|
259
|
-
// Note that the serialization + deserialization are NOT direct inverses.
|
|
260
|
-
// Serializing converts a ChannelState object to a ViewerChannelSettingParams object,
|
|
261
|
-
// deserializing converts a ViewerChannelSettingParams object to a **ViewerChannelSetting** object.
|
|
262
|
-
|
|
263
|
-
// ChannelStates are per-channel and are used internally, while ViewerChannelSettings are
|
|
264
|
-
// input into the viewer and support grouping/matching to multiple channels.
|
|
265
|
-
// TODO: refactor these to all be the same state?
|
|
266
|
-
|
|
267
|
-
describe("deserializeViewerChannelSetting", function () {
|
|
268
|
-
it("returns default settings for empty objects", function () {
|
|
269
|
-
var data = {};
|
|
270
|
-
var result = deserializeViewerChannelSetting(0, data);
|
|
271
|
-
expect(result).toEqual(defaultSettings);
|
|
272
|
-
});
|
|
273
|
-
it("ignores unexpected keys", function () {
|
|
274
|
-
var data = {
|
|
275
|
-
badKey: "badValue",
|
|
276
|
-
ven: "1",
|
|
277
|
-
sen: "1"
|
|
278
|
-
};
|
|
279
|
-
var result = deserializeViewerChannelSetting(0, data);
|
|
280
|
-
expect(result).toEqual(_objectSpread(_objectSpread({}, defaultSettings), {}, {
|
|
281
|
-
enabled: true,
|
|
282
|
-
surfaceEnabled: true
|
|
283
|
-
}));
|
|
284
|
-
});
|
|
285
|
-
it("parses settings correctly", function () {
|
|
286
|
-
var data = {
|
|
287
|
-
col: "FF0000",
|
|
288
|
-
clz: "1",
|
|
289
|
-
cza: "0.5",
|
|
290
|
-
isa: "0.75",
|
|
291
|
-
ven: "1",
|
|
292
|
-
sen: "1",
|
|
293
|
-
isv: "128",
|
|
294
|
-
lut: "0:255"
|
|
295
|
-
};
|
|
296
|
-
expect(deserializeViewerChannelSetting(0, data)).toEqual({
|
|
297
|
-
match: 0,
|
|
298
|
-
color: "FF0000",
|
|
299
|
-
enabled: true,
|
|
300
|
-
surfaceEnabled: true,
|
|
301
|
-
isovalue: 128,
|
|
302
|
-
surfaceOpacity: 0.75,
|
|
303
|
-
colorizeEnabled: true,
|
|
304
|
-
colorizeAlpha: 0.5,
|
|
305
|
-
intensity: {
|
|
306
|
-
lut: ["0", "255"]
|
|
307
|
-
}
|
|
308
|
-
});
|
|
309
|
-
});
|
|
310
|
-
it("handles expected lut formatting", function () {
|
|
311
|
-
var luts = [["autoij:0", ["autoij", "0"]], ["0:autoij", ["0", "autoij"]], [":autoij", ["", "autoij"]], ["autoij:", ["autoij", ""]], ["0:255", ["0", "255"]], ["0.5:1.0", ["0.5", "1.0"]], ["0.50:1.00", ["0.50", "1.00"]], ["m99:m100", ["m99", "m100"]], ["p10:p90", ["p10", "p90"]], ["p10: p90", ["p10", "p90"]] // handle spaces
|
|
312
|
-
];
|
|
313
|
-
for (var _i = 0, _luts = luts; _i < _luts.length; _i++) {
|
|
314
|
-
var _result$intensity;
|
|
315
|
-
var _luts$_i = _slicedToArray(_luts[_i], 2),
|
|
316
|
-
encodedLut = _luts$_i[0],
|
|
317
|
-
decodedLut = _luts$_i[1];
|
|
318
|
-
var data = {
|
|
319
|
-
lut: encodedLut
|
|
320
|
-
};
|
|
321
|
-
var result = deserializeViewerChannelSetting(0, data);
|
|
322
|
-
expect((_result$intensity = result.intensity) === null || _result$intensity === void 0 ? void 0 : _result$intensity.lut).toEqual(decodedLut);
|
|
323
|
-
}
|
|
324
|
-
});
|
|
325
|
-
it("ignores unexpected lut formats", function () {
|
|
326
|
-
var luts = ["!:0", "0:9:93", "255", ""];
|
|
327
|
-
for (var _i2 = 0, _luts2 = luts; _i2 < _luts2.length; _i2++) {
|
|
328
|
-
var lut = _luts2[_i2];
|
|
329
|
-
var data = {
|
|
330
|
-
lut: lut
|
|
331
|
-
};
|
|
332
|
-
var result = deserializeViewerChannelSetting(0, data);
|
|
333
|
-
expect(result.lut).toBeUndefined();
|
|
334
|
-
}
|
|
335
|
-
});
|
|
336
|
-
it("handles hex color formats", function () {
|
|
337
|
-
var colors = ["000000", "FFFFFF", "ffffff", "012345", "6789AB", "CDEF01", "abcdef"];
|
|
338
|
-
for (var _i3 = 0, _colors = colors; _i3 < _colors.length; _i3++) {
|
|
339
|
-
var color = _colors[_i3];
|
|
340
|
-
var data = {
|
|
341
|
-
col: color
|
|
342
|
-
};
|
|
343
|
-
var result = deserializeViewerChannelSetting(0, data);
|
|
344
|
-
expect(result.color).toEqual(color);
|
|
345
|
-
}
|
|
346
|
-
});
|
|
347
|
-
it("ignores bad color formats", function () {
|
|
348
|
-
var badColors = ["f", "ff00", "red", "rgb(255,0,0)"];
|
|
349
|
-
for (var _i4 = 0, _badColors = badColors; _i4 < _badColors.length; _i4++) {
|
|
350
|
-
var color = _badColors[_i4];
|
|
351
|
-
var data = {
|
|
352
|
-
col: color
|
|
353
|
-
};
|
|
354
|
-
var result = deserializeViewerChannelSetting(0, data);
|
|
355
|
-
expect(result.color).toBeUndefined();
|
|
356
|
-
}
|
|
357
|
-
});
|
|
358
|
-
it("ignores bad float data", function () {
|
|
359
|
-
var data = {
|
|
360
|
-
cza: "NaN",
|
|
361
|
-
isa: "bad",
|
|
362
|
-
isv: "f8"
|
|
363
|
-
};
|
|
364
|
-
var result = deserializeViewerChannelSetting(0, data);
|
|
365
|
-
expect(result.colorizeAlpha).toBeUndefined();
|
|
366
|
-
expect(result.surfaceOpacity).toBeUndefined();
|
|
367
|
-
expect(result.isovalue).toBeUndefined();
|
|
368
|
-
});
|
|
369
|
-
});
|
|
370
|
-
describe("serializeViewerChannelSetting", function () {
|
|
371
|
-
it("serializes channel settings", function () {
|
|
372
|
-
expect(serializeViewerChannelSetting(DEFAULT_CHANNEL_STATE, false)).toEqual(DEFAULT_SERIALIZED_CHANNEL_STATE);
|
|
373
|
-
});
|
|
374
|
-
it("serializes custom channel settings", function () {
|
|
375
|
-
var customChannelState = {
|
|
376
|
-
name: "a",
|
|
377
|
-
displayName: "a",
|
|
378
|
-
color: [3, 255, 157],
|
|
379
|
-
volumeEnabled: false,
|
|
380
|
-
isosurfaceEnabled: false,
|
|
381
|
-
isovalue: 0,
|
|
382
|
-
opacity: 0.54,
|
|
383
|
-
colorizeEnabled: false,
|
|
384
|
-
colorizeAlpha: 1.0,
|
|
385
|
-
useControlPoints: false,
|
|
386
|
-
controlPoints: [],
|
|
387
|
-
ramp: [0, 255],
|
|
388
|
-
// TODO: the settings below are not serialized. should they be? (see #384)
|
|
389
|
-
plotMin: 0,
|
|
390
|
-
plotMax: 255,
|
|
391
|
-
keepIntensityRange: false
|
|
392
|
-
};
|
|
393
|
-
var serializedCustomChannelState = {
|
|
394
|
-
col: "03ff9d",
|
|
395
|
-
ven: "0",
|
|
396
|
-
sen: "0",
|
|
397
|
-
isv: "0",
|
|
398
|
-
isa: "0.54",
|
|
399
|
-
clz: "0",
|
|
400
|
-
cza: "1",
|
|
401
|
-
cpe: "0",
|
|
402
|
-
cpt: "",
|
|
403
|
-
ram: "0:255",
|
|
404
|
-
pin: "0"
|
|
405
|
-
};
|
|
406
|
-
expect(serializeViewerChannelSetting(customChannelState, false)).toEqual(serializedCustomChannelState);
|
|
407
|
-
});
|
|
408
|
-
});
|
|
409
|
-
});
|
|
410
|
-
describe("Viewer state", function () {
|
|
411
|
-
var DEFAULT_VIEWER_STATE = {
|
|
412
|
-
viewMode: ViewMode.threeD,
|
|
413
|
-
// "XY", "XZ", "YZ"
|
|
414
|
-
renderMode: RenderMode.volumetric,
|
|
415
|
-
// "pathtrace", "maxproject"
|
|
416
|
-
imageType: ImageType.segmentedCell,
|
|
417
|
-
showAxes: false,
|
|
418
|
-
showBoundingBox: false,
|
|
419
|
-
backgroundColor: [0, 0, 0],
|
|
420
|
-
boundingBoxColor: [255, 255, 255],
|
|
421
|
-
autorotate: false,
|
|
422
|
-
maskAlpha: 0,
|
|
423
|
-
brightness: 70,
|
|
424
|
-
density: 50,
|
|
425
|
-
levels: [35, 140, 255],
|
|
426
|
-
interpolationEnabled: true,
|
|
427
|
-
region: {
|
|
428
|
-
x: [0, 1],
|
|
429
|
-
y: [0, 1],
|
|
430
|
-
z: [0, 1]
|
|
431
|
-
},
|
|
432
|
-
slice: {
|
|
433
|
-
x: 0.5,
|
|
434
|
-
y: 0.5,
|
|
435
|
-
z: 0.5
|
|
436
|
-
},
|
|
437
|
-
time: 0,
|
|
438
|
-
scene: 0,
|
|
439
|
-
cameraState: undefined,
|
|
440
|
-
singleChannelMode: false,
|
|
441
|
-
singleChannelIndex: 0,
|
|
442
|
-
useExactScaleLevel: false,
|
|
443
|
-
scaleLevelIndex: 0
|
|
444
|
-
};
|
|
445
|
-
var SERIALIZED_DEFAULT_VIEWER_STATE = {
|
|
446
|
-
mode: "volumetric",
|
|
447
|
-
view: "3D",
|
|
448
|
-
image: "cell",
|
|
449
|
-
axes: "0",
|
|
450
|
-
bb: "0",
|
|
451
|
-
bgcol: "000000",
|
|
452
|
-
bbcol: "ffffff",
|
|
453
|
-
rot: "0",
|
|
454
|
-
mask: "0",
|
|
455
|
-
bright: "70",
|
|
456
|
-
dens: "50",
|
|
457
|
-
lvl: "35,140,255",
|
|
458
|
-
interp: "1",
|
|
459
|
-
reg: "0:1,0:1,0:1",
|
|
460
|
-
slice: "0.5,0.5,0.5",
|
|
461
|
-
t: "0",
|
|
462
|
-
scene: "0",
|
|
463
|
-
scm: "0",
|
|
464
|
-
sci: "0",
|
|
465
|
-
esl: "0",
|
|
466
|
-
scl: "0"
|
|
467
|
-
};
|
|
468
|
-
var CUSTOM_VIEWER_STATE = {
|
|
469
|
-
renderMode: RenderMode.pathTrace,
|
|
470
|
-
viewMode: ViewMode.xy,
|
|
471
|
-
imageType: ImageType.fullField,
|
|
472
|
-
showAxes: true,
|
|
473
|
-
showBoundingBox: true,
|
|
474
|
-
backgroundColor: [255, 0, 0],
|
|
475
|
-
boundingBoxColor: [0, 255, 0],
|
|
476
|
-
autorotate: true,
|
|
477
|
-
maskAlpha: 55,
|
|
478
|
-
brightness: 100,
|
|
479
|
-
density: 75,
|
|
480
|
-
levels: [0, 250, 251],
|
|
481
|
-
interpolationEnabled: false,
|
|
482
|
-
region: {
|
|
483
|
-
x: [0, 0.5],
|
|
484
|
-
y: [0, 1],
|
|
485
|
-
z: [0, 1]
|
|
486
|
-
},
|
|
487
|
-
slice: {
|
|
488
|
-
x: 0.25,
|
|
489
|
-
y: 0.75,
|
|
490
|
-
z: 0.5
|
|
491
|
-
},
|
|
492
|
-
time: 100,
|
|
493
|
-
scene: 3,
|
|
494
|
-
singleChannelMode: true,
|
|
495
|
-
singleChannelIndex: 3,
|
|
496
|
-
useExactScaleLevel: true,
|
|
497
|
-
scaleLevelIndex: 3,
|
|
498
|
-
cameraState: {
|
|
499
|
-
position: [-1.05, -4, 45],
|
|
500
|
-
target: [0, 0, 0],
|
|
501
|
-
up: [0, 1, 0],
|
|
502
|
-
orthoScale: 3.534,
|
|
503
|
-
fov: 43.5
|
|
504
|
-
}
|
|
505
|
-
};
|
|
506
|
-
var SERIALIZED_CUSTOM_VIEWER_STATE = {
|
|
507
|
-
mode: "pathtrace",
|
|
508
|
-
view: "Z",
|
|
509
|
-
image: "fov",
|
|
510
|
-
axes: "1",
|
|
511
|
-
bb: "1",
|
|
512
|
-
bgcol: "ff0000",
|
|
513
|
-
bbcol: "00ff00",
|
|
514
|
-
rot: "1",
|
|
515
|
-
mask: "55",
|
|
516
|
-
bright: "100",
|
|
517
|
-
dens: "75",
|
|
518
|
-
lvl: "0,250,251",
|
|
519
|
-
interp: "0",
|
|
520
|
-
reg: "0:0.5,0:1,0:1",
|
|
521
|
-
slice: "0.25,0.75,0.5",
|
|
522
|
-
t: "100",
|
|
523
|
-
scene: "3",
|
|
524
|
-
scm: "1",
|
|
525
|
-
sci: "3",
|
|
526
|
-
esl: "1",
|
|
527
|
-
scl: "3",
|
|
528
|
-
cam: "pos:-1.05:-4:45,tar:0:0:0,up:0:1:0,ort:3.534,fov:43.5"
|
|
529
|
-
};
|
|
530
|
-
describe("serializeViewerState", function () {
|
|
531
|
-
it("serializes the default viewer settings", function () {
|
|
532
|
-
expect(serializeViewerState(DEFAULT_VIEWER_STATE, false)).toEqual(SERIALIZED_DEFAULT_VIEWER_STATE);
|
|
533
|
-
});
|
|
534
|
-
it("serializes custom viewer settings", function () {
|
|
535
|
-
expect(serializeViewerState(CUSTOM_VIEWER_STATE, false)).toEqual(SERIALIZED_CUSTOM_VIEWER_STATE);
|
|
536
|
-
});
|
|
537
|
-
it("shortens long numbers in the slice and region parameters", function () {
|
|
538
|
-
// Floats should be rounded to 7 significant digits or less
|
|
539
|
-
var state = {
|
|
540
|
-
region: {
|
|
541
|
-
x: [0.4566666666, 0.8667332],
|
|
542
|
-
y: [0.49999999, 0.8999999],
|
|
543
|
-
z: [0.3000000001, 0.16467883]
|
|
544
|
-
},
|
|
545
|
-
slice: {
|
|
546
|
-
x: 0.41111186,
|
|
547
|
-
y: 0.49999999,
|
|
548
|
-
z: 0.677402
|
|
549
|
-
}
|
|
550
|
-
};
|
|
551
|
-
var serializedState = serializeViewerState(state, true);
|
|
552
|
-
expect(serializedState.reg).toEqual("0.4566667:0.8667332,0.5:0.8999999,0.3:0.1646788");
|
|
553
|
-
expect(serializedState.slice).toEqual("0.4111119,0.5,0.677402");
|
|
554
|
-
});
|
|
555
|
-
});
|
|
556
|
-
describe("deserializeViewerState", function () {
|
|
557
|
-
it("returns an empty object for empty input", function () {
|
|
558
|
-
expect(deserializeViewerState({})).toEqual({});
|
|
559
|
-
});
|
|
560
|
-
it("deserializes the default viewer settings", function () {
|
|
561
|
-
var params = SERIALIZED_DEFAULT_VIEWER_STATE;
|
|
562
|
-
expect(deserializeViewerState(params)).toEqual(DEFAULT_VIEWER_STATE);
|
|
563
|
-
});
|
|
564
|
-
it("deserializes custom viewer settings", function () {
|
|
565
|
-
var params = SERIALIZED_CUSTOM_VIEWER_STATE;
|
|
566
|
-
expect(deserializeViewerState(params)).toEqual(CUSTOM_VIEWER_STATE);
|
|
567
|
-
});
|
|
568
|
-
it("handles all ViewMode values", function () {
|
|
569
|
-
var viewModes = Object.values(ViewMode);
|
|
570
|
-
for (var _i5 = 0, _viewModes = viewModes; _i5 < _viewModes.length; _i5++) {
|
|
571
|
-
var viewMode = _viewModes[_i5];
|
|
572
|
-
var state = _objectSpread(_objectSpread({}, DEFAULT_VIEWER_STATE), {}, {
|
|
573
|
-
viewMode: viewMode
|
|
574
|
-
});
|
|
575
|
-
expect(deserializeViewerState(serializeViewerState(state, false)).viewMode).toEqual(viewMode);
|
|
576
|
-
}
|
|
577
|
-
});
|
|
578
|
-
it("handles all RenderMode values", function () {
|
|
579
|
-
var renderModes = Object.values(RenderMode);
|
|
580
|
-
for (var _i6 = 0, _renderModes = renderModes; _i6 < _renderModes.length; _i6++) {
|
|
581
|
-
var renderMode = _renderModes[_i6];
|
|
582
|
-
var state = _objectSpread(_objectSpread({}, DEFAULT_VIEWER_STATE), {}, {
|
|
583
|
-
renderMode: renderMode
|
|
584
|
-
});
|
|
585
|
-
expect(deserializeViewerState(serializeViewerState(state, false)).renderMode).toEqual(renderMode);
|
|
586
|
-
}
|
|
587
|
-
});
|
|
588
|
-
it("deserializes partial camera settings", function () {
|
|
589
|
-
var state = {
|
|
590
|
-
cameraState: {
|
|
591
|
-
position: [1.0, -1.4, 45],
|
|
592
|
-
up: [0, 1, 0],
|
|
593
|
-
fov: 43.5
|
|
594
|
-
}
|
|
595
|
-
};
|
|
596
|
-
var serializedState = "pos:1:-1.4:45,up:0:1:0,fov:43.5";
|
|
597
|
-
expect(deserializeViewerState({
|
|
598
|
-
cam: serializedState
|
|
599
|
-
})).toEqual(state);
|
|
600
|
-
});
|
|
601
|
-
});
|
|
602
|
-
});
|
|
603
|
-
describe("Camera state", function () {
|
|
604
|
-
it("uses default camera state when choosing elements to exclude/ignore", function () {
|
|
605
|
-
var cameraState = _objectSpread({}, getDefaultCameraState());
|
|
606
|
-
// No changes from default
|
|
607
|
-
expect(serializeCameraState(cameraState, true)).toEqual(undefined);
|
|
608
|
-
cameraState = _objectSpread(_objectSpread({}, cameraState), {}, {
|
|
609
|
-
position: [1, 2, 3]
|
|
610
|
-
});
|
|
611
|
-
expect(serializeCameraState(cameraState, true)).toEqual("pos:1:2:3");
|
|
612
|
-
});
|
|
613
|
-
it("default camera state has not been changed", function () {
|
|
614
|
-
// The default camera state should NOT change unless backwards compatibility
|
|
615
|
-
// is added to ensure old links still maintain the same camera orientation;
|
|
616
|
-
// otherwise, cameras will appear in the new default orientation unexpectedly.
|
|
617
|
-
expect(getDefaultCameraState()).toEqual({
|
|
618
|
-
position: [0, 0, 5],
|
|
619
|
-
target: [0, 0, 0],
|
|
620
|
-
up: [0, 1, 0],
|
|
621
|
-
fov: 20,
|
|
622
|
-
orthoScale: 0.5
|
|
623
|
-
});
|
|
624
|
-
});
|
|
625
|
-
});
|
|
626
|
-
|
|
627
|
-
//// DESERIALIZE STATES ///////////////////////
|
|
628
|
-
|
|
629
|
-
describe("Channel state deserialization", function () {
|
|
630
|
-
var DEFAULT_CONTROL_POINTS = [{
|
|
631
|
-
x: -10,
|
|
632
|
-
opacity: 0,
|
|
633
|
-
color: [0, 0, 0]
|
|
634
|
-
}, {
|
|
635
|
-
x: 50,
|
|
636
|
-
opacity: 0,
|
|
637
|
-
color: [0, 0, 0]
|
|
638
|
-
}, {
|
|
639
|
-
x: 100,
|
|
640
|
-
opacity: 0.3,
|
|
641
|
-
color: [0, 16, 255]
|
|
642
|
-
}, {
|
|
643
|
-
x: 140,
|
|
644
|
-
opacity: 0.8,
|
|
645
|
-
color: [0, 255, 255]
|
|
646
|
-
}, {
|
|
647
|
-
x: 260,
|
|
648
|
-
opacity: 1,
|
|
649
|
-
color: [0, 255, 180]
|
|
650
|
-
}];
|
|
651
|
-
describe("legacy control points", function () {
|
|
652
|
-
it("parses comma-separated control points", function () {
|
|
653
|
-
var result = deserializeViewerChannelSetting(0, {
|
|
654
|
-
cps: "-10:0:000000,50:0:000000,100:0.3:0010ff,140:0.8:00ffff,260:1:00ffb4"
|
|
655
|
-
});
|
|
656
|
-
expect(result.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
|
|
657
|
-
});
|
|
658
|
-
it("parses colon-separated control points", function () {
|
|
659
|
-
var result = deserializeViewerChannelSetting(0, {
|
|
660
|
-
cps: "-10:0:000000:50:0:000000:100:0.3:0010ff:140:0.8:00ffff:260:1:00ffb4"
|
|
661
|
-
});
|
|
662
|
-
expect(result.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
|
|
663
|
-
});
|
|
664
|
-
it("replaces '1' color strings with default color #ffffff", function () {
|
|
665
|
-
var result = deserializeViewerChannelSetting(0, {
|
|
666
|
-
cps: "0:0:1:50:1:1"
|
|
667
|
-
});
|
|
668
|
-
expect(result.controlPoints).toEqual([{
|
|
669
|
-
x: 0,
|
|
670
|
-
opacity: 0,
|
|
671
|
-
color: [255, 255, 255]
|
|
672
|
-
}, {
|
|
673
|
-
x: 50,
|
|
674
|
-
opacity: 1,
|
|
675
|
-
color: [255, 255, 255]
|
|
676
|
-
}]);
|
|
677
|
-
});
|
|
678
|
-
});
|
|
679
|
-
it("parses comma-separated control points", function () {
|
|
680
|
-
var _result$intensity2;
|
|
681
|
-
var result = deserializeViewerChannelSetting(0, {
|
|
682
|
-
cpt: "-10:0:000000,50:0:000000,100:0.3:0010ff,140:0.8:00ffff,260:1:00ffb4"
|
|
683
|
-
});
|
|
684
|
-
expect((_result$intensity2 = result.intensity) === null || _result$intensity2 === void 0 ? void 0 : _result$intensity2.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
|
|
685
|
-
});
|
|
686
|
-
it("parses colon-separated control points", function () {
|
|
687
|
-
var _result$intensity3;
|
|
688
|
-
var result = deserializeViewerChannelSetting(0, {
|
|
689
|
-
cpt: "-10:0:000000:50:0:000000:100:0.3:0010ff:140:0.8:00ffff:260:1:00ffb4"
|
|
690
|
-
});
|
|
691
|
-
expect((_result$intensity3 = result.intensity) === null || _result$intensity3 === void 0 ? void 0 : _result$intensity3.controlPoints).toEqual(DEFAULT_CONTROL_POINTS);
|
|
692
|
-
});
|
|
693
|
-
it("replaces '1' color strings with default color #ffffff", function () {
|
|
694
|
-
var _result$intensity4;
|
|
695
|
-
var result = deserializeViewerChannelSetting(0, {
|
|
696
|
-
cpt: "0:0:1:50:1:1"
|
|
697
|
-
});
|
|
698
|
-
expect((_result$intensity4 = result.intensity) === null || _result$intensity4 === void 0 ? void 0 : _result$intensity4.controlPoints).toEqual([{
|
|
699
|
-
x: 0,
|
|
700
|
-
opacity: 0,
|
|
701
|
-
color: [255, 255, 255]
|
|
702
|
-
}, {
|
|
703
|
-
x: 50,
|
|
704
|
-
opacity: 1,
|
|
705
|
-
color: [255, 255, 255]
|
|
706
|
-
}]);
|
|
707
|
-
});
|
|
708
|
-
});
|
|
709
|
-
|
|
26
|
+
import { parseKeyValueList } from "../../../state/deserialize";
|
|
27
|
+
import { DEFAULT_TEST_VIEWER_CHANNEL_SETTING } from "../../../state/test/test_data";
|
|
28
|
+
import { getDefaultChannelState, getDefaultViewerState } from "../../constants";
|
|
29
|
+
import { ViewMode } from "../../enums";
|
|
30
|
+
import { parseViewerUrlParams, serializeViewerUrlParams } from "../urlParsing";
|
|
710
31
|
//// URL parsing /////////////////////////////////
|
|
711
32
|
|
|
712
33
|
describe("parseViewerUrlParams", function () {
|
|
@@ -752,17 +73,17 @@ describe("parseViewerUrlParams", function () {
|
|
|
752
73
|
}
|
|
753
74
|
}]];
|
|
754
75
|
it("parses unencoded per-channel setting", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
755
|
-
var
|
|
76
|
+
var _i, _channelParamToSettin, _args$viewerChannelSe, _channelParamToSettin2, queryString, expected, _yield$parseViewerUrl, args, channelSetting;
|
|
756
77
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
757
78
|
while (1) switch (_context.prev = _context.next) {
|
|
758
79
|
case 0:
|
|
759
|
-
|
|
80
|
+
_i = 0, _channelParamToSettin = channelParamToSetting;
|
|
760
81
|
case 1:
|
|
761
|
-
if (!(
|
|
82
|
+
if (!(_i < _channelParamToSettin.length)) {
|
|
762
83
|
_context.next = 12;
|
|
763
84
|
break;
|
|
764
85
|
}
|
|
765
|
-
_channelParamToSettin2 = _slicedToArray(_channelParamToSettin[
|
|
86
|
+
_channelParamToSettin2 = _slicedToArray(_channelParamToSettin[_i], 3), queryString = _channelParamToSettin2[0], expected = _channelParamToSettin2[2];
|
|
766
87
|
_context.next = 5;
|
|
767
88
|
return parseViewerUrlParams(queryString);
|
|
768
89
|
case 5:
|
|
@@ -771,7 +92,7 @@ describe("parseViewerUrlParams", function () {
|
|
|
771
92
|
channelSetting = (_args$viewerChannelSe = args.viewerChannelSettings) === null || _args$viewerChannelSe === void 0 ? void 0 : _args$viewerChannelSe.groups[0].channels[0];
|
|
772
93
|
expect(channelSetting).toEqual(expected);
|
|
773
94
|
case 9:
|
|
774
|
-
|
|
95
|
+
_i++;
|
|
775
96
|
_context.next = 1;
|
|
776
97
|
break;
|
|
777
98
|
case 12:
|
|
@@ -781,17 +102,17 @@ describe("parseViewerUrlParams", function () {
|
|
|
781
102
|
}, _callee);
|
|
782
103
|
})));
|
|
783
104
|
it("parses encoded per-channel settings", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
|
|
784
|
-
var
|
|
105
|
+
var _i2, _channelParamToSettin3, _args$viewerChannelSe2, _channelParamToSettin4, queryString, expected, _yield$parseViewerUrl2, args, channelSetting;
|
|
785
106
|
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
786
107
|
while (1) switch (_context2.prev = _context2.next) {
|
|
787
108
|
case 0:
|
|
788
|
-
|
|
109
|
+
_i2 = 0, _channelParamToSettin3 = channelParamToSetting;
|
|
789
110
|
case 1:
|
|
790
|
-
if (!(
|
|
111
|
+
if (!(_i2 < _channelParamToSettin3.length)) {
|
|
791
112
|
_context2.next = 12;
|
|
792
113
|
break;
|
|
793
114
|
}
|
|
794
|
-
_channelParamToSettin4 = _slicedToArray(_channelParamToSettin3[
|
|
115
|
+
_channelParamToSettin4 = _slicedToArray(_channelParamToSettin3[_i2], 3), queryString = _channelParamToSettin4[1], expected = _channelParamToSettin4[2];
|
|
795
116
|
_context2.next = 5;
|
|
796
117
|
return parseViewerUrlParams(queryString);
|
|
797
118
|
case 5:
|
|
@@ -800,7 +121,7 @@ describe("parseViewerUrlParams", function () {
|
|
|
800
121
|
channelSetting = (_args$viewerChannelSe2 = args.viewerChannelSettings) === null || _args$viewerChannelSe2 === void 0 ? void 0 : _args$viewerChannelSe2.groups[0].channels[0];
|
|
801
122
|
expect(channelSetting).toEqual(expected);
|
|
802
123
|
case 9:
|
|
803
|
-
|
|
124
|
+
_i2++;
|
|
804
125
|
_context2.next = 1;
|
|
805
126
|
break;
|
|
806
127
|
case 12:
|
|
@@ -907,7 +228,7 @@ describe("parseViewerUrlParams", function () {
|
|
|
907
228
|
expect(channelSettings).toHaveLength(3);
|
|
908
229
|
for (i = 0; i < channelSettings.length; i++) {
|
|
909
230
|
channelSetting = channelSettings[i]; // Match with default on everything except match number
|
|
910
|
-
expect(channelSetting).toEqual(_objectSpread(_objectSpread({},
|
|
231
|
+
expect(channelSetting).toEqual(_objectSpread(_objectSpread({}, DEFAULT_TEST_VIEWER_CHANNEL_SETTING), {}, {
|
|
911
232
|
match: channelSetting.match
|
|
912
233
|
}));
|
|
913
234
|
}
|