@@ -298,6 +298,64 @@ describe(":nth-child(An+B of S)", () => {
298298 } ) ;
299299} ) ;
300300
301+ describe ( ":lang" , ( ) => {
302+ // Single fixture covering inheritance, override, and untagged elements.
303+ const langFixture = parseDocument (
304+ '<div lang="en"><p id="a">A</p><div lang="fr-BE"><p id="b">B</p></div></div><p id="c">C</p>' ,
305+ ) ;
306+
307+ it . each ( [
308+ // [selector, expected ids]
309+ [ ":lang(en)" , [ "a" ] ] ,
310+ [ ":lang(EN)" , [ "a" ] ] ,
311+ [ ":lang(fr)" , [ "b" ] ] ,
312+ [ ":lang(fr-BE)" , [ "b" ] ] ,
313+ [ ":lang(en, fr)" , [ "a" , "b" ] ] ,
314+ [ ":lang(de)" , [ ] ] ,
315+ ] ) ( "%s matches %j" , ( selector , expectedIds ) => {
316+ const matches = CSSselect . selectAll < AnyNode , Element > (
317+ `p${ selector } ` ,
318+ langFixture ,
319+ ) ;
320+ expect ( matches . map ( ( element ) => element . attribs [ "id" ] ) ) . toStrictEqual (
321+ expectedIds ,
322+ ) ;
323+ } ) ;
324+
325+ it ( "should not match untagged elements" , ( ) => {
326+ expect (
327+ CSSselect . selectAll < AnyNode , Element > ( "p:lang(en)" , langFixture ) ,
328+ ) . toHaveLength ( 1 ) ;
329+ } ) ;
330+
331+ it ( "should use extended filtering" , ( ) => {
332+ const dom = parseDocument (
333+ '<p lang="de-DE">a</p><p lang="de-Latn-DE">b</p><p lang="de-Latn-DE-1996">c</p>' ,
334+ ) ;
335+ expect (
336+ CSSselect . selectAll < AnyNode , Element > ( ":lang(de-DE)" , dom ) ,
337+ ) . toHaveLength ( 3 ) ;
338+ } ) ;
339+
340+ it ( "should support wildcard primary subtag" , ( ) => {
341+ const dom = parseDocument (
342+ '<p lang="de-CH">a</p><p lang="fr-CH">b</p><p lang="fr-FR">c</p>' ,
343+ ) ;
344+ expect (
345+ CSSselect . selectAll < AnyNode , Element > ( ":lang(\\*-CH)" , dom ) ,
346+ ) . toHaveLength ( 2 ) ;
347+ } ) ;
348+
349+ it ( "should support xml:lang" , ( ) => {
350+ const dom = parseDocument ( '<div xml:lang="ja"><p>x</p></div>' , {
351+ xmlMode : true ,
352+ } ) ;
353+ expect (
354+ CSSselect . selectAll < AnyNode , Element > ( ":lang(ja)" , dom ) ,
355+ ) . toHaveLength ( 2 ) ;
356+ } ) ;
357+ } ) ;
358+
301359describe ( ":read-only and :read-write" , ( ) => {
302360 it ( "should match" , ( ) => {
303361 const dom = parseDocument ( `
0 commit comments