@teselagen/range-utils 0.3.6 → 0.3.8
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/README.md +94 -0
- package/flipContainedRange.d.ts +1 -1
- package/index.js +233 -85
- package/index.mjs +233 -85
- package/index.umd.js +233 -85
- package/package.json +1 -2
- package/src/adjustRangeToDeletionOfAnotherRange.test.js +166 -105
- package/src/adjustRangeToInsert.js +29 -26
- package/src/adjustRangeToInsert.test.js +197 -109
- package/src/adjustRangeToRotation.js +4 -5
- package/src/adjustRangeToRotation.test.js +203 -119
- package/src/checkIfNonCircularRangesOverlap.js +18 -15
- package/src/checkIfNonCircularRangesOverlap.test.js +67 -42
- package/src/checkIfPotentiallyCircularRangesOverlap.js +22 -12
- package/src/checkIfPotentiallyCircularRangesOverlap.test.js +115 -70
- package/src/collapseOverlapsGeneratedFromRangeComparisonIfPossible.js +72 -41
- package/src/collapseOverlapsGeneratedFromRangeComparisonIfPossible.test.js +183 -84
- package/src/convertRangeIndices.js +24 -20
- package/src/convertRangeIndices.test.js +40 -21
- package/src/convertRangeTo0Based.js +7 -4
- package/src/convertRangeTo1Based.js +8 -4
- package/src/doesRangeSpanEntireSequence.js +4 -4
- package/src/doesRangeSpanOrigin.js +3 -3
- package/src/expandOrContractCircularRangeToPosition.js +45 -38
- package/src/expandOrContractNonCircularRangeToPosition.js +24 -21
- package/src/expandOrContractRangeByLength.js +16 -11
- package/src/expandOrContractRangeByLength.test.js +109 -71
- package/src/expandOrContractRangeToPosition.js +17 -9
- package/src/flipContainedRange.js +133 -72
- package/src/flipContainedRange.test.js +143 -117
- package/src/generateRandomRange.js +17 -15
- package/src/generateRandomRange.test.js +21 -21
- package/src/getAnnotationRangeType.js +25 -21
- package/src/getAnnotationRangeType.test.js +56 -57
- package/src/getEachPositionInRangeAsArray.js +13 -13
- package/src/getEachPositionInRangeAsArray.test.js +12 -8
- package/src/getLengthOfOverlappingRegionsBetweenTwoRanges.js +16 -8
- package/src/getLengthOfOverlappingRegionsBetweenTwoRanges.test.js +32 -24
- package/src/getMiddleOfRange.js +1 -1
- package/src/getMiddleOfRange.test.js +5 -13
- package/src/getOverlapOfNonCircularRanges.js +30 -30
- package/src/getOverlapsOfPotentiallyCircularRanges.js +5 -5
- package/src/getOverlapsOfPotentiallyCircularRanges.test.js +3 -23
- package/src/getPositionFromAngle.js +12 -7
- package/src/getRangeAngles.js +1 -1
- package/src/getRangeAngles.test.js +10 -11
- package/src/getRangeLength.test.js +5 -5
- package/src/getRangesBetweenTwoRanges.js +31 -22
- package/src/getSequenceWithinRange.js +13 -13
- package/src/getSequenceWithinRange.test.js +43 -45
- package/src/getShortestDistanceBetweenTwoPositions.js +10 -6
- package/src/getShortestDistanceBetweenTwoPositions.test.js +11 -13
- package/src/getYOffsetForPotentiallyCircularRange.js +33 -21
- package/src/getYOffsetsForPotentiallyCircularRanges.js +26 -19
- package/src/getYOffsetsForPotentiallyCircularRanges.test.js +42 -29
- package/src/getZeroedRangeOverlaps.js +30 -15
- package/src/getZeroedRangeOverlaps.test.js +75 -36
- package/src/index.js +51 -51
- package/src/index.test.js +6 -8
- package/src/invertRange.test.js +103 -93
- package/src/isPositionCloserToRangeStartThanRangeEnd.js +18 -6
- package/src/isPositionCloserToRangeStartThanRangeEnd.test.js +36 -16
- package/src/isPositionWithinRange.js +4 -4
- package/src/isRangeOrPositionWithinRange.js +18 -12
- package/src/isRangeOrPositionWithinRange.test.js +6 -6
- package/src/isRangeWithinRange.js +2 -3
- package/src/loopEachPositionInRange.js +3 -3
- package/src/modulatePositionByRange.js +8 -8
- package/src/modulatePositionByRange.test.js +10 -11
- package/src/modulateRangeBySequenceLength.js +7 -7
- package/src/modulateRangeBySequenceLength.test.js +39 -16
- package/src/normalizePositionByRangeLength.js +22 -18
- package/src/normalizePositionByRangeLength.test.js +23 -23
- package/src/normalizePositionByRangeLength1Based.js +7 -4
- package/src/normalizePositionByRangeLength1Based.test.js +9 -9
- package/src/normalizeRange.js +7 -7
- package/src/normalizeRange.test.js +9 -9
- package/src/provideInclusiveOptions.js +36 -23
- package/src/reversePositionInRange.js +16 -12
- package/src/splitRangeIntoTwoPartsIfItIsCircular.js +31 -28
- package/src/splitRangeIntoTwoPartsIfItIsCircular.test.js +22 -11
- package/src/translateRange.js +18 -8
- package/src/translateRange.test.js +18 -19
- package/src/trimNonCicularRangeByAnotherNonCircularRange.js +45 -42
- package/src/trimNumberToFitWithin0ToAnotherNumber.js +13 -10
- package/src/trimRangeByAnotherRange.js +20 -19
- package/src/trimRangeByAnotherRange.test.js +6 -6
- package/src/zeroSubrangeByContainerRange.js +29 -19
- package/src/zeroSubrangeByContainerRange.test.js +57 -47
@@ -1,85 +1,146 @@
|
|
1
|
-
import expandOrContractRangeByLength from
|
2
|
-
import isRangeWithinRange from
|
3
|
-
import getOverlapsOfPotentiallyCircularRanges from
|
4
|
-
import translateRange from
|
5
|
-
import getRangeLength from
|
1
|
+
import expandOrContractRangeByLength from "./expandOrContractRangeByLength";
|
2
|
+
import isRangeWithinRange from "./isRangeWithinRange";
|
3
|
+
import getOverlapsOfPotentiallyCircularRanges from "./getOverlapsOfPotentiallyCircularRanges";
|
4
|
+
import translateRange from "./translateRange";
|
5
|
+
import getRangeLength from "./getRangeLength";
|
6
6
|
|
7
|
-
export default function flipRelativeRange(
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
7
|
+
export default function flipRelativeRange(
|
8
|
+
innerRange,
|
9
|
+
outerRange,
|
10
|
+
sequenceLength
|
11
|
+
) {
|
12
|
+
const isFullyContained = isRangeWithinRange(
|
13
|
+
innerRange,
|
14
|
+
outerRange,
|
15
|
+
sequenceLength
|
16
|
+
);
|
17
|
+
if (isFullyContained) {
|
18
|
+
return flipFullyContainedRange(innerRange, outerRange, sequenceLength);
|
19
|
+
} else {
|
20
|
+
// flip not fully contained range
|
21
|
+
return flipNonFullyContainedRange(innerRange, outerRange, sequenceLength);
|
22
|
+
}
|
23
|
+
}
|
17
24
|
|
18
|
-
function flipNonFullyContainedRange(innerRange, outerRange, sequenceLength
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
function flipNonFullyContainedRange(innerRange, outerRange, sequenceLength) {
|
26
|
+
const outerFullyContained = isRangeWithinRange(
|
27
|
+
outerRange,
|
28
|
+
innerRange,
|
29
|
+
sequenceLength
|
30
|
+
);
|
31
|
+
let flippedInnerRange;
|
32
|
+
if (outerFullyContained) {
|
33
|
+
//special logic
|
34
|
+
// flipFullyContainedRange(outerRange, outerRange, sequenceLength)
|
35
|
+
const expandBy1 =
|
36
|
+
getRangeLength(
|
37
|
+
{
|
38
|
+
start: innerRange.start,
|
39
|
+
end: outerRange.start
|
40
|
+
},
|
41
|
+
sequenceLength
|
42
|
+
) - 1;
|
43
|
+
flippedInnerRange = expandOrContractRangeByLength(
|
44
|
+
outerRange,
|
45
|
+
expandBy1,
|
46
|
+
false,
|
47
|
+
sequenceLength
|
48
|
+
);
|
29
49
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
const expandBy2 =
|
51
|
+
getRangeLength(
|
52
|
+
{
|
53
|
+
end: innerRange.end,
|
54
|
+
start: outerRange.end
|
55
|
+
},
|
56
|
+
sequenceLength
|
57
|
+
) - 1;
|
58
|
+
flippedInnerRange = expandOrContractRangeByLength(
|
59
|
+
flippedInnerRange,
|
60
|
+
expandBy2,
|
61
|
+
true,
|
62
|
+
sequenceLength
|
63
|
+
);
|
64
|
+
} else {
|
65
|
+
//find overlaps of ranges
|
66
|
+
const overlaps = getOverlapsOfPotentiallyCircularRanges(
|
67
|
+
innerRange,
|
68
|
+
outerRange,
|
69
|
+
sequenceLength
|
70
|
+
);
|
71
|
+
//take first overlap and determine which end of outer range it overlaps
|
72
|
+
if (overlaps.length >= 1) {
|
73
|
+
const firstOverlap = overlaps[0];
|
74
|
+
const overlapExtendsForward = firstOverlap.start !== outerRange.start;
|
75
|
+
//flip using fully contained logic
|
76
|
+
const flippedTruncatedInner = flipFullyContainedRange(
|
77
|
+
firstOverlap,
|
78
|
+
outerRange,
|
79
|
+
sequenceLength
|
80
|
+
);
|
81
|
+
//extend in the opposite direction
|
82
|
+
const lengthToExtend =
|
83
|
+
getRangeLength(innerRange, sequenceLength) -
|
84
|
+
getRangeLength(flippedTruncatedInner, sequenceLength);
|
85
|
+
flippedInnerRange = expandOrContractRangeByLength(
|
86
|
+
flippedTruncatedInner,
|
87
|
+
lengthToExtend,
|
88
|
+
overlapExtendsForward,
|
89
|
+
sequenceLength
|
90
|
+
);
|
91
|
+
} else {
|
92
|
+
throw new Error(
|
93
|
+
"This case (relative ranges that do not overlap) is unsupported! "
|
94
|
+
);
|
95
|
+
}
|
96
|
+
}
|
97
|
+
return flippedInnerRange;
|
53
98
|
}
|
54
99
|
|
55
|
-
function flipFullyContainedRange(innerRange, outerRange, sequenceLength
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
100
|
+
function flipFullyContainedRange(innerRange, outerRange, sequenceLength) {
|
101
|
+
//translate both ranges by offset such that outer range start = 0
|
102
|
+
const translateBy = -outerRange.start;
|
103
|
+
const translatedOuterRange = translateRange(
|
104
|
+
outerRange,
|
105
|
+
translateBy,
|
106
|
+
sequenceLength
|
107
|
+
);
|
108
|
+
const translatedInnerRange = translateRange(
|
109
|
+
innerRange,
|
110
|
+
translateBy,
|
111
|
+
sequenceLength
|
112
|
+
);
|
60
113
|
|
61
|
-
|
62
|
-
|
114
|
+
//flip like non origin spanning range
|
115
|
+
const translatedFlippedInnerRange = flipNonOriginSpanningContainedRange(
|
116
|
+
translatedInnerRange,
|
117
|
+
translatedOuterRange,
|
118
|
+
sequenceLength
|
119
|
+
);
|
63
120
|
|
64
|
-
|
65
|
-
|
66
|
-
|
121
|
+
//translate inner range back by negative offset
|
122
|
+
const flippedInnerRange = translateRange(
|
123
|
+
translatedFlippedInnerRange,
|
124
|
+
-translateBy,
|
125
|
+
sequenceLength
|
126
|
+
);
|
127
|
+
return flippedInnerRange;
|
67
128
|
}
|
68
129
|
|
69
|
-
function flipNonOriginSpanningContainedRange(
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
130
|
+
function flipNonOriginSpanningContainedRange(
|
131
|
+
innerRange,
|
132
|
+
outerRange,
|
133
|
+
sequenceLength
|
134
|
+
) {
|
135
|
+
//non origin spanning, fully contained inner
|
136
|
+
const offsetFromStart = innerRange.start - outerRange.start;
|
137
|
+
const newInnerEnd = outerRange.end - offsetFromStart;
|
138
|
+
const innerRangeLength = getRangeLength(innerRange, sequenceLength);
|
74
139
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
140
|
+
return {
|
141
|
+
end: newInnerEnd,
|
142
|
+
start: newInnerEnd - (innerRangeLength - 1)
|
143
|
+
};
|
79
144
|
}
|
80
145
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
146
|
//take 2
|
85
|
-
|
@@ -1,124 +1,150 @@
|
|
1
1
|
/* eslint-disable no-var*/
|
2
|
-
import flipContainedRange from
|
2
|
+
import flipContainedRange from "./flipContainedRange";
|
3
3
|
|
4
|
-
import chai from
|
4
|
+
import chai from "chai";
|
5
5
|
chai.should();
|
6
6
|
|
7
|
-
describe(
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
7
|
+
describe("flipContainedRange", function () {
|
8
|
+
it("non origin spanning, fully contained inner", function () {
|
9
|
+
const innerRange = {
|
10
|
+
start: 5,
|
11
|
+
end: 13
|
12
|
+
};
|
13
|
+
const outerRange = {
|
14
|
+
start: 0,
|
15
|
+
end: 20
|
16
|
+
};
|
17
|
+
const sequenceLength = 40;
|
18
|
+
const flippedInnerRange = flipContainedRange(
|
19
|
+
innerRange,
|
20
|
+
outerRange,
|
21
|
+
sequenceLength
|
22
|
+
);
|
23
|
+
flippedInnerRange.should.deep.equal({
|
24
|
+
start: 7,
|
25
|
+
end: 15
|
26
|
+
});
|
27
|
+
});
|
28
|
+
it("non origin spanning outer, origin spanning fully contained inner", function () {
|
29
|
+
const innerRange = {
|
30
|
+
start: 3,
|
31
|
+
end: 1
|
32
|
+
};
|
33
|
+
const outerRange = {
|
34
|
+
start: 0,
|
35
|
+
end: 3
|
36
|
+
};
|
37
|
+
const sequenceLength = 4;
|
38
|
+
const flippedInnerRange = flipContainedRange(
|
39
|
+
innerRange,
|
40
|
+
outerRange,
|
41
|
+
sequenceLength
|
42
|
+
);
|
43
|
+
flippedInnerRange.should.deep.equal({
|
44
|
+
start: 2,
|
45
|
+
end: 0
|
46
|
+
});
|
47
|
+
});
|
48
|
+
it("origin spanning outer, non-origin spanning, fully contained inner", function () {
|
49
|
+
const innerRange = {
|
50
|
+
start: 1,
|
51
|
+
end: 3
|
52
|
+
};
|
53
|
+
const outerRange = {
|
54
|
+
start: 8,
|
55
|
+
end: 5
|
56
|
+
};
|
57
|
+
const sequenceLength = 10;
|
58
|
+
const flippedInnerRange = flipContainedRange(
|
59
|
+
innerRange,
|
60
|
+
outerRange,
|
61
|
+
sequenceLength
|
62
|
+
);
|
63
|
+
flippedInnerRange.should.deep.equal({
|
64
|
+
start: 0,
|
65
|
+
end: 2
|
66
|
+
});
|
67
|
+
});
|
68
|
+
it("non-origin spanning outer, non-origin spanning, non-fully contained inner", function () {
|
69
|
+
const innerRange = {
|
70
|
+
start: 1,
|
71
|
+
end: 4
|
72
|
+
};
|
73
|
+
const outerRange = {
|
74
|
+
start: 3,
|
75
|
+
end: 6
|
76
|
+
};
|
77
|
+
const sequenceLength = 10;
|
78
|
+
const flippedInnerRange = flipContainedRange(
|
79
|
+
innerRange,
|
80
|
+
outerRange,
|
81
|
+
sequenceLength
|
82
|
+
);
|
83
|
+
flippedInnerRange.should.deep.equal({
|
84
|
+
start: 5,
|
85
|
+
end: 8
|
86
|
+
});
|
87
|
+
});
|
88
|
+
it("non-origin spanning outer, non-origin spanning, non-fully contained inner", function () {
|
89
|
+
const innerRange = {
|
90
|
+
start: 4,
|
91
|
+
end: 2
|
92
|
+
};
|
93
|
+
const outerRange = {
|
94
|
+
start: 2,
|
95
|
+
end: 5
|
96
|
+
};
|
97
|
+
const sequenceLength = 10;
|
98
|
+
const flippedInnerRange = flipContainedRange(
|
99
|
+
innerRange,
|
100
|
+
outerRange,
|
101
|
+
sequenceLength
|
102
|
+
);
|
103
|
+
flippedInnerRange.should.deep.equal({
|
104
|
+
start: 5,
|
105
|
+
end: 3
|
106
|
+
});
|
107
|
+
});
|
88
108
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
end: 2
|
110
|
-
};
|
111
|
-
const outerRange = {
|
112
|
-
start: 5,
|
113
|
-
end:2
|
114
|
-
};
|
115
|
-
const sequenceLength = 10;
|
116
|
-
const flippedInnerRange = flipContainedRange(innerRange, outerRange, sequenceLength);
|
117
|
-
flippedInnerRange.should.deep.equal({
|
118
|
-
start: 5,
|
119
|
-
end:3
|
120
|
-
})
|
121
|
-
});
|
109
|
+
it("inner fully spans outer, does not wrap origin", function () {
|
110
|
+
const innerRange = {
|
111
|
+
start: 1,
|
112
|
+
end: 7
|
113
|
+
};
|
114
|
+
const outerRange = {
|
115
|
+
start: 2,
|
116
|
+
end: 5
|
117
|
+
};
|
118
|
+
const sequenceLength = 10;
|
119
|
+
const flippedInnerRange = flipContainedRange(
|
120
|
+
innerRange,
|
121
|
+
outerRange,
|
122
|
+
sequenceLength
|
123
|
+
);
|
124
|
+
flippedInnerRange.should.deep.equal({
|
125
|
+
start: 0,
|
126
|
+
end: 6
|
127
|
+
});
|
128
|
+
});
|
122
129
|
|
130
|
+
it("inner fully spans outer, does wrap origin", function () {
|
131
|
+
const innerRange = {
|
132
|
+
start: 4,
|
133
|
+
end: 2
|
134
|
+
};
|
135
|
+
const outerRange = {
|
136
|
+
start: 5,
|
137
|
+
end: 2
|
138
|
+
};
|
139
|
+
const sequenceLength = 10;
|
140
|
+
const flippedInnerRange = flipContainedRange(
|
141
|
+
innerRange,
|
142
|
+
outerRange,
|
143
|
+
sequenceLength
|
144
|
+
);
|
145
|
+
flippedInnerRange.should.deep.equal({
|
146
|
+
start: 5,
|
147
|
+
end: 3
|
148
|
+
});
|
149
|
+
});
|
123
150
|
});
|
124
|
-
|
@@ -1,20 +1,22 @@
|
|
1
|
-
import normalizePositionByRangeLength from
|
1
|
+
import normalizePositionByRangeLength from "./normalizePositionByRangeLength";
|
2
2
|
|
3
3
|
export default function generateRandomRange(minStart, maxEnd, maxLength) {
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
4
|
+
const start = getRandomInt(minStart, maxEnd);
|
5
|
+
let end;
|
6
|
+
if (maxLength) {
|
7
|
+
end = normalizePositionByRangeLength(
|
8
|
+
getRandomInt(start, start + maxLength),
|
9
|
+
maxEnd
|
10
|
+
);
|
11
|
+
} else {
|
12
|
+
end = getRandomInt(minStart, maxEnd);
|
13
|
+
}
|
14
|
+
return {
|
15
|
+
start: start,
|
16
|
+
end: end
|
17
|
+
};
|
18
|
+
}
|
17
19
|
|
18
20
|
function getRandomInt(min, max) {
|
19
|
-
|
21
|
+
return Math.floor(Math.random() * (max - min)) + min;
|
20
22
|
}
|
@@ -1,24 +1,24 @@
|
|
1
|
-
import getRangeLength from
|
2
|
-
import generateRandomRange from
|
3
|
-
import chai from
|
1
|
+
import getRangeLength from "./getRangeLength";
|
2
|
+
import generateRandomRange from "./generateRandomRange";
|
3
|
+
import chai from "chai";
|
4
4
|
chai.should();
|
5
5
|
|
6
|
-
describe(
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
describe("generateRandomRange", function () {
|
7
|
+
it("should generate random ranges between a start and end", function () {
|
8
|
+
for (let i = 0; i < 1000; i++) {
|
9
|
+
const range = generateRandomRange(0, 10);
|
10
|
+
range.start.should.be.below(11);
|
11
|
+
range.end.should.be.below(11);
|
12
|
+
}
|
13
|
+
});
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
});
|
15
|
+
it("should generate random ranges between a start and end and with length less than maxLength", function () {
|
16
|
+
for (let i = 0; i < 1000; i++) {
|
17
|
+
const range = generateRandomRange(0, 10, 5);
|
18
|
+
const length = getRangeLength(range);
|
19
|
+
if (length > -1) {
|
20
|
+
length.should.be.below(6);
|
21
|
+
}
|
22
|
+
}
|
23
|
+
});
|
24
|
+
});
|
@@ -1,24 +1,28 @@
|
|
1
1
|
//function that returns the annotation range type
|
2
|
-
export default function getAnnotationRangeType(
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
return 'end';
|
11
|
-
}
|
12
|
-
}
|
2
|
+
export default function getAnnotationRangeType(
|
3
|
+
annotationRange,
|
4
|
+
enclosingRangeType,
|
5
|
+
forward
|
6
|
+
) {
|
7
|
+
if (annotationRange.start === enclosingRangeType.start) {
|
8
|
+
if (annotationRange.end === enclosingRangeType.end) {
|
9
|
+
return "beginningAndEnd";
|
13
10
|
} else {
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
}
|
20
|
-
} else {
|
21
|
-
return 'middle';
|
22
|
-
}
|
11
|
+
if (forward) {
|
12
|
+
return "start";
|
13
|
+
} else {
|
14
|
+
return "end";
|
15
|
+
}
|
23
16
|
}
|
24
|
-
}
|
17
|
+
} else {
|
18
|
+
if (annotationRange.end === enclosingRangeType.end) {
|
19
|
+
if (forward) {
|
20
|
+
return "end";
|
21
|
+
} else {
|
22
|
+
return "start";
|
23
|
+
}
|
24
|
+
} else {
|
25
|
+
return "middle";
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|