@@ -527,19 +527,65 @@ o.spec("attributes", function() {
527527 m ( "option" , { value : "" } )
528528 )
529529 }
530- /* FIXME
531- This incomplete test is meant for testing #1916.
532- However it cannot be completed until #1978 is addressed
533- which is a lack a working select.selected / option.selected
534- attribute. Ask @dead-claudia.
535-
536- o("render select options", function() {
537- var select = m("select", {selectedIndex: 0},
538- m("option", {value: "1", selected: ""})
539- )
540- render(root, select)
530+ o ( "render select options with `selected` (#1916)" , function ( ) {
531+ var select1 = m ( "select" , [ m ( "option" ) , m ( "option" ) ] )
532+ var select2 = m ( "select" , [ m ( "option" , { selected : false } ) , m ( "option" , { selected : true } ) ] )
533+ var select3 = m ( "select" , [ m ( "option" , { selected : false } ) , m ( "option" , { selected : true } ) ] )
534+ var select4 = m ( "select" , [ m ( "option" , { selected : false } ) , m ( "option" , { selected : true } ) ] )
535+ var select5 = m ( "select" , [ m ( "option" , { selected : true } ) , m ( "option" , { selected : false } ) ] )
536+ var select6 = m ( "select" , [ m ( "option" , { selected : true } ) , m ( "option" , { selected : false } ) ] )
537+ var select7 = m ( "select" , [ m ( "option" , { selected : true } ) , m ( "option" , { selected : false } ) ] )
538+
539+ // selected: [undefined,undefined]
540+ // DomMock can't set/read `option.selected` when the option doesn't have a `select` parent,
541+ // so call render() without `option.selected` first.
542+ render ( root , select1 )
543+ var el = root . firstChild
544+ o ( el . selectedIndex ) . equals ( 0 )
545+ o ( el . childNodes [ 0 ] . selected ) . equals ( true )
546+ o ( el . childNodes [ 1 ] . selected ) . equals ( false )
547+
548+ // selected: [undefined,undefined] -> [false,true] (changed -> update by render)
549+ render ( root , select2 )
550+ o ( el . selectedIndex ) . equals ( 1 )
551+ o ( el . childNodes [ 0 ] . selected ) . equals ( false )
552+ o ( el . childNodes [ 1 ] . selected ) . equals ( true )
553+
554+ // selected: [false,true] -> [false,true] (unchanged, not focused -> not update by render)
555+ el . selectedIndex = 0 // set 0 without render
556+ render ( root , select3 )
557+ o ( el . selectedIndex ) . equals ( 0 ) // unchanged
558+ o ( el . childNodes [ 0 ] . selected ) . equals ( true )
559+ o ( el . childNodes [ 1 ] . selected ) . equals ( false )
560+
561+ // selected: [false,true] -> [false,true] (unchanged, focused -> update by render)
562+ el . focus ( )
563+ render ( root , select4 )
564+ o ( el . selectedIndex ) . equals ( 1 )
565+ o ( el . childNodes [ 0 ] . selected ) . equals ( false )
566+ o ( el . childNodes [ 1 ] . selected ) . equals ( true )
567+
568+ // selected: [false,true] -> [true,false] (changed -> update by render)
569+ render ( root , select5 )
570+ o ( el . selectedIndex ) . equals ( 0 )
571+ o ( el . childNodes [ 0 ] . selected ) . equals ( true )
572+ o ( el . childNodes [ 1 ] . selected ) . equals ( false )
573+
574+ // selected: [true,false] -> [true,false] (unchanged, not focused -> not update by render)
575+ el . selectedIndex = 1 // set 1 without render
576+ root . focus ( )
577+ render ( root , select6 )
578+ o ( el . selectedIndex ) . equals ( 1 ) // unchanged
579+ o ( el . childNodes [ 0 ] . selected ) . equals ( false )
580+ o ( el . childNodes [ 1 ] . selected ) . equals ( true )
581+
582+ // selected: [true,false] -> [true,false] (unchanged, focused -> update by render)
583+ el . focus ( )
584+ render ( root , select7 )
585+ o ( el . selectedIndex ) . equals ( 0 )
586+ o ( el . childNodes [ 0 ] . selected ) . equals ( true )
587+ o ( el . childNodes [ 1 ] . selected ) . equals ( false )
541588 } )
542- */
543589 o ( "can be set as text" , function ( ) {
544590 var a = makeSelect ( )
545591 var b = makeSelect ( "2" )
0 commit comments