com.fofx.observething 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/Runtime/CollectionIdProvider.cs +71 -71
- package/Runtime/CollectionIdProvider.cs.meta +1 -1
- package/Runtime/IObservable.cs +66 -66
- package/Runtime/IObservable.cs.meta +1 -1
- package/Runtime/Implementations/Observable.cs +29 -29
- package/Runtime/Implementations/Observable.cs.meta +1 -1
- package/Runtime/Implementations/ObservableBase.cs +172 -172
- package/Runtime/Implementations/ObservableBase.cs.meta +1 -1
- package/Runtime/Implementations/ObservableCollection.cs +140 -140
- package/Runtime/Implementations/ObservableCollection.cs.meta +1 -1
- package/Runtime/Implementations/ObservableDictionary.cs +165 -165
- package/Runtime/Implementations/ObservableDictionary.cs.meta +1 -1
- package/Runtime/Implementations/ObservableList.cs +162 -162
- package/Runtime/Implementations/ObservableList.cs.meta +1 -1
- package/Runtime/Implementations/ObservableSet.cs +136 -136
- package/Runtime/Implementations/ObservableSet.cs.meta +1 -1
- package/Runtime/Implementations/ObservableValue.cs +58 -58
- package/Runtime/Implementations/ObservableValue.cs.meta +1 -1
- package/Runtime/Observables/BatchObservable.cs +71 -71
- package/Runtime/Observables/BatchObservable.cs.meta +1 -1
- package/Runtime/Observables/CastObservable.cs +127 -127
- package/Runtime/Observables/CastObservable.cs.meta +1 -1
- package/Runtime/Observables/CombineObservable.cs +95 -95
- package/Runtime/Observables/CombineObservable.cs.meta +1 -1
- package/Runtime/Observables/CombineValueObservable.cs +318 -318
- package/Runtime/Observables/CombineValueObservable.cs.meta +1 -1
- package/Runtime/Observables/ConcatObservable.cs +74 -74
- package/Runtime/Observables/ConcatObservable.cs.meta +1 -1
- package/Runtime/Observables/ContainsObservable.cs +70 -70
- package/Runtime/Observables/ContainsObservable.cs.meta +1 -1
- package/Runtime/Observables/CountObservable.cs +29 -29
- package/Runtime/Observables/CountObservable.cs.meta +1 -1
- package/Runtime/Observables/DistinctObservable.cs +54 -54
- package/Runtime/Observables/DistinctObservable.cs.meta +1 -1
- package/Runtime/Observables/FirstObservable.cs +52 -52
- package/Runtime/Observables/FirstObservable.cs.meta +1 -1
- package/Runtime/Observables/IndexOfObservable.cs +82 -82
- package/Runtime/Observables/IndexOfObservable.cs.meta +1 -1
- package/Runtime/Observables/OperationStreamObservable.cs +193 -193
- package/Runtime/Observables/OperationStreamObservable.cs.meta +1 -1
- package/Runtime/Observables/OrderByObservable.cs +115 -116
- package/Runtime/Observables/OrderByObservable.cs.meta +1 -1
- package/Runtime/Observables/SelectCollectionObservable.cs +28 -28
- package/Runtime/Observables/SelectCollectionObservable.cs.meta +1 -1
- package/Runtime/Observables/SelectListObservable.cs +28 -28
- package/Runtime/Observables/SelectListObservable.cs.meta +1 -1
- package/Runtime/Observables/SelectManyObservable.cs +77 -77
- package/Runtime/Observables/SelectManyObservable.cs.meta +1 -1
- package/Runtime/Observables/SelectValueObservable.cs +27 -27
- package/Runtime/Observables/SelectValueObservable.cs.meta +1 -1
- package/Runtime/Observables/SkipWhileObservable.cs +31 -31
- package/Runtime/Observables/SkipWhileObservable.cs.meta +1 -1
- package/Runtime/Observables/ThenObservable.cs +208 -208
- package/Runtime/Observables/ThenObservable.cs.meta +1 -1
- package/Runtime/Observables/ToDictionaryObservable.cs +35 -35
- package/Runtime/Observables/ToDictionaryObservable.cs.meta +1 -1
- package/Runtime/Observables/TrackObservable.cs +74 -74
- package/Runtime/Observables/TrackObservable.cs.meta +1 -1
- package/Runtime/Observables/UnwrapCollectionObservable.cs +63 -63
- package/Runtime/Observables/UnwrapCollectionObservable.cs.meta +1 -1
- package/Runtime/Observables/UnwrapListObservable.cs +69 -69
- package/Runtime/Observables/UnwrapListObservable.cs.meta +1 -1
- package/Runtime/Observables/UnwrapValueObservable.cs +55 -55
- package/Runtime/Observables/UnwrapValueObservable.cs.meta +1 -1
- package/Runtime/Observables/WhereObservable.cs +84 -84
- package/Runtime/Observables/WhereObservable.cs.meta +1 -1
- package/Runtime/Observables/WithPreviousObservable.cs +36 -36
- package/Runtime/Observables/WithPreviousObservable.cs.meta +1 -1
- package/Runtime/Observables.cs +466 -466
- package/Runtime/Observables.meta +8 -8
- package/Runtime/ObservationContext.cs +125 -125
- package/Runtime/ObservationContext.cs.meta +1 -1
- package/Runtime/Observers.cs +402 -402
- package/Runtime/Observers.cs.meta +1 -1
- package/Runtime/Operators/BatchOperator.cs +70 -70
- package/Runtime/Operators/BatchOperator.cs.meta +1 -1
- package/Runtime/Operators/CollectionOperator.cs +30 -30
- package/Runtime/Operators/CollectionOperator.cs.meta +1 -1
- package/Runtime/Operators/DictionaryOperator.cs +45 -45
- package/Runtime/Operators/DictionaryOperator.cs.meta +1 -1
- package/Runtime/Operators/IInitializationOperationsProvider.cs +10 -10
- package/Runtime/Operators/IInitializationOperationsProvider.cs.meta +1 -1
- package/Runtime/Operators/ListOperator.cs +44 -44
- package/Runtime/Operators/ListOperator.cs.meta +1 -1
- package/Runtime/Operators/ObservableOperator.cs +74 -74
- package/Runtime/Operators/ObservableOperator.cs.meta +1 -1
- package/Runtime/Operators/Operator.cs +65 -65
- package/Runtime/Operators/Operator.cs.meta +1 -1
- package/Runtime/Operators/SetOperator.cs +44 -44
- package/Runtime/Operators/SetOperator.cs.meta +1 -1
- package/Runtime/Operators/ValueOperator.cs +29 -29
- package/Runtime/Operators/ValueOperator.cs.meta +1 -1
- package/Runtime/Operators.meta +8 -8
- package/Runtime/PriorityQueue.cs +1095 -1095
- package/Runtime/PriorityQueue.cs.meta +1 -1
- package/Tests/CollectionObservableTests.cs +738 -738
- package/Tests/DictionaryObservableTests.cs +84 -84
- package/Tests/ListObservableTests.cs +147 -147
- package/Tests/ObservationContextTests.cs +359 -359
- package/Tests/ObservationContextTests.cs.meta +1 -1
- package/Tests/ValueObservableTests.cs +321 -321
- package/package.json +24 -24
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
fileFormatVersion: 2
|
|
1
|
+
fileFormatVersion: 2
|
|
2
2
|
guid: 4da78d805d539ea4db48bc0b719908d5
|
|
@@ -1,322 +1,322 @@
|
|
|
1
|
-
using System;
|
|
2
|
-
using System.Collections.Generic;
|
|
3
|
-
using System.Linq;
|
|
4
|
-
using NUnit.Framework;
|
|
5
|
-
using UnityEngine;
|
|
6
|
-
using UnityEngine.TestTools;
|
|
7
|
-
|
|
8
|
-
namespace ObserveThing.Tests
|
|
9
|
-
{
|
|
10
|
-
public class ObservableValueTests
|
|
11
|
-
{
|
|
12
|
-
[SetUp]
|
|
13
|
-
public void SetUp()
|
|
14
|
-
{
|
|
15
|
-
Settings.DefaultExceptionHandler = UnityEngine.Debug.LogException;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
[Test]
|
|
19
|
-
public void TestErrorLogging()
|
|
20
|
-
{
|
|
21
|
-
var source = new ObservableValue<bool>();
|
|
22
|
-
var errorSelect = source
|
|
23
|
-
.ObservableSelect(x => x)
|
|
24
|
-
.ObservableSelect(x => x)
|
|
25
|
-
.ObservableSelect(x => x)
|
|
26
|
-
.ObservableSelect(x =>
|
|
27
|
-
{
|
|
28
|
-
if (x)
|
|
29
|
-
throw new Exception("This is an exception");
|
|
30
|
-
|
|
31
|
-
return x;
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
var errorObservable = errorSelect.Subscribe();
|
|
35
|
-
|
|
36
|
-
LogAssert.Expect(UnityEngine.LogType.Exception, "Exception: This is an exception");
|
|
37
|
-
source.value = true;
|
|
38
|
-
|
|
39
|
-
errorObservable.Dispose();
|
|
40
|
-
source.value = false;
|
|
41
|
-
|
|
42
|
-
errorObservable = errorSelect.Subscribe(
|
|
43
|
-
onError: exc => UnityEngine.Debug.Log("Got exception")
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
LogAssert.Expect(UnityEngine.LogType.Log, "Got exception");
|
|
47
|
-
source.value = true;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
[Test]
|
|
51
|
-
public void TestSelect()
|
|
52
|
-
{
|
|
53
|
-
int callCount = 0;
|
|
54
|
-
int result = 0;
|
|
55
|
-
|
|
56
|
-
Exception exception = null;
|
|
57
|
-
bool disposed = false;
|
|
58
|
-
|
|
59
|
-
var toggle = new ObservableValue<bool>();
|
|
60
|
-
var selectObservable = toggle
|
|
61
|
-
.ObservableSelect(x => x ? 0 : 1)
|
|
62
|
-
.Subscribe(
|
|
63
|
-
x =>
|
|
64
|
-
{
|
|
65
|
-
callCount++;
|
|
66
|
-
result = x;
|
|
67
|
-
},
|
|
68
|
-
exc => exception = exc,
|
|
69
|
-
() => disposed = true
|
|
70
|
-
);
|
|
71
|
-
|
|
72
|
-
// init call
|
|
73
|
-
Assert.AreEqual(1, callCount);
|
|
74
|
-
Assert.AreEqual(1, result);
|
|
75
|
-
|
|
76
|
-
toggle.value = true;
|
|
77
|
-
Assert.AreEqual(2, callCount);
|
|
78
|
-
Assert.AreEqual(0, result);
|
|
79
|
-
|
|
80
|
-
toggle.value = false;
|
|
81
|
-
Assert.AreEqual(3, callCount);
|
|
82
|
-
Assert.AreEqual(1, result);
|
|
83
|
-
|
|
84
|
-
toggle.value = false;
|
|
85
|
-
Assert.AreEqual(3, callCount);
|
|
86
|
-
Assert.AreEqual(1, result);
|
|
87
|
-
|
|
88
|
-
toggle.Dispose();
|
|
89
|
-
Assert.IsTrue(disposed);
|
|
90
|
-
|
|
91
|
-
Assert.Throws(typeof(ObjectDisposedException), () => toggle.value = true);
|
|
92
|
-
Assert.AreEqual(3, callCount);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
[Test]
|
|
96
|
-
public void TestSelectRaisesException()
|
|
97
|
-
{
|
|
98
|
-
Exception exception = null;
|
|
99
|
-
var source = new ObservableValue<bool>();
|
|
100
|
-
var selectChain = source.ObservableSelect(x => x).ObservableSelect(x => x);
|
|
101
|
-
|
|
102
|
-
var stream = selectChain.Subscribe(
|
|
103
|
-
onNext: x =>
|
|
104
|
-
{
|
|
105
|
-
if (x)
|
|
106
|
-
throw new Exception("This is an exception");
|
|
107
|
-
},
|
|
108
|
-
onError: exc => exception = exc
|
|
109
|
-
);
|
|
110
|
-
|
|
111
|
-
source.value = true;
|
|
112
|
-
Assert.IsNotNull(exception);
|
|
113
|
-
|
|
114
|
-
exception = null;
|
|
115
|
-
|
|
116
|
-
source.value = false;
|
|
117
|
-
Assert.IsNull(exception);
|
|
118
|
-
|
|
119
|
-
stream.Dispose();
|
|
120
|
-
|
|
121
|
-
source.value = true;
|
|
122
|
-
Assert.IsNull(exception);
|
|
123
|
-
|
|
124
|
-
source.value = false;
|
|
125
|
-
Assert.IsNull(exception);
|
|
126
|
-
|
|
127
|
-
stream = selectChain.Subscribe(
|
|
128
|
-
onNext: x =>
|
|
129
|
-
{
|
|
130
|
-
if (x)
|
|
131
|
-
throw new Exception("This is an exception");
|
|
132
|
-
}
|
|
133
|
-
);
|
|
134
|
-
|
|
135
|
-
LogAssert.Expect(UnityEngine.LogType.Exception, "Exception: This is an exception");
|
|
136
|
-
source.value = true;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
[Test]
|
|
140
|
-
public void TestWithPrevious()
|
|
141
|
-
{
|
|
142
|
-
bool disposed = false;
|
|
143
|
-
bool receivedCall = false;
|
|
144
|
-
int currentValue = 0;
|
|
145
|
-
int previousValue = 0;
|
|
146
|
-
var source = new ObservableValue<int>();
|
|
147
|
-
var stream = source.ObservableWithPrevious().Subscribe(
|
|
148
|
-
onNext: x =>
|
|
149
|
-
{
|
|
150
|
-
currentValue = x.current;
|
|
151
|
-
previousValue = x.previous;
|
|
152
|
-
},
|
|
153
|
-
onDispose: () => disposed = true
|
|
154
|
-
);
|
|
155
|
-
|
|
156
|
-
Assert.AreEqual(currentValue, 0);
|
|
157
|
-
Assert.AreEqual(previousValue, 0);
|
|
158
|
-
|
|
159
|
-
source.value = 1;
|
|
160
|
-
|
|
161
|
-
Assert.AreEqual(currentValue, 1);
|
|
162
|
-
Assert.AreEqual(previousValue, 0);
|
|
163
|
-
|
|
164
|
-
source.value = 2;
|
|
165
|
-
|
|
166
|
-
Assert.AreEqual(currentValue, 2);
|
|
167
|
-
Assert.AreEqual(previousValue, 1);
|
|
168
|
-
|
|
169
|
-
receivedCall = false;
|
|
170
|
-
stream.Dispose();
|
|
171
|
-
Assert.IsTrue(disposed);
|
|
172
|
-
source.value = 100;
|
|
173
|
-
Assert.IsFalse(receivedCall);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
[Test]
|
|
177
|
-
public void TestShallowCopy()
|
|
178
|
-
{
|
|
179
|
-
var result = 0;
|
|
180
|
-
var nestedSource = new ObservableValue<int>(10);
|
|
181
|
-
var source = new ObservableValue<IValueObservable<int>>(nestedSource);
|
|
182
|
-
bool disposed = false;
|
|
183
|
-
bool receivedCall = false;
|
|
184
|
-
var d = source.ObservableSelect(x => x.AsObservable());
|
|
185
|
-
var subscription = source.ObservableUnwrap().Subscribe(
|
|
186
|
-
onNext: x =>
|
|
187
|
-
{
|
|
188
|
-
result = x;
|
|
189
|
-
receivedCall = true;
|
|
190
|
-
},
|
|
191
|
-
onDispose: () => disposed = true
|
|
192
|
-
);
|
|
193
|
-
|
|
194
|
-
Assert.AreEqual(10, result);
|
|
195
|
-
|
|
196
|
-
nestedSource.value = 100;
|
|
197
|
-
|
|
198
|
-
Assert.AreEqual(100, result);
|
|
199
|
-
|
|
200
|
-
source.value = new ObservableValue<int>(-3);
|
|
201
|
-
|
|
202
|
-
Assert.AreEqual(-3, result);
|
|
203
|
-
|
|
204
|
-
nestedSource.value = 2;
|
|
205
|
-
|
|
206
|
-
Assert.AreEqual(-3, result);
|
|
207
|
-
|
|
208
|
-
source.value = null;
|
|
209
|
-
|
|
210
|
-
Assert.AreEqual(0, result);
|
|
211
|
-
|
|
212
|
-
source.value = nestedSource;
|
|
213
|
-
|
|
214
|
-
Assert.AreEqual(2, result);
|
|
215
|
-
|
|
216
|
-
receivedCall = false;
|
|
217
|
-
subscription.Dispose();
|
|
218
|
-
Assert.IsTrue(disposed);
|
|
219
|
-
nestedSource.value = 100;
|
|
220
|
-
Assert.IsFalse(receivedCall);
|
|
221
|
-
Assert.AreEqual(2, result);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
[Test]
|
|
225
|
-
public void TestImmediateObserverOrder()
|
|
226
|
-
{
|
|
227
|
-
ObservableValue<int> observable = new ObservableValue<int>();
|
|
228
|
-
bool streamCalledFirst = false;
|
|
229
|
-
bool immediateStreamCalledFirst = false;
|
|
230
|
-
var chainedObservable = observable.ObservableSelect(x => x * 2);
|
|
231
|
-
|
|
232
|
-
var stream = chainedObservable.Subscribe(
|
|
233
|
-
onNext: x =>
|
|
234
|
-
{
|
|
235
|
-
if (!immediateStreamCalledFirst)
|
|
236
|
-
streamCalledFirst = true;
|
|
237
|
-
},
|
|
238
|
-
onDispose: () =>
|
|
239
|
-
{
|
|
240
|
-
if (!immediateStreamCalledFirst)
|
|
241
|
-
streamCalledFirst = true;
|
|
242
|
-
}
|
|
243
|
-
);
|
|
244
|
-
|
|
245
|
-
var immediateStream = chainedObservable.Subscribe(
|
|
246
|
-
immediate: true,
|
|
247
|
-
onNext: x =>
|
|
248
|
-
{
|
|
249
|
-
if (!streamCalledFirst)
|
|
250
|
-
immediateStreamCalledFirst = true;
|
|
251
|
-
},
|
|
252
|
-
onDispose: () =>
|
|
253
|
-
{
|
|
254
|
-
if (!streamCalledFirst)
|
|
255
|
-
immediateStreamCalledFirst = true;
|
|
256
|
-
}
|
|
257
|
-
);
|
|
258
|
-
|
|
259
|
-
streamCalledFirst = false;
|
|
260
|
-
immediateStreamCalledFirst = false;
|
|
261
|
-
|
|
262
|
-
observable.value++;
|
|
263
|
-
|
|
264
|
-
Assert.IsTrue(immediateStreamCalledFirst);
|
|
265
|
-
Assert.IsFalse(streamCalledFirst);
|
|
266
|
-
|
|
267
|
-
streamCalledFirst = false;
|
|
268
|
-
immediateStreamCalledFirst = false;
|
|
269
|
-
|
|
270
|
-
observable.Dispose();
|
|
271
|
-
|
|
272
|
-
Assert.IsTrue(immediateStreamCalledFirst);
|
|
273
|
-
Assert.IsFalse(streamCalledFirst);
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
[Test]
|
|
277
|
-
public void TestImmediateSubscription()
|
|
278
|
-
{
|
|
279
|
-
ObservableValue<int> observable = new ObservableValue<int>();
|
|
280
|
-
|
|
281
|
-
bool standardFired = false;
|
|
282
|
-
bool immediateFired = false;
|
|
283
|
-
|
|
284
|
-
bool standardFiredFirst = false;
|
|
285
|
-
bool immediateFiredFirst = false;
|
|
286
|
-
|
|
287
|
-
var standardStream = observable.Subscribe(
|
|
288
|
-
onNext: x =>
|
|
289
|
-
{
|
|
290
|
-
standardFired = true;
|
|
291
|
-
|
|
292
|
-
if (!immediateFiredFirst)
|
|
293
|
-
standardFiredFirst = true;
|
|
294
|
-
}
|
|
295
|
-
);
|
|
296
|
-
|
|
297
|
-
var immediateStream = observable.Subscribe(
|
|
298
|
-
immediate: true,
|
|
299
|
-
onNext: x =>
|
|
300
|
-
{
|
|
301
|
-
immediateFired = true;
|
|
302
|
-
|
|
303
|
-
if (!standardFiredFirst)
|
|
304
|
-
immediateFiredFirst = true;
|
|
305
|
-
}
|
|
306
|
-
);
|
|
307
|
-
|
|
308
|
-
standardFired = false;
|
|
309
|
-
immediateFired = false;
|
|
310
|
-
|
|
311
|
-
standardFiredFirst = false;
|
|
312
|
-
immediateFiredFirst = false;
|
|
313
|
-
|
|
314
|
-
observable.value = 1;
|
|
315
|
-
|
|
316
|
-
Assert.IsTrue(standardFired);
|
|
317
|
-
Assert.IsTrue(immediateFired);
|
|
318
|
-
Assert.IsTrue(immediateFiredFirst);
|
|
319
|
-
Assert.IsFalse(standardFiredFirst);
|
|
320
|
-
}
|
|
321
|
-
}
|
|
1
|
+
using System;
|
|
2
|
+
using System.Collections.Generic;
|
|
3
|
+
using System.Linq;
|
|
4
|
+
using NUnit.Framework;
|
|
5
|
+
using UnityEngine;
|
|
6
|
+
using UnityEngine.TestTools;
|
|
7
|
+
|
|
8
|
+
namespace ObserveThing.Tests
|
|
9
|
+
{
|
|
10
|
+
public class ObservableValueTests
|
|
11
|
+
{
|
|
12
|
+
[SetUp]
|
|
13
|
+
public void SetUp()
|
|
14
|
+
{
|
|
15
|
+
Settings.DefaultExceptionHandler = UnityEngine.Debug.LogException;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
[Test]
|
|
19
|
+
public void TestErrorLogging()
|
|
20
|
+
{
|
|
21
|
+
var source = new ObservableValue<bool>();
|
|
22
|
+
var errorSelect = source
|
|
23
|
+
.ObservableSelect(x => x)
|
|
24
|
+
.ObservableSelect(x => x)
|
|
25
|
+
.ObservableSelect(x => x)
|
|
26
|
+
.ObservableSelect(x =>
|
|
27
|
+
{
|
|
28
|
+
if (x)
|
|
29
|
+
throw new Exception("This is an exception");
|
|
30
|
+
|
|
31
|
+
return x;
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
var errorObservable = errorSelect.Subscribe();
|
|
35
|
+
|
|
36
|
+
LogAssert.Expect(UnityEngine.LogType.Exception, "Exception: This is an exception");
|
|
37
|
+
source.value = true;
|
|
38
|
+
|
|
39
|
+
errorObservable.Dispose();
|
|
40
|
+
source.value = false;
|
|
41
|
+
|
|
42
|
+
errorObservable = errorSelect.Subscribe(
|
|
43
|
+
onError: exc => UnityEngine.Debug.Log("Got exception")
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
LogAssert.Expect(UnityEngine.LogType.Log, "Got exception");
|
|
47
|
+
source.value = true;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
[Test]
|
|
51
|
+
public void TestSelect()
|
|
52
|
+
{
|
|
53
|
+
int callCount = 0;
|
|
54
|
+
int result = 0;
|
|
55
|
+
|
|
56
|
+
Exception exception = null;
|
|
57
|
+
bool disposed = false;
|
|
58
|
+
|
|
59
|
+
var toggle = new ObservableValue<bool>();
|
|
60
|
+
var selectObservable = toggle
|
|
61
|
+
.ObservableSelect(x => x ? 0 : 1)
|
|
62
|
+
.Subscribe(
|
|
63
|
+
x =>
|
|
64
|
+
{
|
|
65
|
+
callCount++;
|
|
66
|
+
result = x;
|
|
67
|
+
},
|
|
68
|
+
exc => exception = exc,
|
|
69
|
+
() => disposed = true
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
// init call
|
|
73
|
+
Assert.AreEqual(1, callCount);
|
|
74
|
+
Assert.AreEqual(1, result);
|
|
75
|
+
|
|
76
|
+
toggle.value = true;
|
|
77
|
+
Assert.AreEqual(2, callCount);
|
|
78
|
+
Assert.AreEqual(0, result);
|
|
79
|
+
|
|
80
|
+
toggle.value = false;
|
|
81
|
+
Assert.AreEqual(3, callCount);
|
|
82
|
+
Assert.AreEqual(1, result);
|
|
83
|
+
|
|
84
|
+
toggle.value = false;
|
|
85
|
+
Assert.AreEqual(3, callCount);
|
|
86
|
+
Assert.AreEqual(1, result);
|
|
87
|
+
|
|
88
|
+
toggle.Dispose();
|
|
89
|
+
Assert.IsTrue(disposed);
|
|
90
|
+
|
|
91
|
+
Assert.Throws(typeof(ObjectDisposedException), () => toggle.value = true);
|
|
92
|
+
Assert.AreEqual(3, callCount);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
[Test]
|
|
96
|
+
public void TestSelectRaisesException()
|
|
97
|
+
{
|
|
98
|
+
Exception exception = null;
|
|
99
|
+
var source = new ObservableValue<bool>();
|
|
100
|
+
var selectChain = source.ObservableSelect(x => x).ObservableSelect(x => x);
|
|
101
|
+
|
|
102
|
+
var stream = selectChain.Subscribe(
|
|
103
|
+
onNext: x =>
|
|
104
|
+
{
|
|
105
|
+
if (x)
|
|
106
|
+
throw new Exception("This is an exception");
|
|
107
|
+
},
|
|
108
|
+
onError: exc => exception = exc
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
source.value = true;
|
|
112
|
+
Assert.IsNotNull(exception);
|
|
113
|
+
|
|
114
|
+
exception = null;
|
|
115
|
+
|
|
116
|
+
source.value = false;
|
|
117
|
+
Assert.IsNull(exception);
|
|
118
|
+
|
|
119
|
+
stream.Dispose();
|
|
120
|
+
|
|
121
|
+
source.value = true;
|
|
122
|
+
Assert.IsNull(exception);
|
|
123
|
+
|
|
124
|
+
source.value = false;
|
|
125
|
+
Assert.IsNull(exception);
|
|
126
|
+
|
|
127
|
+
stream = selectChain.Subscribe(
|
|
128
|
+
onNext: x =>
|
|
129
|
+
{
|
|
130
|
+
if (x)
|
|
131
|
+
throw new Exception("This is an exception");
|
|
132
|
+
}
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
LogAssert.Expect(UnityEngine.LogType.Exception, "Exception: This is an exception");
|
|
136
|
+
source.value = true;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
[Test]
|
|
140
|
+
public void TestWithPrevious()
|
|
141
|
+
{
|
|
142
|
+
bool disposed = false;
|
|
143
|
+
bool receivedCall = false;
|
|
144
|
+
int currentValue = 0;
|
|
145
|
+
int previousValue = 0;
|
|
146
|
+
var source = new ObservableValue<int>();
|
|
147
|
+
var stream = source.ObservableWithPrevious().Subscribe(
|
|
148
|
+
onNext: x =>
|
|
149
|
+
{
|
|
150
|
+
currentValue = x.current;
|
|
151
|
+
previousValue = x.previous;
|
|
152
|
+
},
|
|
153
|
+
onDispose: () => disposed = true
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
Assert.AreEqual(currentValue, 0);
|
|
157
|
+
Assert.AreEqual(previousValue, 0);
|
|
158
|
+
|
|
159
|
+
source.value = 1;
|
|
160
|
+
|
|
161
|
+
Assert.AreEqual(currentValue, 1);
|
|
162
|
+
Assert.AreEqual(previousValue, 0);
|
|
163
|
+
|
|
164
|
+
source.value = 2;
|
|
165
|
+
|
|
166
|
+
Assert.AreEqual(currentValue, 2);
|
|
167
|
+
Assert.AreEqual(previousValue, 1);
|
|
168
|
+
|
|
169
|
+
receivedCall = false;
|
|
170
|
+
stream.Dispose();
|
|
171
|
+
Assert.IsTrue(disposed);
|
|
172
|
+
source.value = 100;
|
|
173
|
+
Assert.IsFalse(receivedCall);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
[Test]
|
|
177
|
+
public void TestShallowCopy()
|
|
178
|
+
{
|
|
179
|
+
var result = 0;
|
|
180
|
+
var nestedSource = new ObservableValue<int>(10);
|
|
181
|
+
var source = new ObservableValue<IValueObservable<int>>(nestedSource);
|
|
182
|
+
bool disposed = false;
|
|
183
|
+
bool receivedCall = false;
|
|
184
|
+
var d = source.ObservableSelect(x => x.AsObservable());
|
|
185
|
+
var subscription = source.ObservableUnwrap().Subscribe(
|
|
186
|
+
onNext: x =>
|
|
187
|
+
{
|
|
188
|
+
result = x;
|
|
189
|
+
receivedCall = true;
|
|
190
|
+
},
|
|
191
|
+
onDispose: () => disposed = true
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
Assert.AreEqual(10, result);
|
|
195
|
+
|
|
196
|
+
nestedSource.value = 100;
|
|
197
|
+
|
|
198
|
+
Assert.AreEqual(100, result);
|
|
199
|
+
|
|
200
|
+
source.value = new ObservableValue<int>(-3);
|
|
201
|
+
|
|
202
|
+
Assert.AreEqual(-3, result);
|
|
203
|
+
|
|
204
|
+
nestedSource.value = 2;
|
|
205
|
+
|
|
206
|
+
Assert.AreEqual(-3, result);
|
|
207
|
+
|
|
208
|
+
source.value = null;
|
|
209
|
+
|
|
210
|
+
Assert.AreEqual(0, result);
|
|
211
|
+
|
|
212
|
+
source.value = nestedSource;
|
|
213
|
+
|
|
214
|
+
Assert.AreEqual(2, result);
|
|
215
|
+
|
|
216
|
+
receivedCall = false;
|
|
217
|
+
subscription.Dispose();
|
|
218
|
+
Assert.IsTrue(disposed);
|
|
219
|
+
nestedSource.value = 100;
|
|
220
|
+
Assert.IsFalse(receivedCall);
|
|
221
|
+
Assert.AreEqual(2, result);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
[Test]
|
|
225
|
+
public void TestImmediateObserverOrder()
|
|
226
|
+
{
|
|
227
|
+
ObservableValue<int> observable = new ObservableValue<int>();
|
|
228
|
+
bool streamCalledFirst = false;
|
|
229
|
+
bool immediateStreamCalledFirst = false;
|
|
230
|
+
var chainedObservable = observable.ObservableSelect(x => x * 2);
|
|
231
|
+
|
|
232
|
+
var stream = chainedObservable.Subscribe(
|
|
233
|
+
onNext: x =>
|
|
234
|
+
{
|
|
235
|
+
if (!immediateStreamCalledFirst)
|
|
236
|
+
streamCalledFirst = true;
|
|
237
|
+
},
|
|
238
|
+
onDispose: () =>
|
|
239
|
+
{
|
|
240
|
+
if (!immediateStreamCalledFirst)
|
|
241
|
+
streamCalledFirst = true;
|
|
242
|
+
}
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
var immediateStream = chainedObservable.Subscribe(
|
|
246
|
+
immediate: true,
|
|
247
|
+
onNext: x =>
|
|
248
|
+
{
|
|
249
|
+
if (!streamCalledFirst)
|
|
250
|
+
immediateStreamCalledFirst = true;
|
|
251
|
+
},
|
|
252
|
+
onDispose: () =>
|
|
253
|
+
{
|
|
254
|
+
if (!streamCalledFirst)
|
|
255
|
+
immediateStreamCalledFirst = true;
|
|
256
|
+
}
|
|
257
|
+
);
|
|
258
|
+
|
|
259
|
+
streamCalledFirst = false;
|
|
260
|
+
immediateStreamCalledFirst = false;
|
|
261
|
+
|
|
262
|
+
observable.value++;
|
|
263
|
+
|
|
264
|
+
Assert.IsTrue(immediateStreamCalledFirst);
|
|
265
|
+
Assert.IsFalse(streamCalledFirst);
|
|
266
|
+
|
|
267
|
+
streamCalledFirst = false;
|
|
268
|
+
immediateStreamCalledFirst = false;
|
|
269
|
+
|
|
270
|
+
observable.Dispose();
|
|
271
|
+
|
|
272
|
+
Assert.IsTrue(immediateStreamCalledFirst);
|
|
273
|
+
Assert.IsFalse(streamCalledFirst);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
[Test]
|
|
277
|
+
public void TestImmediateSubscription()
|
|
278
|
+
{
|
|
279
|
+
ObservableValue<int> observable = new ObservableValue<int>();
|
|
280
|
+
|
|
281
|
+
bool standardFired = false;
|
|
282
|
+
bool immediateFired = false;
|
|
283
|
+
|
|
284
|
+
bool standardFiredFirst = false;
|
|
285
|
+
bool immediateFiredFirst = false;
|
|
286
|
+
|
|
287
|
+
var standardStream = observable.Subscribe(
|
|
288
|
+
onNext: x =>
|
|
289
|
+
{
|
|
290
|
+
standardFired = true;
|
|
291
|
+
|
|
292
|
+
if (!immediateFiredFirst)
|
|
293
|
+
standardFiredFirst = true;
|
|
294
|
+
}
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
var immediateStream = observable.Subscribe(
|
|
298
|
+
immediate: true,
|
|
299
|
+
onNext: x =>
|
|
300
|
+
{
|
|
301
|
+
immediateFired = true;
|
|
302
|
+
|
|
303
|
+
if (!standardFiredFirst)
|
|
304
|
+
immediateFiredFirst = true;
|
|
305
|
+
}
|
|
306
|
+
);
|
|
307
|
+
|
|
308
|
+
standardFired = false;
|
|
309
|
+
immediateFired = false;
|
|
310
|
+
|
|
311
|
+
standardFiredFirst = false;
|
|
312
|
+
immediateFiredFirst = false;
|
|
313
|
+
|
|
314
|
+
observable.value = 1;
|
|
315
|
+
|
|
316
|
+
Assert.IsTrue(standardFired);
|
|
317
|
+
Assert.IsTrue(immediateFired);
|
|
318
|
+
Assert.IsTrue(immediateFiredFirst);
|
|
319
|
+
Assert.IsFalse(standardFiredFirst);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
322
|
}
|