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
5import 'package:flutter/widgets.dart';
6import 'package:flutter_test/flutter_test.dart';
7
8void 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
243const Set<WidgetState> enabled = <WidgetState>{};
244

Provided by KDAB

Privacy Policy
Learn more about Flutter for embedded and desktop on industrialflutter.com