Fix regression in device.unpack
This commit is contained in:
1 parent
8b1f046a3f
commit
3f3fbd81d0
3 files changed
+83
-4
No files matched your search
+5
-3
@@ -140,7 +140,7 @@ export function unpack(
|
||||
if (deviceData.attributes.has(p, revision)) allMatches.push(p);
|
||||
|
||||
for (let i = path.length - 1; i >= 0; --i) {
|
||||
if (path.alias & (i << i)) {
|
||||
if (path.alias & (1 << i)) {
|
||||
for (const [param, val] of path.segments[i] as [Path, string][]) {
|
||||
const p = wildcardPath.slice(0, i + 1).concat(param);
|
||||
const unpacked = unpack(deviceData, p, revision);
|
||||
@@ -156,11 +156,13 @@ export function unpack(
|
||||
) {
|
||||
for (let m = 0; m < allMatches.length; ++m) {
|
||||
let k;
|
||||
const match = allMatches[m];
|
||||
if (!match) continue;
|
||||
for (k = i; k >= 0; --k)
|
||||
if (allMatches[m].segments[k] !== up.segments[k]) break;
|
||||
if (match.segments[k] !== up.segments[k]) break;
|
||||
|
||||
if (k < 0) {
|
||||
filtered.push(allMatches[m]);
|
||||
filtered.push(match);
|
||||
allMatches[m] = null;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -2139,7 +2139,7 @@ function processInstances(
|
||||
defer: boolean
|
||||
): void {
|
||||
parent = sessionContext.deviceData.paths.add(parent);
|
||||
let instancesToCreate, instancesToDelete;
|
||||
let instancesToCreate: InstanceSet, instancesToDelete: Set<Path>;
|
||||
if (parent.segments[0] === "Downloads") {
|
||||
if (parent.length !== 1) return;
|
||||
instancesToDelete = sessionContext.syncState.downloadsToDelete;
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
import ava from "ava";
|
||||
import Path from "../lib/common/path";
|
||||
import * as device from "../lib/device";
|
||||
import PathSet from "../lib/common/path-set";
|
||||
import VersionedMap from "../lib/versioned-map";
|
||||
import { Attributes } from "../lib/types";
|
||||
|
||||
ava("getAliasDeclarations", t => {
|
||||
const path = Path.parse("a.[aa:10,bb.[aaa:100].cc:1].b");
|
||||
@@ -18,3 +21,77 @@ ava("getAliasDeclarations", t => {
|
||||
t.is(d.defer, true);
|
||||
}
|
||||
});
|
||||
|
||||
ava("unpack", t => {
|
||||
const now = Date.now();
|
||||
const deviceData = {
|
||||
paths: new PathSet(),
|
||||
timestamps: new VersionedMap<Path, number>(),
|
||||
attributes: new VersionedMap<Path, Attributes>(),
|
||||
trackers: new Map<Path, { [name: string]: number }>(),
|
||||
changes: new Set<string>()
|
||||
};
|
||||
|
||||
device.set(deviceData, Path.parse("a.1.b"), now, {
|
||||
value: [now, ["b", "xsd:string"]]
|
||||
});
|
||||
device.set(deviceData, Path.parse("a.1.c"), now, {
|
||||
value: [now, ["c", "xsd:string"]]
|
||||
});
|
||||
device.set(deviceData, Path.parse("a.1.a.1.a"), now, {
|
||||
value: [now, ["", "xsd:string"]]
|
||||
});
|
||||
device.set(deviceData, Path.parse("a.1.a.1.b"), now, {
|
||||
value: [now, ["b1", "xsd:string"]]
|
||||
});
|
||||
device.set(deviceData, Path.parse("a.1.a.1.c"), now, {
|
||||
value: [now, ["c1", "xsd:string"]]
|
||||
});
|
||||
device.set(deviceData, Path.parse("a.1.a.2.a"), now, {
|
||||
value: [now, ["", "xsd:string"]]
|
||||
});
|
||||
device.set(deviceData, Path.parse("a.1.a.2.b"), now, {
|
||||
value: [now, ["b2", "xsd:string"]]
|
||||
});
|
||||
device.set(deviceData, Path.parse("a.1.a.2.c"), now, {
|
||||
value: [now, ["c2", "xsd:string"]]
|
||||
});
|
||||
|
||||
device.set(deviceData, Path.parse("a.2.b"), now, {
|
||||
value: [now, ["b", "xsd:string"]]
|
||||
});
|
||||
device.set(deviceData, Path.parse("a.2.c"), now, {
|
||||
value: [now, ["c", "xsd:string"]]
|
||||
});
|
||||
device.set(deviceData, Path.parse("a.2.a.1.a"), now, {
|
||||
value: [now, ["", "xsd:string"]]
|
||||
});
|
||||
device.set(deviceData, Path.parse("a.2.a.1.b"), now, {
|
||||
value: [now, ["b1", "xsd:string"]]
|
||||
});
|
||||
device.set(deviceData, Path.parse("a.2.a.1.c"), now, {
|
||||
value: [now, ["c1", "xsd:string"]]
|
||||
});
|
||||
device.set(deviceData, Path.parse("a.2.a.2.a"), now, {
|
||||
value: [now, ["", "xsd:string"]]
|
||||
});
|
||||
device.set(deviceData, Path.parse("a.2.a.2.b"), now, {
|
||||
value: [now, ["c1", "xsd:string"]]
|
||||
});
|
||||
device.set(deviceData, Path.parse("a.2.a.2.c"), now, {
|
||||
value: [now, ["b1", "xsd:string"]]
|
||||
});
|
||||
|
||||
let unpacked: Path[];
|
||||
unpacked = device.unpack(
|
||||
deviceData,
|
||||
Path.parse("a.[b:b,c:c].a.[b:b1,c:c1].a")
|
||||
);
|
||||
t.is(unpacked.length, 2);
|
||||
t.is(unpacked[0].toString(), "a.1.a.1.a");
|
||||
t.is(unpacked[1].toString(), "a.2.a.1.a");
|
||||
|
||||
unpacked = device.unpack(deviceData, Path.parse("a.*.a.[b:c1,c:b1].a"));
|
||||
t.is(unpacked.length, 1);
|
||||
t.is(unpacked[0].toString(), "a.2.a.2.a");
|
||||
});
|
||||
Reference in new issue
Block a user