@@ -36,6 +36,7 @@ describe('ReactDOMInput', function() {
36
36
stub = ReactTestUtils . renderIntoDocument ( stub ) ;
37
37
var node = ReactDOM . findDOMNode ( stub ) ;
38
38
39
+ expect ( node . getAttribute ( 'value' ) ) . toBe ( '0' ) ;
39
40
expect ( node . value ) . toBe ( '0' ) ;
40
41
} ) ;
41
42
@@ -55,6 +56,68 @@ describe('ReactDOMInput', function() {
55
56
expect ( node . value ) . toBe ( 'false' ) ;
56
57
} ) ;
57
58
59
+ it ( 'should update `defaultValue` for uncontrolled input' , function ( ) {
60
+ var container = document . createElement ( 'div' ) ;
61
+
62
+ var el = ReactDOM . render ( < input type = "text" defaultValue = "0" /> , container ) ;
63
+ var node = ReactDOM . findDOMNode ( el ) ;
64
+
65
+ expect ( node . value ) . toBe ( '0' ) ;
66
+
67
+ ReactDOM . render ( < input type = "text" defaultValue = "1" /> , container ) ;
68
+
69
+ expect ( node . value ) . toBe ( '1' ) ;
70
+ } ) ;
71
+
72
+ it ( 'should take `defaultValue` for a controlled input' , function ( ) {
73
+ var container = document . createElement ( 'div' ) ;
74
+
75
+ var el = ReactDOM . render ( < input type = "text" value = { null } defaultValue = "0" /> , container ) ;
76
+ var node = ReactDOM . findDOMNode ( el ) ;
77
+
78
+ expect ( node . value ) . toBe ( '0' ) ;
79
+
80
+ ReactDOM . render ( < input type = "text" value = { null } defaultValue = "1" /> , container ) ;
81
+
82
+ expect ( node . value ) . toBe ( '1' ) ;
83
+
84
+ ReactDOM . render ( < input type = "text" value = { 3 } defaultValue = "2" /> , container ) ;
85
+
86
+ expect ( node . value ) . toBe ( '3' ) ;
87
+
88
+ ReactDOM . render ( < input type = "text" value = { 5 } defaultValue = "4" /> , container ) ;
89
+
90
+ expect ( node . value ) . toBe ( '5' ) ;
91
+ expect ( node . getAttribute ( 'value' ) ) . toBe ( '5' ) ;
92
+ expect ( node . defaultValue ) . toBe ( '5' ) ;
93
+ } ) ;
94
+
95
+ it ( 'should update `value` when changing to controlled input' , function ( ) {
96
+ var container = document . createElement ( 'div' ) ;
97
+
98
+ var el = ReactDOM . render ( < input type = "text" defaultValue = "0" /> , container ) ;
99
+ var node = ReactDOM . findDOMNode ( el ) ;
100
+
101
+ expect ( node . value ) . toBe ( '0' ) ;
102
+
103
+ ReactDOM . render ( < input type = "text" value = "1" defaultValue = "0" /> , container ) ;
104
+
105
+ expect ( node . value ) . toBe ( '1' ) ;
106
+ } ) ;
107
+
108
+ it ( 'should take `defaultValue` when changing to uncontrolled input' , function ( ) {
109
+ var container = document . createElement ( 'div' ) ;
110
+
111
+ var el = ReactDOM . render ( < input type = "text" value = "0" readOnly = "true" /> , container ) ;
112
+ var node = ReactDOM . findDOMNode ( el ) ;
113
+
114
+ expect ( node . value ) . toBe ( '0' ) ;
115
+
116
+ ReactDOM . render ( < input type = "text" defaultValue = "1" /> , container ) ;
117
+
118
+ expect ( node . value ) . toBe ( '1' ) ;
119
+ } ) ;
120
+
58
121
it ( 'should display "foobar" for `defaultValue` of `objToString`' , function ( ) {
59
122
var objToString = {
60
123
toString : function ( ) {
@@ -127,6 +190,29 @@ describe('ReactDOMInput', function() {
127
190
expect ( node . value ) . toEqual ( 'foobar' ) ;
128
191
} ) ;
129
192
193
+ it ( 'should not incur unnecessary DOM mutations' , function ( ) {
194
+ var container = document . createElement ( 'div' ) ;
195
+ ReactDOM . render ( < input value = "a" /> , container ) ;
196
+
197
+ var node = container . firstChild ;
198
+ var nodeValue = 'a' ; // node.value always returns undefined
199
+ var nodeValueSetter = jest . genMockFn ( ) ;
200
+ Object . defineProperty ( node , 'value' , {
201
+ get : function ( ) {
202
+ return nodeValue ;
203
+ } ,
204
+ set : nodeValueSetter . mockImplementation ( function ( newValue ) {
205
+ nodeValue = newValue ;
206
+ } ) ,
207
+ } ) ;
208
+
209
+ ReactDOM . render ( < input value = "a" /> , container ) ;
210
+ expect ( nodeValueSetter . mock . calls . length ) . toBe ( 0 ) ;
211
+
212
+ ReactDOM . render ( < input value = "b" /> , container ) ;
213
+ expect ( nodeValueSetter . mock . calls . length ) . toBe ( 1 ) ;
214
+ } ) ;
215
+
130
216
it ( 'should properly control a value of number `0`' , function ( ) {
131
217
var stub = < input type = "text" value = { 0 } onChange = { emptyFunction } /> ;
132
218
stub = ReactTestUtils . renderIntoDocument ( stub ) ;
0 commit comments