Skip to content

Commit f6171e4

Browse files
ddbeckfoolip
andauthored
compute-baseline: add method to expand a support statement into per-release support information (#1312)
Co-authored-by: Philip Jägenstedt <[email protected]>
1 parent 787022f commit f6171e4

File tree

4 files changed

+378
-54
lines changed

4 files changed

+378
-54
lines changed

packages/compute-baseline/src/browser-compat-data/release.test.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,16 @@ describe("Release", function () {
4040
});
4141

4242
describe("compare()", function () {
43+
it("throws when comparing between two browsers", function () {
44+
const cr = browser("chrome");
45+
const ed = browser("edge");
46+
47+
assert.throws(
48+
() => cr.version("100").inRange(ed.version("79"), cr.version("125")),
49+
Error,
50+
);
51+
});
52+
4353
it("returns 0 for equivalent releases", function () {
4454
const chrome100 = browser("chrome").version("100");
4555
assert.equal(chrome100.compare(chrome100), 0);
@@ -87,4 +97,46 @@ describe("Release", function () {
8797
assert.equal(safariPreview.isPrerelease(), true);
8898
});
8999
});
100+
101+
describe("inRange()", function () {
102+
it("throws when comparing between two browsers", function () {
103+
const cr = browser("chrome");
104+
const fx = browser("firefox");
105+
106+
assert.throws(() => cr.version("50").inRange(fx.version("50")), Error);
107+
});
108+
109+
it("handles closed ranges", function () {
110+
const cr = browser("chrome");
111+
112+
// Start of range is inclusive
113+
assert.equal(
114+
cr.version("1").inRange(cr.version("1"), cr.version("125")),
115+
true,
116+
);
117+
118+
// End of range is exclusive
119+
assert.equal(
120+
cr.version("20").inRange(cr.version("1"), cr.version("20")),
121+
false,
122+
);
123+
124+
assert.equal(
125+
cr.version("1").inRange(cr.version("10"), cr.version("15")),
126+
false,
127+
);
128+
assert.equal(
129+
cr.version("100").inRange(cr.version("10"), cr.version("15")),
130+
false,
131+
);
132+
});
133+
134+
it("handles open ranges", function () {
135+
const cr = browser("chrome");
136+
assert.equal(cr.version("1").inRange(cr.version("1")), true);
137+
assert.equal(cr.version("1").inRange(cr.version("10")), false);
138+
assert.equal(cr.version("100").inRange(cr.version("10")), true);
139+
assert.equal(cr.version("preview").inRange(cr.version("10")), true);
140+
});
141+
});
90142
});

packages/compute-baseline/src/browser-compat-data/release.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,19 @@ export class Release {
4444
return this.releaseIndex - otherRelease.releaseIndex;
4545
}
4646

47+
/**
48+
* Check if this release is the same as or after a starting release and,
49+
* optionally, before an ending release.
50+
*/
51+
inRange(start: Release, end?: Release): boolean {
52+
const onOrAfterStart = this.compare(start) >= 0;
53+
if (end) {
54+
const beforeEnd = this.compare(end) < 0;
55+
return onOrAfterStart && beforeEnd;
56+
}
57+
return onOrAfterStart;
58+
}
59+
4760
isPrerelease(): boolean {
4861
if (["beta", "nightly", "planned"].includes(this.data.status)) {
4962
return true;

packages/compute-baseline/src/browser-compat-data/supportStatements.test.ts

Lines changed: 154 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,18 @@ describe("statements", function () {
9696
assert.equal(s.version_removed, "2");
9797
});
9898

99-
it("returns false for undefined", function () {
100-
const s = new SupportStatement({ version_added: "1" });
99+
it("returns false", function () {
100+
const s = new SupportStatement({
101+
version_added: "1",
102+
version_removed: false,
103+
});
101104
assert.equal(s.version_removed, false);
102105
});
106+
107+
it("returns undefined", function () {
108+
const s = new SupportStatement({ version_added: "1" });
109+
assert.equal(s.version_removed, undefined);
110+
});
103111
});
104112
});
105113

@@ -163,6 +171,7 @@ describe("statements", function () {
163171
);
164172
});
165173
});
174+
166175
describe("#supportedBy", function () {
167176
it("returns an array of releases represented by the statement", function () {
168177
const st = new RealSupportStatement(
@@ -186,5 +195,148 @@ describe("statements", function () {
186195
assert.equal(rels.length, browser("chrome").releases.length - 10);
187196
});
188197
});
198+
199+
describe("supportedIn()", function () {
200+
it("throws when browser is undefined", function () {
201+
const cr = browser("chrome");
202+
const statement = new RealSupportStatement({ version_added: "1" });
203+
assert.throws(() => statement.supportedIn(cr.current()), Error);
204+
});
205+
206+
it("throws when release does not correspond to the statement's browser", function () {
207+
const statement = new RealSupportStatement(
208+
{ version_added: "1" },
209+
browser("chrome"),
210+
);
211+
assert.throws(
212+
() => statement.supportedIn(browser("firefox").current()),
213+
Error,
214+
);
215+
});
216+
217+
it("returns supported when release is on after version_added", function () {
218+
const cr = browser("chrome");
219+
const unranged = new RealSupportStatement({ version_added: "100" }, cr);
220+
const ranged = new RealSupportStatement({ version_added: "≤100" }, cr);
221+
222+
assert.equal(unranged.supportedIn(cr.version("100")).supported, true);
223+
assert.equal(unranged.supportedIn(cr.version("101")).supported, true);
224+
assert.equal(unranged.supportedIn(cr.current()).supported, true);
225+
assert.equal(
226+
unranged.supportedIn(cr.releases.at(-1) as any).supported,
227+
true,
228+
);
229+
230+
assert.equal(ranged.supportedIn(cr.version("99")).supported, null);
231+
assert.equal(ranged.supportedIn(cr.version("100")).supported, true);
232+
assert.equal(ranged.supportedIn(cr.version("101")).supported, true);
233+
assert.equal(ranged.supportedIn(cr.current()).supported, true);
234+
assert.equal(
235+
ranged.supportedIn(cr.releases.at(-1) as any).supported,
236+
true,
237+
);
238+
});
239+
240+
it("returns supported when release is on after version_added and before version_removed", function () {
241+
const cr = browser("chrome");
242+
const unranged = new RealSupportStatement(
243+
{ version_added: "100", version_removed: "125" },
244+
cr,
245+
);
246+
const ranged = new RealSupportStatement(
247+
{ version_added: "≤100", version_removed: "125" },
248+
cr,
249+
);
250+
251+
assert.equal(unranged.supportedIn(cr.version("99")).supported, false);
252+
assert.equal(unranged.supportedIn(cr.version("100")).supported, true);
253+
assert.equal(unranged.supportedIn(cr.version("101")).supported, true);
254+
assert.equal(unranged.supportedIn(cr.version("124")).supported, true);
255+
assert.equal(unranged.supportedIn(cr.version("125")).supported, false);
256+
257+
assert.equal(ranged.supportedIn(cr.version("99")).supported, null);
258+
assert.equal(ranged.supportedIn(cr.version("100")).supported, true);
259+
assert.equal(ranged.supportedIn(cr.version("101")).supported, true);
260+
assert.equal(ranged.supportedIn(cr.version("124")).supported, true);
261+
assert.equal(unranged.supportedIn(cr.version("125")).supported, false);
262+
});
263+
264+
it("returns unknown support when release is before ranged version_added", function () {
265+
const cr = browser("chrome");
266+
const rangedOpen = new RealSupportStatement(
267+
{ version_added: "≤100" },
268+
cr,
269+
);
270+
const rangedClosed = new RealSupportStatement(
271+
{ version_added: "≤100", version_removed: "125" },
272+
cr,
273+
);
274+
275+
assert.equal(rangedOpen.supportedIn(cr.version("99")).supported, null);
276+
assert.equal(
277+
rangedClosed.supportedIn(cr.version("99")).supported,
278+
null,
279+
);
280+
});
281+
282+
it("returns unknown support when release is after version_added and before ranged version_removed", function () {
283+
const cr = browser("chrome");
284+
const rangedEnd = new RealSupportStatement(
285+
{ version_added: "100", version_removed: "≤125" },
286+
cr,
287+
);
288+
289+
assert.equal(rangedEnd.supportedIn(cr.version("100")).supported, true);
290+
assert.equal(rangedEnd.supportedIn(cr.version("101")).supported, null);
291+
assert.equal(rangedEnd.supportedIn(cr.version("124")).supported, null);
292+
assert.equal(rangedEnd.supportedIn(cr.version("125")).supported, false);
293+
});
294+
295+
it("returns unsupported when statement is version_added false", function () {
296+
const cr = browser("chrome");
297+
const statement = new RealSupportStatement(
298+
{ version_added: false },
299+
cr,
300+
);
301+
302+
for (const release of cr.releases) {
303+
assert.equal(statement.supportedIn(release).supported, false);
304+
}
305+
});
306+
307+
it("returns unsupported when release is before fixed version_added", function () {
308+
const cr = browser("chrome");
309+
const unranged = new RealSupportStatement({ version_added: "100" }, cr);
310+
assert.equal(unranged.supportedIn(cr.version("99")).supported, false);
311+
});
312+
313+
it("returns unsupported when release is on or after version_removed", function () {
314+
const cr = browser("chrome");
315+
316+
const unranged = new RealSupportStatement(
317+
{ version_added: "1", version_removed: "10" },
318+
cr,
319+
);
320+
assert.equal(unranged.supportedIn(cr.version("10")).supported, false);
321+
assert.equal(unranged.supportedIn(cr.version("11")).supported, false);
322+
assert.equal(unranged.supportedIn(cr.current()).supported, false);
323+
assert.equal(
324+
unranged.supportedIn(cr.releases.at(-1) as any).supported,
325+
false,
326+
);
327+
328+
const ranged = new RealSupportStatement(
329+
{ version_added: "≤5", version_removed: "10" },
330+
cr,
331+
);
332+
assert.equal(ranged.supportedIn(cr.version("10")).supported, false);
333+
assert.equal(ranged.supportedIn(cr.version("11")).supported, false);
334+
assert.equal(ranged.supportedIn(cr.current()).supported, false);
335+
assert.equal(
336+
ranged.supportedIn(cr.releases.at(-1) as any).supported,
337+
false,
338+
);
339+
});
340+
});
189341
});
190342
});

0 commit comments

Comments
 (0)