Skip to content

Commit 9d6e522

Browse files
authored
add a bunch of tests (#10)
* add a bunch of tests * tweaks
1 parent 68b7b0c commit 9d6e522

File tree

8 files changed

+79
-48
lines changed

8 files changed

+79
-48
lines changed

src/decuplicate.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ import type { Coverage, Range } from './parse-coverage.ts'
66
* - if a duplicate stylesheet enters the room, we add it's ranges to the existing stylesheet's ranges
77
* - only bytes of deduplicated stylesheets are counted
88
*/
9-
export function deduplicate_entries(entries: Coverage[]): Map<NonNullable<Coverage['text']>, Pick<Coverage, 'ranges' | 'url'>> {
9+
export function deduplicate_entries(entries: Coverage[]): Map<Coverage['text'], Pick<Coverage, 'ranges' | 'url'>> {
1010
let checked_stylesheets = new Map<string, { url: string; ranges: Range[] }>()
1111

1212
for (let entry of entries) {
13-
let text = entry.text || ''
13+
let text = entry.text
1414
if (checked_stylesheets.has(text)) {
1515
let sheet = checked_stylesheets.get(text)!
1616
let ranges = sheet.ranges

src/filter-entries.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ export function filter_coverage(coverage: Coverage[], parse_html?: Parser): Cove
1111
let result = []
1212

1313
for (let entry of coverage) {
14-
if (!entry.text) continue
1514
let extension = ext(entry.url).toLowerCase()
1615
if (extension === 'js') continue
1716

src/index.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ test.describe('from <style> tag', () => {
2929
</body>
3030
</html>
3131
`
32-
coverage = await generate_coverage(html)
32+
coverage = (await generate_coverage(html)) as Coverage[]
3333
})
3434

3535
test('counts totals', () => {
@@ -86,7 +86,7 @@ test.describe('from <link rel="stylesheet">', () => {
8686
</body>
8787
</html>
8888
`
89-
coverage = await generate_coverage(html, { link_css: css })
89+
coverage = (await generate_coverage(html, { link_css: css })) as Coverage[]
9090
})
9191

9292
test('counts totals', () => {

src/kitchen-sink.test.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { test, expect } from '@playwright/test'
2+
import { calculate_coverage } from '.'
3+
import { DOMParser } from 'linkedom'
4+
5+
function parse_html(html: string) {
6+
return new DOMParser().parseFromString(html, 'text/html')
7+
}
8+
9+
test('proejctw wallace Container', () => {
10+
const coverage = [
11+
{
12+
url: 'http://localhost:4173/_app/immutable/assets/Container.n-2BXq6O.css',
13+
text: '.container.svelte-1ginl5v{margin-inline:auto;padding-inline:var(--space-2)}@media (min-width: 44rem){.container.svelte-1ginl5v{padding-inline:var(--space-4)}}@media (min-width: 66rem){.container.svelte-1ginl5v{padding-inline:var(--space-8)}}.size-auto.svelte-1ginl5v{max-width:120rem}.size-sm.svelte-1ginl5v{max-width:28rem}.size-md.svelte-1ginl5v{max-width:32rem}.size-lg.svelte-1ginl5v{max-width:36rem}.size-xl.svelte-1ginl5v{max-width:48rem}.size-2xl.svelte-1ginl5v{max-width:64rem}.size-3xl.svelte-1ginl5v{max-width:80rem}\n',
14+
ranges: [
15+
{ start: 0, end: 75 },
16+
{ start: 82, end: 157 },
17+
{ start: 165, end: 240 },
18+
{ start: 241, end: 284 },
19+
{ start: 485, end: 526 },
20+
],
21+
},
22+
]
23+
let result = calculate_coverage(coverage, parse_html)
24+
let sheet = result.coverage_per_stylesheet.at(0)!
25+
26+
expect.soft(sheet.total_lines).toBe(44)
27+
expect.soft(sheet.chunks).toHaveLength(3)
28+
29+
let [chunk1, chunk2, chunk3] = sheet.chunks
30+
31+
expect.soft(chunk1?.start_line).toEqual(1)
32+
expect.soft(chunk1?.end_line).toEqual(21)
33+
expect.soft(chunk1?.total_lines).toEqual(21)
34+
35+
expect.soft(chunk2?.start_line).toEqual(22)
36+
expect.soft(chunk2?.end_line).toEqual(40)
37+
expect.soft(chunk2?.total_lines).toEqual(19)
38+
39+
expect.soft(chunk3?.start_line).toEqual(41)
40+
expect.soft(chunk3?.end_line).toEqual(44)
41+
expect.soft(chunk3?.total_lines).toEqual(4)
42+
})

src/parse-coverage.test.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ test('parses valid JSON', () => {
2323
])
2424
})
2525

26-
test('allows entries without text', () => {
26+
test('does not allow entries without text', () => {
2727
let input = `
2828
[
2929
{
@@ -35,12 +35,7 @@ test('allows entries without text', () => {
3535
]
3636
`
3737
let result = parse_coverage(input)
38-
expect(result).toEqual([
39-
{
40-
url: 'example.com',
41-
ranges: [{ start: 0, end: 13 }],
42-
},
43-
])
38+
expect(result).toEqual([])
4439
})
4540

4641
test('returns empty array for invalid JSON', () => {

src/parse-coverage.ts

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,22 @@
11
import * as v from 'valibot'
22

3-
export type Range = {
4-
start: number
5-
end: number
6-
}
3+
let RangeSchema = v.object({
4+
start: v.number(),
5+
end: v.number(),
6+
})
77

8-
export type Coverage = {
9-
url: string
10-
text?: string
11-
ranges: Range[]
12-
}
8+
export type Range = v.InferInput<typeof RangeSchema>
9+
10+
let CoverageSchema = v.object({
11+
text: v.string(),
12+
url: v.string(),
13+
ranges: v.array(RangeSchema),
14+
})
1315

14-
let CoverageSchema = v.array(
15-
v.object({
16-
text: v.optional(v.string()),
17-
url: v.string(),
18-
ranges: v.array(
19-
v.object({
20-
start: v.number(),
21-
end: v.number(),
22-
}),
23-
),
24-
}),
25-
)
16+
export type Coverage = v.InferInput<typeof CoverageSchema>
2617

2718
export function is_valid_coverage(input: unknown): boolean {
28-
let result = v.safeParse(CoverageSchema, input)
19+
let result = v.safeParse(v.array(CoverageSchema), input)
2920
return result.success
3021
}
3122

src/prettify.test.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,21 @@ test('atrule prettification', () => {
5454
]
5555
expect(prettify(entries)).toEqual(prettified)
5656
})
57+
58+
test('prettify url()', () => {
59+
let entries = [
60+
{
61+
url: 'example.com',
62+
text: `a{ background-image: "example.com/test.gif"; background-image: url('example.com/test.jpg'); background-image: url("example.com/test.png"); }`,
63+
ranges: [{ start: 0, end: 140 }],
64+
},
65+
]
66+
let prettified = [
67+
{
68+
url: 'example.com',
69+
text: `a {\n\tbackground-image: "example.com/test.gif";\n\tbackground-image: url("example.com/test.jpg");\n\tbackground-image: url("example.com/test.png");\n}`,
70+
ranges: [{ start: 0, end: 151 - 7 }],
71+
},
72+
]
73+
expect(prettify(entries)).toEqual(prettified)
74+
})

src/prettify.ts

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ import { tokenize, tokenTypes } from 'css-tree/tokenizer'
55

66
export function prettify(coverage: Coverage[]): Coverage[] {
77
return coverage.map(({ url, text, ranges }) => {
8-
if (!text) {
9-
return { url, text, ranges }
10-
}
118
let formatted = format(text)
129
let irrelevant_tokens: Set<number> = new Set([
1310
tokenTypes.EOF,
@@ -40,11 +37,6 @@ export function prettify(coverage: Coverage[]): Coverage[] {
4037
if (irrelevant_tokens.has(type)) return
4138
index++
4239

43-
// format-css changes the Url token to a Function,String,RightParenthesis token sequence
44-
if (type === tokenTypes.Url) {
45-
index += 2
46-
}
47-
4840
let range_index = is_in_range(start, end)
4941
if (range_index !== -1) {
5042
ext_ranges[range_index]!.tokens.push(index)
@@ -57,12 +49,6 @@ export function prettify(coverage: Coverage[]): Coverage[] {
5749
tokenize(formatted, (type, start, end) => {
5850
if (irrelevant_tokens.has(type)) return
5951
index++
60-
61-
// format-css changes the Url token to a Function,String,RightParenthesis token sequence
62-
if (type === tokenTypes.Url) {
63-
index += 2
64-
}
65-
6652
new_tokens.set(index, { start, end })
6753
})
6854

0 commit comments

Comments
 (0)