1 | // Copyright 2014 The Flutter Authors. All rights reserved. |
2 | // Use of this source code is governed by a BSD-style license that can be |
3 | // found in the LICENSE file. |
4 | |
5 | import 'package:flutter/widgets.dart'; |
6 | import 'package:flutter_test/flutter_test.dart'; |
7 | |
8 | void main() { |
9 | test('WidgetStateProperty.resolveWith()' , () { |
10 | final WidgetStateProperty<WidgetState> value = WidgetStateProperty.resolveWith<WidgetState>( |
11 | (Set<WidgetState> states) => states.first, |
12 | ); |
13 | expect(value.resolve(<WidgetState>{WidgetState.hovered}), WidgetState.hovered); |
14 | expect(value.resolve(<WidgetState>{WidgetState.focused}), WidgetState.focused); |
15 | expect(value.resolve(<WidgetState>{WidgetState.pressed}), WidgetState.pressed); |
16 | expect(value.resolve(<WidgetState>{WidgetState.dragged}), WidgetState.dragged); |
17 | expect(value.resolve(<WidgetState>{WidgetState.selected}), WidgetState.selected); |
18 | expect(value.resolve(<WidgetState>{WidgetState.disabled}), WidgetState.disabled); |
19 | expect(value.resolve(<WidgetState>{WidgetState.error}), WidgetState.error); |
20 | }); |
21 | |
22 | test('WidgetStateProperty.map()' , () { |
23 | final WidgetStatesConstraint active = |
24 | WidgetState.hovered | WidgetState.focused | WidgetState.pressed; |
25 | final WidgetStateProperty<String?> value = |
26 | WidgetStateProperty<String?>.fromMap(<WidgetStatesConstraint, String?>{ |
27 | active & WidgetState.error: 'active error' , |
28 | WidgetState.disabled | WidgetState.error: 'kinda sus' , |
29 | ~(WidgetState.dragged | WidgetState.selected) & ~active: 'this is boring' , |
30 | active: 'active' , |
31 | }); |
32 | expect(value.resolve(<WidgetState>{WidgetState.focused, WidgetState.error}), 'active error' ); |
33 | expect(value.resolve(<WidgetState>{WidgetState.scrolledUnder}), 'this is boring' ); |
34 | expect(value.resolve(<WidgetState>{WidgetState.disabled}), 'kinda sus' ); |
35 | expect(value.resolve(<WidgetState>{WidgetState.hovered}), 'active' ); |
36 | expect(value.resolve(<WidgetState>{WidgetState.dragged}), null); |
37 | }); |
38 | |
39 | test('WidgetStateProperty.all()' , () { |
40 | final WidgetStateProperty<int> value = WidgetStateProperty.all<int>(123); |
41 | expect(value.resolve(<WidgetState>{WidgetState.hovered}), 123); |
42 | expect(value.resolve(<WidgetState>{WidgetState.focused}), 123); |
43 | expect(value.resolve(<WidgetState>{WidgetState.pressed}), 123); |
44 | expect(value.resolve(<WidgetState>{WidgetState.dragged}), 123); |
45 | expect(value.resolve(<WidgetState>{WidgetState.selected}), 123); |
46 | expect(value.resolve(<WidgetState>{WidgetState.disabled}), 123); |
47 | expect(value.resolve(<WidgetState>{WidgetState.error}), 123); |
48 | }); |
49 | |
50 | test('WidgetStatePropertyAll' , () { |
51 | const WidgetStatePropertyAll<int> value = WidgetStatePropertyAll<int>(123); |
52 | expect(value.resolve(<WidgetState>{}), 123); |
53 | expect(value.resolve(<WidgetState>{WidgetState.hovered}), 123); |
54 | expect(value.resolve(<WidgetState>{WidgetState.focused}), 123); |
55 | expect(value.resolve(<WidgetState>{WidgetState.pressed}), 123); |
56 | expect(value.resolve(<WidgetState>{WidgetState.dragged}), 123); |
57 | expect(value.resolve(<WidgetState>{WidgetState.selected}), 123); |
58 | expect(value.resolve(<WidgetState>{WidgetState.disabled}), 123); |
59 | expect(value.resolve(<WidgetState>{WidgetState.error}), 123); |
60 | }); |
61 | |
62 | test('toString formats correctly' , () { |
63 | const WidgetStateProperty<Color?> colorProperty = WidgetStatePropertyAll<Color?>( |
64 | Color(0xFFFFFFFF), |
65 | ); |
66 | expect(colorProperty.toString(), equals('WidgetStatePropertyAll( ${const Color(0xffffffff)})' )); |
67 | |
68 | const WidgetStateProperty<double?> doubleProperty = WidgetStatePropertyAll<double?>(33 + 1 / 3); |
69 | expect(doubleProperty.toString(), equals('WidgetStatePropertyAll(33.3)' )); |
70 | }); |
71 | |
72 | test("Can interpolate between two WidgetStateProperty's" , () { |
73 | const WidgetStateProperty<TextStyle?> textStyle1 = WidgetStatePropertyAll<TextStyle?>( |
74 | TextStyle(fontSize: 14.0), |
75 | ); |
76 | const WidgetStateProperty<TextStyle?> textStyle2 = WidgetStatePropertyAll<TextStyle?>( |
77 | TextStyle(fontSize: 20.0), |
78 | ); |
79 | |
80 | // Using `0.0` interpolation value. |
81 | TextStyle textStyle = |
82 | WidgetStateProperty.lerp<TextStyle?>( |
83 | textStyle1, |
84 | textStyle2, |
85 | 0.0, |
86 | TextStyle.lerp, |
87 | )!.resolve(enabled)!; |
88 | expect(textStyle.fontSize, 14.0); |
89 | |
90 | // Using `0.5` interpolation value. |
91 | textStyle = |
92 | WidgetStateProperty.lerp<TextStyle?>( |
93 | textStyle1, |
94 | textStyle2, |
95 | 0.5, |
96 | TextStyle.lerp, |
97 | )!.resolve(enabled)!; |
98 | expect(textStyle.fontSize, 17.0); |
99 | |
100 | // Using `1.0` interpolation value. |
101 | textStyle = |
102 | WidgetStateProperty.lerp<TextStyle?>( |
103 | textStyle1, |
104 | textStyle2, |
105 | 1.0, |
106 | TextStyle.lerp, |
107 | )!.resolve(enabled)!; |
108 | expect(textStyle.fontSize, 20.0); |
109 | }); |
110 | |
111 | test('WidgetStateBorderSide.lerp()' , () { |
112 | const WidgetStateProperty<BorderSide?> borderSide1 = WidgetStatePropertyAll<BorderSide?>( |
113 | BorderSide(color: Color(0xffff0000), width: 4.0), |
114 | ); |
115 | const WidgetStateProperty<BorderSide?> borderSide2 = WidgetStatePropertyAll<BorderSide?>( |
116 | BorderSide(color: Color(0xff0000ff), width: 12.0), |
117 | ); |
118 | |
119 | // Using `0.0` interpolation value. |
120 | BorderSide borderSide = |
121 | WidgetStateBorderSide.lerp(borderSide1, borderSide2, 0.0)!.resolve(enabled)!; |
122 | expect(borderSide.color, isSameColorAs(const Color(0xffff0000))); |
123 | expect(borderSide.width, 4.0); |
124 | |
125 | // Using `0.5` interpolation value. |
126 | borderSide = WidgetStateBorderSide.lerp(borderSide1, borderSide2, 0.5)!.resolve(enabled)!; |
127 | expect(borderSide.color, isSameColorAs(const Color(0xff7f007f))); |
128 | expect(borderSide.width, 8.0); |
129 | |
130 | // Using `1.0` interpolation value. |
131 | borderSide = WidgetStateBorderSide.lerp(borderSide1, borderSide2, 1.0)!.resolve(enabled)!; |
132 | expect(borderSide.color, isSameColorAs(const Color(0xff0000ff))); |
133 | expect(borderSide.width, 12.0); |
134 | }); |
135 | |
136 | test('.fromMap() constructors perform accurate equality checks' , () { |
137 | const Color white = Color(0xFFFFFFFF); |
138 | const Color black = Color(0xFF000000); |
139 | final WidgetStateColor color1 = WidgetStateColor.fromMap(<WidgetStatesConstraint, Color>{ |
140 | WidgetState.focused | WidgetState.hovered: white, |
141 | WidgetState.any: black, |
142 | }); |
143 | final WidgetStateColor color2 = WidgetStateColor.fromMap(<WidgetStatesConstraint, Color>{ |
144 | WidgetState.focused | WidgetState.hovered: white, |
145 | WidgetState.any: black, |
146 | }); |
147 | final WidgetStateColor color3 = WidgetStateColor.fromMap(<WidgetStatesConstraint, Color>{ |
148 | WidgetState.focused | WidgetState.hovered: black, |
149 | WidgetState.any: white, |
150 | }); |
151 | expect(color1 == color2, isTrue); |
152 | expect(color1 == color3, isFalse); |
153 | |
154 | const BorderSide whiteBorder = BorderSide(color: white); |
155 | const BorderSide blackBorder = BorderSide(); |
156 | final WidgetStateBorderSide side1 = WidgetStateBorderSide.fromMap( |
157 | <WidgetStatesConstraint, BorderSide>{ |
158 | WidgetState.focused | WidgetState.hovered: whiteBorder, |
159 | WidgetState.any: blackBorder, |
160 | }, |
161 | ); |
162 | final WidgetStateBorderSide side2 = WidgetStateBorderSide.fromMap( |
163 | <WidgetStatesConstraint, BorderSide>{ |
164 | WidgetState.focused | WidgetState.hovered: whiteBorder, |
165 | WidgetState.any: blackBorder, |
166 | }, |
167 | ); |
168 | final WidgetStateBorderSide side3 = WidgetStateBorderSide.fromMap( |
169 | <WidgetStatesConstraint, BorderSide>{ |
170 | WidgetState.focused | WidgetState.hovered: blackBorder, |
171 | WidgetState.any: whiteBorder, |
172 | }, |
173 | ); |
174 | expect(side1 == side2, isTrue); |
175 | expect(side1 == side3, isFalse); |
176 | |
177 | const OutlinedBorder whiteRRect = RoundedRectangleBorder(side: whiteBorder); |
178 | const OutlinedBorder blackRRect = RoundedRectangleBorder(side: blackBorder); |
179 | final WidgetStateOutlinedBorder border1 = WidgetStateOutlinedBorder.fromMap( |
180 | <WidgetStatesConstraint, OutlinedBorder>{ |
181 | WidgetState.focused | WidgetState.hovered: whiteRRect, |
182 | WidgetState.any: blackRRect, |
183 | }, |
184 | ); |
185 | final WidgetStateOutlinedBorder border2 = WidgetStateOutlinedBorder.fromMap( |
186 | <WidgetStatesConstraint, OutlinedBorder>{ |
187 | WidgetState.focused | WidgetState.hovered: whiteRRect, |
188 | WidgetState.any: blackRRect, |
189 | }, |
190 | ); |
191 | final WidgetStateOutlinedBorder border3 = WidgetStateOutlinedBorder.fromMap( |
192 | <WidgetStatesConstraint, OutlinedBorder>{ |
193 | WidgetState.focused | WidgetState.hovered: blackRRect, |
194 | WidgetState.any: whiteRRect, |
195 | }, |
196 | ); |
197 | expect(border1 == border2, isTrue); |
198 | expect(border1 == border3, isFalse); |
199 | |
200 | final WidgetStateMouseCursor cursor1 = |
201 | WidgetStateMouseCursor.fromMap(<WidgetStatesConstraint, MouseCursor>{ |
202 | WidgetState.focused | WidgetState.hovered: MouseCursor.defer, |
203 | WidgetState.any: MouseCursor.uncontrolled, |
204 | }); |
205 | final WidgetStateMouseCursor cursor2 = |
206 | WidgetStateMouseCursor.fromMap(<WidgetStatesConstraint, MouseCursor>{ |
207 | WidgetState.focused | WidgetState.hovered: MouseCursor.defer, |
208 | WidgetState.any: MouseCursor.uncontrolled, |
209 | }); |
210 | final WidgetStateMouseCursor cursor3 = |
211 | WidgetStateMouseCursor.fromMap(<WidgetStatesConstraint, MouseCursor>{ |
212 | WidgetState.focused | WidgetState.hovered: MouseCursor.uncontrolled, |
213 | WidgetState.any: MouseCursor.defer, |
214 | }); |
215 | expect(cursor1 == cursor2, isTrue); |
216 | expect(cursor1 == cursor3, isFalse); |
217 | |
218 | const TextStyle whiteText = TextStyle(color: white); |
219 | const TextStyle blackText = TextStyle(color: black); |
220 | final WidgetStateTextStyle style1 = WidgetStateTextStyle.fromMap( |
221 | <WidgetStatesConstraint, TextStyle>{ |
222 | WidgetState.focused | WidgetState.hovered: whiteText, |
223 | WidgetState.any: blackText, |
224 | }, |
225 | ); |
226 | final WidgetStateTextStyle style2 = WidgetStateTextStyle.fromMap( |
227 | <WidgetStatesConstraint, TextStyle>{ |
228 | WidgetState.focused | WidgetState.hovered: whiteText, |
229 | WidgetState.any: blackText, |
230 | }, |
231 | ); |
232 | final WidgetStateTextStyle style3 = WidgetStateTextStyle.fromMap( |
233 | <WidgetStatesConstraint, TextStyle>{ |
234 | WidgetState.focused | WidgetState.hovered: blackText, |
235 | WidgetState.any: whiteText, |
236 | }, |
237 | ); |
238 | expect(style1 == style2, isTrue); |
239 | expect(style1 == style3, isFalse); |
240 | }); |
241 | } |
242 | |
243 | const Set<WidgetState> enabled = <WidgetState>{}; |
244 | |