-
Notifications
You must be signed in to change notification settings - Fork 68
/
Copy pathreact_context_test.dart
156 lines (135 loc) · 4.16 KB
/
react_context_test.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
@TestOn('browser')
@JS()
library react_test_utils_test;
import 'package:js/js.dart';
import 'package:test/test.dart';
import 'package:react/react.dart' as react;
import 'shared_type_tester.dart';
import 'util.dart';
main() {
void testTypeValue(dynamic typeToTest) {
var contextTypeRef;
var consumerRef;
render(ContextProviderWrapper({
'contextToUse': TestContext,
'value': typeToTest,
}, [
ContextTypeComponent({
'ref': (ref) {
contextTypeRef = ref;
}
}),
ContextConsumerWrapper({
'contextToUse': TestContext,
'ref': (ref) {
consumerRef = ref;
}
})
]));
expect(contextTypeRef.context, same(typeToTest));
expect(consumerRef.latestValue, same(typeToTest));
}
group('New Context API (Component2 only)', () {
group('sets and retrieves values correctly:', () {
sharedTypeTests(testTypeValue);
});
group('calculateChangeBits argument does not throw when used (has no effect in React 18)', () {
_ContextProviderWrapper? providerRef;
_ContextConsumerWrapper? consumerEvenRef;
_ContextConsumerWrapper? consumerOddRef;
setUp(() {
render(ContextProviderWrapper({
'contextToUse': TestCalculateChangedBitsContext,
'mode': 'increment',
'ref': (ref) {
providerRef = ref as _ContextProviderWrapper?;
}
}, [
ContextConsumerWrapper({
'key': 'EvenContextConsumer',
'contextToUse': TestCalculateChangedBitsContext,
'unstable_observedBits': 1 << 2,
'ref': (ref) {
consumerEvenRef = ref as _ContextConsumerWrapper?;
}
}),
ContextConsumerWrapper({
'key': 'OddContextConsumer',
'contextToUse': TestCalculateChangedBitsContext,
'unstable_observedBits': 1 << 3,
'ref': (ref) {
consumerOddRef = ref as _ContextConsumerWrapper?;
}
})
]));
});
test('on first render', () {
expect(consumerEvenRef!.latestValue, 1);
expect(consumerOddRef!.latestValue, 1);
});
test('on value updates', () {
// Test common behavior between React 17 (calculateChangedBits working)
// and React 18 (it having no effect).
providerRef!.increment();
expect(consumerEvenRef!.latestValue, 2);
providerRef!.increment();
expect(consumerOddRef!.latestValue, 3);
providerRef!.increment();
expect(consumerEvenRef!.latestValue, 4);
});
});
});
}
int calculateChangedBits(currentValue, nextValue) {
var result = 0;
if (nextValue % 2 == 0) {
// Bit for even values
result |= 1 << 2;
}
if (nextValue % 3 == 0) {
// Bit for odd values
result |= 1 << 3;
}
return result;
}
// ignore: deprecated_member_use_from_same_package
var TestCalculateChangedBitsContext = react.createContext(1, calculateChangedBits);
var TestContext = react.createContext();
final ContextProviderWrapper = react.registerComponent2(() => _ContextProviderWrapper());
class _ContextProviderWrapper extends react.Component2 {
@override
get initialState {
return {'counter': 1};
}
increment() {
setState({'counter': state['counter'] + 1});
}
@override
render() {
return react.div({}, [
(props['contextToUse'] as react.Context)
.Provider({'value': props['mode'] == 'increment' ? state['counter'] : props['value']}, props['children'])
]);
}
}
final ContextConsumerWrapper = react.registerComponent2(() => _ContextConsumerWrapper());
class _ContextConsumerWrapper extends react.Component2 {
dynamic latestValue;
@override
render() {
return (props['contextToUse'] as react.Context).Consumer({'unstable_observedBits': props['unstable_observedBits']},
(value) {
latestValue = value;
return react.div({}, '$value');
});
}
}
final ContextTypeComponent = react.registerComponent2(() => _ContextTypeComponent());
class _ContextTypeComponent extends react.Component2 {
@override
var contextType = TestContext;
@override
render() {
return react.div({}, '$context');
}
}