7
7
* data because that view is a strict subset of the curated view.
8
8
*/
9
9
10
- import { describe , it , before } from 'node:test' ;
10
+ import { describe , it } from 'node:test' ;
11
11
import { strict as assert } from 'node:assert' ;
12
12
import path from 'node:path' ;
13
13
import { fileURLToPath } from 'node:url' ;
@@ -28,158 +28,158 @@ const cssValues = [
28
28
{ type : 'value space' , prop : 'values' , value : 'value' }
29
29
] ;
30
30
31
- describe ( `The curated view of CSS extracts` , ( ) => {
32
- before ( async ( ) => {
33
- const all = await css . listAll ( { folder : curatedFolder } ) ;
34
- const baseProperties = { } ;
35
- const basePropertiesInDeltaSpecs = { } ;
36
- const extendedProperties = { } ;
37
- const selectors = { } ;
38
- const valuespaces = { } ;
31
+ describe ( `The curated view of CSS extracts` , async ( ) => {
32
+ let all ;
33
+ try {
34
+ all = await css . listAll ( { folder : curatedFolder } ) ;
35
+ } catch ( err ) {
36
+ it ( 'contains valid JSON data' , ( ) => { throw err ; } ) ;
37
+ }
38
+ const baseProperties = { } ;
39
+ const basePropertiesInDeltaSpecs = { } ;
40
+ const extendedProperties = { } ;
41
+ const selectors = { } ;
42
+ const valuespaces = { } ;
39
43
40
- for ( const [ shortname , data ] of Object . entries ( all ) ) {
41
- describe ( `The CSS extract for ${ shortname } in the curated view` , ( ) => {
42
- it ( 'contains a link to the underlying spec' , async ( ) => {
43
- assert ( data ) ;
44
- assert ( data . spec ) ;
45
- assert ( data . spec . title ) ;
46
- } ) ;
44
+ for ( const [ shortname , data ] of Object . entries ( all ) ) {
45
+ describe ( `The CSS extract for ${ shortname } in the curated view` , ( ) => {
46
+ it ( 'contains a link to the underlying spec' , async ( ) => {
47
+ assert ( data ) ;
48
+ assert ( data . spec ) ;
49
+ assert ( data . spec . title ) ;
50
+ } ) ;
47
51
48
- const spec = index . results . find ( s => s . nightly ?. url === data . spec . url ) ;
49
- for ( const { type, prop, value } of cssValues ) {
50
- for ( const desc of data [ prop ] ) {
51
- const name = desc . name ;
52
- if ( ( type === 'property' ) && ( spec . seriesComposition !== 'delta' ) && ! desc . newValues ) {
53
- if ( ! baseProperties [ name ] ) {
54
- baseProperties [ name ] = [ ] ;
55
- }
56
- baseProperties [ name ] . push ( { spec : data . spec , dfn : desc } ) ;
57
- }
58
- else if ( ( type === 'property' ) && ( spec . seriesComposition === 'delta' ) && ! desc . newValues ) {
59
- if ( ! basePropertiesInDeltaSpecs [ name ] ) {
60
- basePropertiesInDeltaSpecs [ name ] = [ ] ;
61
- }
62
- basePropertiesInDeltaSpecs [ name ] . push ( { spec : data . spec , dfn : desc } ) ;
63
- }
64
- else if ( ( type === 'extended property' ) && desc [ value ] ) {
65
- if ( ! extendedProperties [ name ] ) {
66
- extendedProperties [ name ] = [ ] ;
67
- }
68
- extendedProperties [ name ] . push ( { spec : data . spec , dfn : desc } ) ;
52
+ const spec = index . results . find ( s => s . nightly ?. url === data . spec . url ) ;
53
+ for ( const { type, prop, value } of cssValues ) {
54
+ for ( const desc of data [ prop ] ) {
55
+ const name = desc . name ;
56
+ if ( ( type === 'property' ) && ( spec . seriesComposition !== 'delta' ) && ! desc . newValues ) {
57
+ if ( ! baseProperties [ name ] ) {
58
+ baseProperties [ name ] = [ ] ;
69
59
}
70
- else if ( ( type === 'selector' ) && ( spec . seriesComposition !== 'delta' ) ) {
71
- if ( ! selectors [ name ] ) {
72
- selectors [ name ] = [ ] ;
73
- }
74
- selectors [ name ] . push ( { spec : data . spec , dfn : desc } ) ;
60
+ baseProperties [ name ] . push ( { spec : data . spec , dfn : desc } ) ;
61
+ }
62
+ else if ( ( type === 'property' ) && ( spec . seriesComposition === 'delta' ) && ! desc . newValues ) {
63
+ if ( ! basePropertiesInDeltaSpecs [ name ] ) {
64
+ basePropertiesInDeltaSpecs [ name ] = [ ] ;
75
65
}
76
- else if ( ( type === 'value space' ) && ( spec . seriesComposition !== 'delta' ) ) {
77
- if ( ! valuespaces [ name ] ) {
78
- valuespaces [ name ] = [ ] ;
79
- }
80
- valuespaces [ name ] . push ( { spec : data . spec , dfn : desc } ) ;
66
+ basePropertiesInDeltaSpecs [ name ] . push ( { spec : data . spec , dfn : desc } ) ;
67
+ }
68
+ else if ( ( type === 'extended property' ) && desc [ value ] ) {
69
+ if ( ! extendedProperties [ name ] ) {
70
+ extendedProperties [ name ] = [ ] ;
81
71
}
82
- if ( ! desc [ value ] ) {
83
- continue ;
72
+ extendedProperties [ name ] . push ( { spec : data . spec , dfn : desc } ) ;
73
+ }
74
+ else if ( ( type === 'selector' ) && ( spec . seriesComposition !== 'delta' ) ) {
75
+ if ( ! selectors [ name ] ) {
76
+ selectors [ name ] = [ ] ;
84
77
}
85
- if ( type === 'descriptor' ) {
86
- for ( const dfn of desc [ value ] ) {
87
- it ( `defines a valid ${ type } "${ dfn . name } " for at-rule "${ name } "` , ( ) => {
88
- assert . strictEqual ( dfn . for , name ) ;
89
- assert . doesNotThrow ( ( ) => {
90
- const ast = definitionSyntax . parse ( dfn . value ) ;
91
- assert ( ast . type ) ;
92
- } , `Invalid definition value: ${ dfn . value } ` ) ;
93
- } ) ;
94
- }
78
+ selectors [ name ] . push ( { spec : data . spec , dfn : desc } ) ;
79
+ }
80
+ else if ( ( type === 'value space' ) && ( spec . seriesComposition !== 'delta' ) ) {
81
+ if ( ! valuespaces [ name ] ) {
82
+ valuespaces [ name ] = [ ] ;
95
83
}
96
- else {
97
- it ( `defines a valid ${ type } "${ name } "` , ( ) => {
84
+ valuespaces [ name ] . push ( { spec : data . spec , dfn : desc } ) ;
85
+ }
86
+ if ( ! desc [ value ] ) {
87
+ continue ;
88
+ }
89
+ if ( type === 'descriptor' ) {
90
+ for ( const dfn of desc [ value ] ) {
91
+ it ( `defines a valid ${ type } "${ dfn . name } " for at-rule "${ name } "` , ( ) => {
92
+ assert . strictEqual ( dfn . for , name ) ;
98
93
assert . doesNotThrow ( ( ) => {
99
- const ast = definitionSyntax . parse ( desc [ value ] ) ;
94
+ const ast = definitionSyntax . parse ( dfn . value ) ;
100
95
assert ( ast . type ) ;
101
- } , `Invalid definition value: ${ desc [ value ] } ` ) ;
102
- } ) ;
103
- } ;
104
-
105
- // All CSS values should link back to the spec, except:
106
- // - properties that extend a base property
107
- // - at-rulesdefined elsewhere (and present only because the spec
108
- // defines new descriptors for them)
109
- // - properties in delta specs that completely override the base
110
- // definition - currently enforced more restrictively as
111
- // "the 'contain' property in css-contain-3", to better track such
112
- // occurrences that should remain an exception to the exception rule!
113
- if ( ! desc . newValues &&
114
- ( prop !== 'atrules' || desc . value || desc . prose ) &&
115
- ! ( prop === 'properties' && name === 'contain' && spec . shortname === 'css-contain-3' ) ) {
116
- it ( `has a link back to the spec for ${ type } "${ name } "` , ( ) => {
117
- assert ( desc . href ) ;
118
- assert ( desc . href . includes ( '#' ) ) ;
96
+ } , `Invalid definition value: ${ dfn . value } ` ) ;
119
97
} ) ;
120
98
}
99
+ }
100
+ else {
101
+ it ( `defines a valid ${ type } "${ name } "` , ( ) => {
102
+ assert . doesNotThrow ( ( ) => {
103
+ const ast = definitionSyntax . parse ( desc [ value ] ) ;
104
+ assert ( ast . type ) ;
105
+ } , `Invalid definition value: ${ desc [ value ] } ` ) ;
106
+ } ) ;
107
+ } ;
121
108
122
- if ( desc . values ) {
123
- for ( const value of desc . values ) {
124
- if ( ! value . value ) {
125
- continue ;
126
- }
127
- it ( `defines a valid value "${ value . name } " for ${ type } "${ name } "` , ( ) => {
128
- assert . doesNotThrow ( ( ) => {
129
- const ast = definitionSyntax . parse ( value . value ) ;
130
- assert ( ast . type ) ;
131
- } , `Invalid definition value: ${ value . value } ` ) ;
132
- } ) ;
109
+ // All CSS values should link back to the spec, except:
110
+ // - properties that extend a base property
111
+ // - at-rulesdefined elsewhere (and present only because the spec
112
+ // defines new descriptors for them)
113
+ // - properties in delta specs that completely override the base
114
+ // definition - currently enforced more restrictively as
115
+ // "the 'contain' property in css-contain-3", to better track such
116
+ // occurrences that should remain an exception to the exception rule!
117
+ if ( ! desc . newValues &&
118
+ ( prop !== 'atrules' || desc . value || desc . prose ) &&
119
+ ! ( prop === 'properties' && name === 'contain' && spec . shortname === 'css-contain-3' ) ) {
120
+ it ( `has a link back to the spec for ${ type } "${ name } "` , ( ) => {
121
+ assert ( desc . href ) ;
122
+ assert ( desc . href . includes ( '#' ) ) ;
123
+ } ) ;
124
+ }
133
125
134
- it ( `has a link back to the spec for value " ${ value . name } " for ${ type } " ${ name } "` , ( ) => {
135
- assert ( value . href ) ;
136
- assert ( value . href . includes ( '#' ) ) ;
137
- } ) ;
126
+ if ( desc . values ) {
127
+ for ( const value of desc . values ) {
128
+ if ( ! value . value ) {
129
+ continue ;
138
130
}
131
+ it ( `defines a valid value "${ value . name } " for ${ type } "${ name } "` , ( ) => {
132
+ assert . doesNotThrow ( ( ) => {
133
+ const ast = definitionSyntax . parse ( value . value ) ;
134
+ assert ( ast . type ) ;
135
+ } , `Invalid definition value: ${ value . value } ` ) ;
136
+ } ) ;
137
+
138
+ it ( `has a link back to the spec for value "${ value . name } " for ${ type } "${ name } "` , ( ) => {
139
+ assert ( value . href ) ;
140
+ assert ( value . href . includes ( '#' ) ) ;
141
+ } ) ;
139
142
}
140
143
}
141
144
}
142
- } ) ;
143
- }
144
-
145
- describe ( `Looking at CSS properties, the curated view` , ( ) => {
146
- for ( const [ name , dfns ] of Object . entries ( baseProperties ) ) {
147
- it ( `contains only one "${ name } " property definition` , ( ) => {
148
- assert . strictEqual ( dfns . length , 1 ,
149
- `defined in ${ dfns . map ( d => d . spec . title ) . join ( ', ' ) } (${ dfns . map ( d => d . spec . url ) . join ( ', ' ) } )` ) ;
150
- } ) ;
151
145
}
152
146
} ) ;
147
+ }
153
148
154
- describe ( `Looking at CSS selectors, the curated view` , ( ) => {
155
- for ( const [ name , dfns ] of Object . entries ( selectors ) ) {
156
- it ( `contains only one "${ name } " selector definition` , ( ) => {
157
- assert . strictEqual ( dfns . length , 1 ,
158
- `defined in ${ dfns . map ( d => d . spec . title ) . join ( ', ' ) } (${ dfns . map ( d => d . spec . url ) . join ( ', ' ) } )` ) ;
159
- } ) ;
160
- }
161
- } ) ;
149
+ describe ( `Looking at CSS properties, the curated view` , ( ) => {
150
+ for ( const [ name , dfns ] of Object . entries ( baseProperties ) ) {
151
+ it ( `contains only one "${ name } " property definition` , ( ) => {
152
+ assert . strictEqual ( dfns . length , 1 ,
153
+ `defined in ${ dfns . map ( d => d . spec . title ) . join ( ', ' ) } (${ dfns . map ( d => d . spec . url ) . join ( ', ' ) } )` ) ;
154
+ } ) ;
155
+ }
156
+ } ) ;
157
+
158
+ describe ( `Looking at CSS selectors, the curated view` , ( ) => {
159
+ for ( const [ name , dfns ] of Object . entries ( selectors ) ) {
160
+ it ( `contains only one "${ name } " selector definition` , ( ) => {
161
+ assert . strictEqual ( dfns . length , 1 ,
162
+ `defined in ${ dfns . map ( d => d . spec . title ) . join ( ', ' ) } (${ dfns . map ( d => d . spec . url ) . join ( ', ' ) } )` ) ;
163
+ } ) ;
164
+ }
165
+ } ) ;
162
166
163
167
164
- describe ( `Looking at extended CSS properties, the curated view` , ( ) => {
165
- for ( const [ name , dfns ] of Object . entries ( extendedProperties ) ) {
166
- it ( `contains a base definition for the "${ name } " property` , ( ) => {
167
- assert ( baseProperties [ name ] || basePropertiesInDeltaSpecs [ name ] , 'no base definition found' ) ;
168
- } ) ;
169
- }
170
- } ) ;
168
+ describe ( `Looking at extended CSS properties, the curated view` , ( ) => {
169
+ for ( const [ name , dfns ] of Object . entries ( extendedProperties ) ) {
170
+ it ( `contains a base definition for the "${ name } " property` , ( ) => {
171
+ assert ( baseProperties [ name ] || basePropertiesInDeltaSpecs [ name ] , 'no base definition found' ) ;
172
+ } ) ;
173
+ }
174
+ } ) ;
171
175
172
- describe ( `Looking at CSS valuespaces, the curated view` , ( ) => {
173
- for ( const [ name , dfns ] of Object . entries ( valuespaces ) ) {
174
- it ( `contains only one "${ name } " valuespace definition` , ( ) => {
175
- assert . strictEqual ( dfns . length , 1 ,
176
- `defined in ${ dfns . map ( d => d . spec . title ) . join ( ', ' ) } (${ dfns . map ( d => d . spec . url ) . join ( ', ' ) } )` ) ;
177
- } ) ;
178
- }
179
- } ) ;
176
+ describe ( `Looking at CSS valuespaces, the curated view` , ( ) => {
177
+ for ( const [ name , dfns ] of Object . entries ( valuespaces ) ) {
178
+ it ( `contains only one "${ name } " valuespace definition` , ( ) => {
179
+ assert . strictEqual ( dfns . length , 1 ,
180
+ `defined in ${ dfns . map ( d => d . spec . title ) . join ( ', ' ) } (${ dfns . map ( d => d . spec . url ) . join ( ', ' ) } )` ) ;
181
+ } ) ;
182
+ }
180
183
} ) ;
181
184
182
- // Dummy test needed for "before" to run and register late tests
183
- // (test will fail if before function throws, e.g. because data is invalid)
184
- it ( 'contains valid JSON data' , ( ) => { } ) ;
185
185
} ) ;
0 commit comments