@@ -527,19 +527,65 @@ o.spec("attributes", function() {
527
527
m ( "option" , { value : "" } )
528
528
)
529
529
}
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 )
541
588
} )
542
- */
543
589
o ( "can be set as text" , function ( ) {
544
590
var a = makeSelect ( )
545
591
var b = makeSelect ( "2" )
0 commit comments