Event Dispatcher  v0.1.6-beta.1
Project that offers a small library that allows to subscribe and fire events.
ObservableValueTest.java
Go to the documentation of this file.
1 package com.fermod;
2 
3 import static org.junit.Assume.assumeNoException;
4 import static org.junit.jupiter.api.Assertions.assertAll;
5 import static org.junit.jupiter.api.Assertions.assertEquals;
6 import static org.junit.jupiter.api.Assertions.assertFalse;
7 import static org.junit.jupiter.api.Assertions.assertTrue;
8 import static org.junit.jupiter.api.Assertions.fail;
9 import static org.junit.jupiter.api.Assumptions.assumeFalse;
10 import static org.junit.jupiter.api.Assumptions.assumeTrue;
11 
12 import java.io.File;
13 import java.io.FileInputStream;
14 import java.io.FileOutputStream;
15 import java.io.ObjectInputStream;
16 import java.io.ObjectOutputStream;
17 import java.io.Serializable;
18 import java.nio.file.Path;
19 import java.util.Arrays;
20 
21 import org.apache.logging.log4j.LogManager;
22 import org.apache.logging.log4j.Logger;
23 import org.junit.jupiter.api.BeforeAll;
24 import org.junit.jupiter.api.BeforeEach;
25 import org.junit.jupiter.api.DisplayName;
26 import org.junit.jupiter.api.TestInfo;
27 import org.junit.jupiter.api.extension.ExtendWith;
28 import org.junit.jupiter.api.io.TempDir;
29 import org.junit.jupiter.params.ParameterizedTest;
30 import org.junit.jupiter.params.provider.CsvSource;
31 import org.junit.jupiter.params.provider.ValueSource;
32 
39 
40 @ExtendWith({TimingExtension.class})
42 
43  private static final Logger LOGGER = LogManager.getLogger(ObservableValueTest.class);
44 
45  static String fileName;
46  static boolean eventMethodInvoked;
47  static boolean listenerMethodInvoked;
48 
49  @BeforeAll
50  static void beforeAll() {
51  fileName = "SerializedObjectTest.tmp";
52  }
53 
54  @BeforeEach
55  void beforeEach() {
56  eventMethodInvoked = false;
57  listenerMethodInvoked = false;
58  }
59 
66  @DisplayName("Test Event - Unregister event")
67  @ParameterizedTest
68  @ValueSource(ints = { 10, 0, -4 })
69  void testUnregisterEvent(int value, TestInfo testInfo) {
70 
71  ObservedValue<Integer> observedValue = new ObservedValue<>(value);
72 
74  @Override
75  public void onValueChanged(Integer oldValue, Integer value) {
76  listenerMethodInvoked = true;
77  }
78  };
79  observedValue.registerListener(valueChangeListener);
80 
81  try {
82 
83  assumeFalse(listenerMethodInvoked, () -> "Listener method already invoked");
84 
85  observedValue.unregisterListener(valueChangeListener);
86  observedValue.set(value);
87 
88  assertFalse(listenerMethodInvoked, () -> "Listener method invoked");
89 
90  } catch (Exception e) {
91  fail("Unexpected exception thrown in " + testInfo.getTestMethod().get().getName() + "\n\tCase: " + testInfo.getDisplayName(), e);
92  }
93 
94  }
95 
102  @DisplayName("Test Event - Unregister all events")
103  @ParameterizedTest
104  @ValueSource(ints = { 10, 0, -4 })
105  void testUnregisterAllEvents(int value, TestInfo testInfo) {
106 
107  ObservedValue<Integer> observedValue = new ObservedValue<>(value);
108 
109  ValueChangeListener<Integer> valueChangeListener = new ValueChangeListener<Integer>() {
110  @Override
111  public void onValueChanged(Integer oldValue, Integer value) {
112  listenerMethodInvoked = true;
113  }
114  };
115  observedValue.registerListener(valueChangeListener);
116 
118 
119  try {
120 
121  assumeFalse(eventMethodInvoked, () -> "Event method already invoked.");
122  assumeFalse(listenerMethodInvoked, () -> "Listener method already invoked.");
123 
124  observedValue.unregisterAllListeners();
125  observedValue.set(value);
126 
127  assertAll("EventValues",
128  () -> assertFalse(eventMethodInvoked, () -> "Event method invoked."),
129  () -> assertFalse(listenerMethodInvoked, () -> "Listener method invoked.")
130  );
131 
132  } catch (Exception e) {
133  fail("Unexpected exception thrown in " + testInfo.getTestMethod().get().getName() + "\n\tCase: " + testInfo.getDisplayName(), e);
134  }
135 
136  }
137 
145  @DisplayName("Test Event - Inline method invocation")
146  @ParameterizedTest
147  @CsvSource({"30, 10", "-2, 10", "11, 10"})
148  void testEventMethodInvocation(int expected, int value, TestInfo testInfo) {
149 
150  try {
151  ObservedValue<Integer> observedValue = new ObservedValue<>(value);
152  observedValue.registerListener((oldVAlue, newValue) -> {
153  eventMethodInvoked = true;
154  assertAll("EventValues",
155  () -> assertEquals(oldVAlue, value, () -> "New value missmatch in event invocation."),
156  () -> assertEquals(newValue, expected, () -> "Old value missmatch in event invocation.")
157  );
158  });
159 
160  observedValue.set(expected);
161 
162  assertTrue(eventMethodInvoked, () -> "Event method not invoked.");
163  } catch (Exception e) {
164  fail("Unexpected exception thrown in " + testInfo.getTestMethod().get().getName() + "\n\tCase: " + testInfo.getDisplayName(), e);
165  }
166  }
167 
175  @DisplayName("Test Event - Referenced method invocation")
176  @ParameterizedTest
177  @CsvSource({"Paco, NewPaco, 44", "Lola, NewLola, 41"})
178  void testEventMethodInvocation(String name, String newName, int age) {
179 
180  PersonObject personTest = new PersonObject(name, age);
181 
182  try {
184  } catch (Exception e) {
185  assumeNoException(e);
186  }
187 
188  assumeFalse(eventMethodInvoked, () -> "Event method already invoked");
189  personTest.setName(newName);
190  assertTrue(eventMethodInvoked, () -> "Event method not invoked");
191 
192  }
193 
201  @DisplayName("Test Event - Referenced method invocation")
202  @ParameterizedTest
203  @CsvSource({"Paco, NewPaco, 44", "Lola, NewLola, 41"})
204  void testEventMethodValueChange(String name, String newName, int age) {
205 
206  PersonObject personTest = new PersonObject(name, age);
207 
208  try {
210  } catch (Exception e) {
211  assumeNoException(e);
212  }
213 
214  assumeFalse(eventMethodInvoked, () -> "Event method already invoked");
215  personTest.setName(newName);
216  assumeTrue(eventMethodInvoked, () -> "Event method not invoked");
217 
218  assertEquals(newName, personTest.getName(), () -> "Obtained value is the new value");
219 
220  }
221 
228  @DisplayName("Test Event - Event not fired")
229  @ParameterizedTest
230  @ValueSource(ints = { 10, 0, -4 })
231  void testEventMethodNotInvoqued(int value, TestInfo testInfo) {
232 
233  ObservedValue<Integer> observedValue = new ObservedValue<>(value);
235 
236  try {
237  assumeFalse(eventMethodInvoked, () -> "Event method already invoked");
238  observedValue.set(value);
239  assertFalse(eventMethodInvoked, () -> "Event method invoked");
240  } catch (Exception e) {
241  fail("Unexpected exception thrown in " + testInfo.getTestMethod().get().getName() + "\n\tCase: " + testInfo.getDisplayName(), e);
242  }
243 
244  }
245 
252  @DisplayName("Test Event - Enable/Disable value change notification")
253  @ParameterizedTest
254  @CsvSource({"true", "false"})
255  void testEventNotification(boolean notifyChange, TestInfo testInfo) {
256 
257  ObservedValue<Integer> observedValue = new ObservedValue<>(0);
259 
260  try {
261  assumeFalse(eventMethodInvoked, () -> "Event method already invoked");
262  observedValue.set(10, notifyChange);
263  assertEquals(notifyChange, eventMethodInvoked, () -> "Event method invoked");
264  } catch (Exception e) {
265  fail("Unexpected exception thrown in " + testInfo.getTestMethod().get().getName() + "\n\tCase: " + testInfo.getDisplayName(), e);
266  }
267 
268  }
269 
276  @DisplayName("Test Serialization - Boolean")
277  @ParameterizedTest
278  @CsvSource({"true", "false"})
279  void testSerialization(boolean expected, @TempDir Path tempDir) {
280 
281  ObservedValue<Boolean> observedValue = new ObservedValue<>(expected);
282  serialiceToTempFile(observedValue, fileName, tempDir);
283 
284  @SuppressWarnings("unchecked")
285  ObservedValue<Boolean> value = deserialiceFromTempFile(ObservedValue.class, fileName, tempDir);
286 
287  assertEquals(expected, value.get());
288 
289  }
290 
297  @DisplayName("Test Serialization - Byte")
298  @ParameterizedTest
299  @CsvSource({"65"})
300  void testSerialization(byte expected, @TempDir Path tempDir) {
301 
302  ObservedValue<Byte> observedValue = new ObservedValue<>(expected);
303  serialiceToTempFile(observedValue, fileName, tempDir);
304 
305  @SuppressWarnings("unchecked")
306  ObservedValue<Byte> value = deserialiceFromTempFile(ObservedValue.class, fileName, tempDir);
307 
308  assertEquals(expected, value.get());
309  }
310 
317  @DisplayName("Test Serialization - Char")
318  @ParameterizedTest
319  @CsvSource({"A", "T"})
320  void testSerialization(char expected, @TempDir Path tempDir) {
321 
322  ObservedValue<Character> observedValue = new ObservedValue<>(expected);
323  serialiceToTempFile(observedValue, fileName, tempDir);
324 
325  @SuppressWarnings("unchecked")
326  ObservedValue<Character> value = deserialiceFromTempFile(ObservedValue.class, fileName, tempDir);
327 
328  assertEquals(expected, value.get());
329 
330  }
331 
338  @DisplayName("Test Serialization - Short")
339  @ParameterizedTest
340  @CsvSource({"65"})
341  void testSerialization(short expected, @TempDir Path tempDir) {
342 
343  ObservedValue<Short> observedValue = new ObservedValue<>(expected);
344  serialiceToTempFile(observedValue, fileName, tempDir);
345 
346  @SuppressWarnings("unchecked")
347  ObservedValue<Short> value = deserialiceFromTempFile(ObservedValue.class, fileName, tempDir);
348 
349  assertEquals(expected, value.get());
350 
351  }
352 
359  @DisplayName("Test Serialization - Int")
360  @ParameterizedTest
361  @CsvSource({"65"})
362  void testSerialization(int expected, @TempDir Path tempDir) {
363 
364  ObservedValue<Integer> observedValue = new ObservedValue<>(expected);
365  serialiceToTempFile(observedValue, fileName, tempDir);
366 
367  @SuppressWarnings("unchecked")
368  ObservedValue<Integer> value = deserialiceFromTempFile(ObservedValue.class, fileName, tempDir);
369 
370  assertEquals(expected, value.get());
371 
372  }
373 
380  @DisplayName("Test Serialization - Long")
381  @ParameterizedTest
382  @CsvSource({"65"})
383  void testSerialization(long expected, @TempDir Path tempDir) {
384 
385  ObservedValue<Long> observedValue = new ObservedValue<>(expected);
386  serialiceToTempFile(observedValue, fileName, tempDir);
387 
388  @SuppressWarnings("unchecked")
389  ObservedValue<Long> value = deserialiceFromTempFile(ObservedValue.class, fileName, tempDir);
390 
391  assertEquals(expected, value.get());
392 
393  }
394 
401  @DisplayName("Test Serialization - Float")
402  @ParameterizedTest
403  @CsvSource({"65f"})
404  void testSerialization(float expected, @TempDir Path tempDir) {
405 
406  ObservedValue<Float> observedValue = new ObservedValue<>(expected);
407  serialiceToTempFile(observedValue, fileName, tempDir);
408 
409  @SuppressWarnings("unchecked")
410  ObservedValue<Float> value = deserialiceFromTempFile(ObservedValue.class, fileName, tempDir);
411 
412  assertEquals(expected, value.get());
413 
414  }
415 
422  @DisplayName("Test Serialization - Double")
423  @ParameterizedTest
424  @CsvSource({"65.55"})
425  void testSerialization(double expected, @TempDir Path tempDir) {
426 
427  ObservedValue<Double> observedValue = new ObservedValue<>(expected);
428  serialiceToTempFile(observedValue, fileName, tempDir);
429 
430  @SuppressWarnings("unchecked")
431  ObservedValue<Double> value = deserialiceFromTempFile(ObservedValue.class, fileName, tempDir);
432 
433  assertEquals(expected, value.get());
434 
435  }
436 
443  @DisplayName("Test Serialization - String")
444  @ParameterizedTest
445  @CsvSource({"Test of string", "Another test"})
446  void testSerialization(String expected, @TempDir Path tempDir) {
447 
448  ObservedValue<String> observedValue = new ObservedValue<>(expected);
449  serialiceToTempFile(observedValue, fileName, tempDir);
450 
451  @SuppressWarnings("unchecked")
452  ObservedValue<String> value = deserialiceFromTempFile(ObservedValue.class, fileName, tempDir);
453 
454  assertEquals(expected, value.get());
455 
456  }
457 
465  @DisplayName("Test Serialization - Object")
466  @ParameterizedTest
467  @CsvSource({"Paco, 44", "Lola, 41"})
468  void testSerialization(String name, int age, @TempDir Path tempDir) {
469 
470  PersonObject expectedTestClass = new PersonObject(name, age);
471  ObservedValue<PersonObject> observedValue = new ObservedValue<>(expectedTestClass);
472  serialiceToTempFile(observedValue, fileName, tempDir);
473 
474  @SuppressWarnings("unchecked")
475  ObservedValue<PersonObject> value = deserialiceFromTempFile(ObservedValue.class, fileName, tempDir);
476 
477  assertEquals(expectedTestClass, value.get());
478 
479  }
480 
487  @DisplayName("Test Serialization - Array of int")
488  @ParameterizedTest
489  @ArraySources(arrays = {
490  @ArraySource(array = {1, 2, 3, 4, 5, 6}),
491  @ArraySource(array = {21, 34, 68}),
492  @ArraySource(array = {72, 84, 78})
493  })
494  void testSerialization(int[] expected, @TempDir Path tempDir) {
495 
496  ObservedValue<int[]> observedValue = new ObservedValue<>(expected);
497  serialiceToTempFile(observedValue, fileName, tempDir);
498 
499  @SuppressWarnings("unchecked")
500  ObservedValue<int[]> value = deserialiceFromTempFile(ObservedValue.class, fileName, tempDir);
501 
502  assertTrue(Arrays.equals(expected, value.get()));
503 
504  }
505 
512  private static <T> void valueChangedTest(T oldValue, T newValue) {
513  eventMethodInvoked = true;
514  LOGGER.debug("Value changed event metod called. [oldValue: " + oldValue + ", newValue: " + newValue + "]");
515  }
516 
524  private <T extends Serializable> void serialiceToTempFile(T value, String fileName, Path tempDir) {
525 
526  assumeTrue(tempDir != null);
527  assumeTrue(fileName != null && !fileName.trim().isEmpty());
528 
529  File file = tempDir.resolve(fileName).toFile();
530  try {
531  FileOutputStream fileOutputStream = new FileOutputStream(file);
532  try(ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream)) {
533  objectOutputStream.writeObject(value);
534  objectOutputStream.flush();
535  }
536  } catch (Exception e) {
537  assumeNoException(e);
538  }
539 
540  }
541 
550  private <T> T deserialiceFromTempFile(Class<T> cls, String fileName, Path tempDir) {
551 
552  assumeTrue(tempDir != null);
553  assumeTrue(fileName != null && !fileName.trim().isEmpty());
554 
555  File file = tempDir.resolve(fileName).toFile();
556  T value = null;
557  try {
558  FileInputStream fileInputStream = new FileInputStream(file);
559  try(ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream)) {
560  value = convertInstanceOfObject(objectInputStream.readObject(), cls);
561  }
562  } catch (Exception e) {
563  assumeNoException(e);
564  }
565 
566  return value;
567  }
568 
576  private <T> T convertInstanceOfObject(Object obj, Class<T> cls) {
577  try {
578  return cls.cast(obj);
579  } catch(ClassCastException e) {
580  return null;
581  }
582  }
583 
584 }
Class that wraps a value and gives the utility of registering listeners that will be called after any...
private< T > T deserialiceFromTempFile(Class< T > cls, String fileName, Path tempDir)
Method for deserialization from a temp file.
void testEventMethodValueChange(String name, String newName, int age)
Test for notify a change in the name of the input person object.
void testSerialization(String expected, @TempDir Path tempDir)
Test of the serialization of a string.
private< T extends Serializable > void serialiceToTempFile(T value, String fileName, Path tempDir)
Method for serialization to temp file.
void testSerialization(double expected, @TempDir Path tempDir)
Test of the serialization of a double.
void testSerialization(long expected, @TempDir Path tempDir)
Test of the serialization of a long.
void testEventMethodInvocation(String name, String newName, int age)
Test for notify a change in the name of the input person object.
void testSerialization(boolean expected, @TempDir Path tempDir)
Test of the serialization of a boolean.
void testSerialization(int[] expected, @TempDir Path tempDir)
Test of the serialization of a array of integers.
void unregisterAllListeners()
Removes all the listeners from the list of the registered listeners.
static< T > void valueChangedTest(T oldValue, T newValue)
Method for values changes.
void onNameChanged(BiConsumer< String, String > consumer)
void testUnregisterEvent(int value, TestInfo testInfo)
Test for a unregister event.
private< T > T convertInstanceOfObject(Object obj, Class< T > cls)
Method for convert a instance of a object.
void testUnregisterAllEvents(int value, TestInfo testInfo)
Test for a unregister all events.
void testEventNotification(boolean notifyChange, TestInfo testInfo)
Test of enable/disable of value change notification.
void testSerialization(byte expected, @TempDir Path tempDir)
Test of the serialization of a byte.
The TimingExtension class implements the BeforeTestExecutionCallback and the AfterTestExecutionCallba...
void testSerialization(short expected, @TempDir Path tempDir)
Test of the serialization of a short.
T registerListener(T listener)
Adds the specified listener to the list of registered listeners.
void testSerialization(float expected, @TempDir Path tempDir)
Test of the serialization of a float.
void unregisterListener(T listener)
Removes the first occurrence of the specified listener from the list of the registered listeners.
void testEventMethodInvocation(int expected, int value, TestInfo testInfo)
Test for notify a change in the input integer value.
The listener interface for receiving value change events.
void testEventMethodNotInvoqued(int value, TestInfo testInfo)
Test for a event not fired.
void testSerialization(String name, int age, @TempDir Path tempDir)
Test of the serialization of a object.
void testSerialization(int expected, @TempDir Path tempDir)
Test of the serialization of a int.
void testSerialization(char expected, @TempDir Path tempDir)
Test of the serialization of a char.
void set(T value)
Changes the value with the new given one, and notifies all the registered listeners of the change.
T get()
Returns the value that is being observed.