Lines 7-12
Link Here
|
7 |
* |
7 |
* |
8 |
* Contributors: |
8 |
* Contributors: |
9 |
* Matthew Hall - initial API and implementation (bug 218269) |
9 |
* Matthew Hall - initial API and implementation (bug 218269) |
|
|
10 |
* Ovidio Mallo - bug 248868 |
10 |
******************************************************************************/ |
11 |
******************************************************************************/ |
11 |
|
12 |
|
12 |
package org.eclipse.core.tests.internal.databinding.observable; |
13 |
package org.eclipse.core.tests.internal.databinding.observable; |
Lines 16-21
Link Here
|
16 |
|
17 |
|
17 |
import org.eclipse.core.databinding.observable.Diffs; |
18 |
import org.eclipse.core.databinding.observable.Diffs; |
18 |
import org.eclipse.core.databinding.observable.IObservable; |
19 |
import org.eclipse.core.databinding.observable.IObservable; |
|
|
20 |
import org.eclipse.core.databinding.observable.ObservableTracker; |
19 |
import org.eclipse.core.databinding.observable.Realm; |
21 |
import org.eclipse.core.databinding.observable.Realm; |
20 |
import org.eclipse.core.databinding.observable.value.AbstractObservableValue; |
22 |
import org.eclipse.core.databinding.observable.value.AbstractObservableValue; |
21 |
import org.eclipse.core.databinding.observable.value.IObservableValue; |
23 |
import org.eclipse.core.databinding.observable.value.IObservableValue; |
Lines 26-31
Link Here
|
26 |
import org.eclipse.jface.databinding.conformance.MutableObservableValueContractTest; |
28 |
import org.eclipse.jface.databinding.conformance.MutableObservableValueContractTest; |
27 |
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate; |
29 |
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate; |
28 |
import org.eclipse.jface.databinding.conformance.util.CurrentRealm; |
30 |
import org.eclipse.jface.databinding.conformance.util.CurrentRealm; |
|
|
31 |
import org.eclipse.jface.databinding.conformance.util.StaleEventTracker; |
29 |
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker; |
32 |
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker; |
30 |
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase; |
33 |
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase; |
31 |
|
34 |
|
Lines 36-42
Link Here
|
36 |
public class ValidatedObservableValueTest extends AbstractDefaultRealmTestCase { |
39 |
public class ValidatedObservableValueTest extends AbstractDefaultRealmTestCase { |
37 |
private ValidatedObservableValue validated; |
40 |
private ValidatedObservableValue validated; |
38 |
private ObservableValueStub target; |
41 |
private ObservableValueStub target; |
39 |
private IObservableValue validationStatus; |
42 |
private ValidationObservableValue validationStatus; |
40 |
|
43 |
|
41 |
private Object oldValue; |
44 |
private Object oldValue; |
42 |
private Object newValue; |
45 |
private Object newValue; |
Lines 47-54
Link Here
|
47 |
newValue = new Object(); |
50 |
newValue = new Object(); |
48 |
target = new ObservableValueStub(Realm.getDefault()); |
51 |
target = new ObservableValueStub(Realm.getDefault()); |
49 |
target.setValue(oldValue); |
52 |
target.setValue(oldValue); |
50 |
validationStatus = new WritableValue(ValidationStatus.ok(), |
53 |
validationStatus = new ValidationObservableValue(); |
51 |
IStatus.class); |
|
|
52 |
validated = new ValidatedObservableValue(target, validationStatus); |
54 |
validated = new ValidatedObservableValue(target, validationStatus); |
53 |
} |
55 |
} |
54 |
|
56 |
|
Lines 56-62
Link Here
|
56 |
CurrentRealm realm1 = new CurrentRealm(true); |
58 |
CurrentRealm realm1 = new CurrentRealm(true); |
57 |
CurrentRealm realm2 = new CurrentRealm(true); |
59 |
CurrentRealm realm2 = new CurrentRealm(true); |
58 |
target = new ObservableValueStub(realm1); |
60 |
target = new ObservableValueStub(realm1); |
59 |
validationStatus = new WritableValue(realm2); |
61 |
validationStatus = new ValidationObservableValue(realm2); |
60 |
try { |
62 |
try { |
61 |
new ValidatedObservableValue(target, validationStatus); |
63 |
new ValidatedObservableValue(target, validationStatus); |
62 |
fail("Expected exception--target and validation status should have the same realm"); |
64 |
fail("Expected exception--target and validation status should have the same realm"); |
Lines 65-80
Link Here
|
65 |
} |
67 |
} |
66 |
|
68 |
|
67 |
public void testIsStale_WhenTargetIsStale() { |
69 |
public void testIsStale_WhenTargetIsStale() { |
|
|
70 |
ValueChangeEventTracker validatedValueTracker = ValueChangeEventTracker |
71 |
.observe(validated); |
72 |
StaleEventTracker validatedStaleTracker = StaleEventTracker |
73 |
.observe(validated); |
74 |
|
68 |
assertFalse(target.isStale()); |
75 |
assertFalse(target.isStale()); |
69 |
assertFalse(validated.isStale()); |
76 |
assertFalse(validated.isStale()); |
|
|
77 |
assertEquals(0, validatedValueTracker.count); |
78 |
assertEquals(0, validatedStaleTracker.count); |
70 |
|
79 |
|
71 |
target.fireStale(); |
80 |
target.fireStale(); |
72 |
|
81 |
|
73 |
assertTrue(target.isStale()); |
82 |
assertTrue(target.isStale()); |
74 |
assertTrue(validated.isStale()); |
83 |
assertTrue(validated.isStale()); |
|
|
84 |
assertEquals(0, validatedValueTracker.count); |
85 |
assertEquals(1, validatedStaleTracker.count); // +1 |
86 |
|
87 |
// Set the same value on the target again. Since we are stale, this |
88 |
// should trigger a value change event to become unstale. |
89 |
target.setValue(target.getValue()); |
90 |
|
91 |
assertFalse(target.isStale()); |
92 |
assertFalse(validated.isStale()); |
93 |
assertEquals(1, validatedValueTracker.count); // +1 |
94 |
assertEquals(1, validatedStaleTracker.count); |
75 |
} |
95 |
} |
76 |
|
96 |
|
77 |
public void testIsStale_WhileChangesPending() { |
97 |
public void testIsStale_WhileChangesPending() { |
|
|
98 |
ValueChangeEventTracker validatedValueTracker = ValueChangeEventTracker |
99 |
.observe(validated); |
100 |
StaleEventTracker validatedStaleTracker = StaleEventTracker |
101 |
.observe(validated); |
102 |
|
78 |
assertFalse(target.isStale()); |
103 |
assertFalse(target.isStale()); |
79 |
assertFalse(validated.isStale()); |
104 |
assertFalse(validated.isStale()); |
80 |
|
105 |
|
Lines 84-98
Link Here
|
84 |
// value but the validation status is not OK. |
109 |
// value but the validation status is not OK. |
85 |
assertFalse(target.isStale()); |
110 |
assertFalse(target.isStale()); |
86 |
assertFalse(validated.isStale()); |
111 |
assertFalse(validated.isStale()); |
|
|
112 |
assertEquals(0, validatedValueTracker.count); |
113 |
assertEquals(0, validatedStaleTracker.count); |
87 |
|
114 |
|
88 |
target.setValue(newValue); |
115 |
target.setValue(newValue); |
89 |
|
116 |
|
90 |
assertFalse(target.isStale()); |
117 |
assertFalse(target.isStale()); |
91 |
assertTrue(validated.isStale()); |
118 |
assertTrue(validated.isStale()); |
|
|
119 |
assertEquals(0, validatedValueTracker.count); |
120 |
assertEquals(1, validatedStaleTracker.count); // +1 |
92 |
|
121 |
|
93 |
validationStatus.setValue(ValidationStatus.ok()); |
122 |
validationStatus.setValue(ValidationStatus.ok()); |
94 |
|
123 |
|
95 |
assertFalse(validated.isStale()); |
124 |
assertFalse(validated.isStale()); |
|
|
125 |
assertEquals(1, validatedValueTracker.count); // +1 |
126 |
assertEquals(1, validatedStaleTracker.count); |
127 |
} |
128 |
|
129 |
public void testIsStale_WhenStatusIsStale() { |
130 |
ValueChangeEventTracker validatedValueTracker = ValueChangeEventTracker |
131 |
.observe(validated); |
132 |
StaleEventTracker validatedStaleTracker = StaleEventTracker |
133 |
.observe(validated); |
134 |
|
135 |
assertFalse(validationStatus.isStale()); |
136 |
assertFalse(validated.isStale()); |
137 |
assertEquals(0, validatedValueTracker.count); |
138 |
assertEquals(0, validatedStaleTracker.count); |
139 |
|
140 |
// Become stale and check that we receive a stale event. |
141 |
validationStatus.setStale(true); |
142 |
|
143 |
assertTrue(validationStatus.isStale()); |
144 |
assertTrue(validated.isStale()); |
145 |
assertEquals(0, validatedValueTracker.count); |
146 |
assertEquals(1, validatedStaleTracker.count); // +1 |
147 |
|
148 |
// Become unstale again and check that we receive a change event. |
149 |
validationStatus.setStale(false); |
150 |
|
151 |
assertFalse(validationStatus.isStale()); |
152 |
assertFalse(validated.isStale()); |
153 |
assertEquals(1, validatedValueTracker.count); // +1 |
154 |
assertEquals(1, validatedStaleTracker.count); |
155 |
} |
156 |
|
157 |
public void testEvents_WhenStatusIsStale() { |
158 |
ValueChangeEventTracker validatedValueTracker = ValueChangeEventTracker |
159 |
.observe(validated); |
160 |
StaleEventTracker validatedStaleTracker = StaleEventTracker |
161 |
.observe(validated); |
162 |
|
163 |
assertFalse(validationStatus.isStale()); |
164 |
assertFalse(validated.isStale()); |
165 |
assertEquals(0, validatedValueTracker.count); |
166 |
assertEquals(0, validatedStaleTracker.count); |
167 |
|
168 |
// Become stale and check that we receive a stale event. |
169 |
validationStatus.setStale(true); |
170 |
|
171 |
assertTrue(validationStatus.isStale()); |
172 |
assertTrue(validated.isStale()); |
173 |
assertEquals(0, validatedValueTracker.count); |
174 |
assertEquals(1, validatedStaleTracker.count); // +1 |
175 |
|
176 |
// Changes to the target observable should not be propagated while the |
177 |
// validation is stale. |
178 |
target.setValue(new Object()); |
179 |
|
180 |
assertEquals(0, validatedValueTracker.count); |
181 |
assertEquals(1, validatedStaleTracker.count); |
182 |
|
183 |
// Changes to the validated observable should be propagated while the |
184 |
// validation is stale but we remain stale. |
185 |
validated.setValue(new Object()); |
186 |
|
187 |
assertTrue(validated.isStale()); |
188 |
assertEquals(1, validatedValueTracker.count); // +1 |
189 |
assertEquals(1, validatedStaleTracker.count); |
190 |
|
191 |
// Finally, become unstale and check that we receive a change event. |
192 |
validationStatus.setStale(false); |
193 |
|
194 |
assertFalse(validationStatus.isStale()); |
195 |
assertFalse(validated.isStale()); |
196 |
assertEquals(2, validatedValueTracker.count); // +1 |
197 |
assertEquals(1, validatedStaleTracker.count); |
96 |
} |
198 |
} |
97 |
|
199 |
|
98 |
public void testGetValueType_SameAsTarget() { |
200 |
public void testGetValueType_SameAsTarget() { |
Lines 212-221
Link Here
|
212 |
assertTrue(target.isStale()); |
314 |
assertTrue(target.isStale()); |
213 |
assertTrue(validated.isStale()); |
315 |
assertTrue(validated.isStale()); |
214 |
|
316 |
|
|
|
317 |
// Set a new value on the target. |
215 |
target.setValue(newValue); |
318 |
target.setValue(newValue); |
216 |
|
319 |
|
217 |
assertTrue(target.isStale()); |
320 |
assertTrue(target.isStale()); |
218 |
assertTrue(validated.isStale()); |
321 |
assertTrue(validated.isStale()); |
|
|
322 |
|
323 |
// Set a new value on the validated observable. |
324 |
validated.setValue(new Object()); |
325 |
|
326 |
assertTrue(target.isStale()); |
327 |
assertTrue(validated.isStale()); |
219 |
} |
328 |
} |
220 |
|
329 |
|
221 |
static class ObservableValueStub extends AbstractObservableValue { |
330 |
static class ObservableValueStub extends AbstractObservableValue { |
Lines 302-305
Link Here
|
302 |
} |
411 |
} |
303 |
} |
412 |
} |
304 |
|
413 |
|
|
|
414 |
private static class ValidationObservableValue extends WritableValue { |
415 |
private boolean stale = false; |
416 |
|
417 |
public ValidationObservableValue() { |
418 |
this(Realm.getDefault()); |
419 |
} |
420 |
|
421 |
public ValidationObservableValue(Realm realm) { |
422 |
super(realm, ValidationStatus.ok(), IStatus.class); |
423 |
} |
424 |
|
425 |
public boolean isStale() { |
426 |
ObservableTracker.getterCalled(this); |
427 |
return stale; |
428 |
} |
429 |
|
430 |
public void setStale(boolean stale) { |
431 |
if (this.stale != stale) { |
432 |
this.stale = stale; |
433 |
if (stale) { |
434 |
fireStale(); |
435 |
} else { |
436 |
fireValueChange(Diffs.createValueDiff(doGetValue(), |
437 |
doGetValue())); |
438 |
} |
439 |
} |
440 |
} |
441 |
} |
305 |
} |
442 |
} |