6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package com.sun.javafx.binding;
27
28 import javafx.beans.InvalidationListener;
29 import javafx.beans.InvalidationListenerMock;
30 import javafx.beans.Observable;
31 import javafx.beans.WeakInvalidationListenerMock;
32 import javafx.beans.value.ChangeListener;
33 import javafx.beans.value.ChangeListenerMock;
34 import javafx.beans.value.ObservableValue;
35 import javafx.beans.value.ObservableValueStub;
36 import javafx.beans.value.WeakChangeListenerMock;
37 import org.junit.Before;
38 import org.junit.Test;
39
40 import java.util.BitSet;
41 import java.util.concurrent.atomic.AtomicBoolean;
42 import java.util.concurrent.atomic.AtomicInteger;
43
44 import static org.junit.Assert.assertEquals;
45 import static org.junit.Assert.assertTrue;
46
47 public class ExpressionHelperTest {
48
49 private static final Object UNDEFINED = new Object();
50 private static final Object DATA_1 = new Object();
51 private static final Object DATA_2 = new Object();
52
53 private ExpressionHelper helper;
54 private ObservableValueStub observable;
55 private InvalidationListenerMock[] invalidationListener;
56 private ChangeListenerMock<Object>[] changeListener;
503 changeListener[0].check(observable, DATA_1, null, 1);
504
505 ExpressionHelper.fireValueChangedEvent(helper);
506 invalidationListener[0].check(observable, 1);
507 changeListener[0].check(null, UNDEFINED, UNDEFINED, 0);
508
509 observable.set(DATA_1);
510 ExpressionHelper.fireValueChangedEvent(helper);
511 invalidationListener[0].check(observable, 1);
512 changeListener[0].check(observable, null, DATA_1, 1);
513
514 ExpressionHelper.fireValueChangedEvent(helper);
515 invalidationListener[0].check(observable, 1);
516 changeListener[0].check(null, UNDEFINED, UNDEFINED, 0);
517 }
518
519 @Test
520 public void testExceptionNotPropagatedFromSingleInvalidation() {
521 helper = ExpressionHelper.addListener(helper, observable,(o) -> {throw new RuntimeException();});
522 observable.set(null);
523 helper.fireValueChangedEvent();
524 }
525
526 @Test
527 public void testExceptionNotPropagatedFromMultipleInvalidation() {
528 BitSet called = new BitSet();
529
530 helper = ExpressionHelper.addListener(helper, observable, (o) -> {called.set(0); throw new RuntimeException();});
531 helper = ExpressionHelper.addListener(helper, observable, (o) -> {called.set(1); throw new RuntimeException();});
532 observable.set(null);
533 helper.fireValueChangedEvent();
534
535 assertTrue(called.get(0));
536 assertTrue(called.get(1));
537 }
538
539 @Test
540 public void testExceptionNotPropagatedFromSingleChange() {
541 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> {throw new RuntimeException();});
542 observable.set(null);
543 helper.fireValueChangedEvent();
544 }
545
546 @Test
547 public void testExceptionNotPropagatedFromMultipleChange() {
548 BitSet called = new BitSet();
549
550 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> {called.set(0); throw new RuntimeException();});
551 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> {called.set(1); throw new RuntimeException();});
552 observable.set(null);
553 helper.fireValueChangedEvent();
554
555 assertTrue(called.get(0));
556 assertTrue(called.get(1));
557 }
558
559 @Test
560 public void testExceptionNotPropagatedFromMultipleChangeAndInvalidation() {
561 BitSet called = new BitSet();
562
563 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> {called.set(0); throw new RuntimeException();});
564 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> {called.set(1); throw new RuntimeException();});
565 helper = ExpressionHelper.addListener(helper, observable, (o) -> {called.set(2); throw new RuntimeException();});
566 helper = ExpressionHelper.addListener(helper, observable, (o) -> {called.set(3); throw new RuntimeException();});
567 observable.set(null);
568 helper.fireValueChangedEvent();
569
570 assertTrue(called.get(0));
571 assertTrue(called.get(1));
572 assertTrue(called.get(2));
573 assertTrue(called.get(3));
574 }
575
576 @Test
577 public void testExceptionHandledByThreadUncaughtHandlerInSingleInvalidation() {
578 AtomicBoolean called = new AtomicBoolean(false);
579
580 Thread.currentThread().setUncaughtExceptionHandler((t, e) -> called.set(true));
581
582 helper = ExpressionHelper.addListener(helper, observable,(o) -> {throw new RuntimeException();});
583 observable.set(null);
584 helper.fireValueChangedEvent();
585
586 assertTrue(called.get());
587 }
588
589
590 @Test
591 public void testExceptionHandledByThreadUncaughtHandlerInMultipleInvalidation() {
592 AtomicInteger called = new AtomicInteger(0);
593
594 Thread.currentThread().setUncaughtExceptionHandler((t, e) -> called.incrementAndGet());
595
596 helper = ExpressionHelper.addListener(helper, observable, (o) -> {throw new RuntimeException();});
597 helper = ExpressionHelper.addListener(helper, observable, (o) -> {throw new RuntimeException();});
598 observable.set(null);
599 helper.fireValueChangedEvent();
600
601 assertEquals(2, called.get());
602 }
603
604 @Test
605 public void testExceptionHandledByThreadUncaughtHandlerInSingleChange() {
606 AtomicBoolean called = new AtomicBoolean(false);
607
608 Thread.currentThread().setUncaughtExceptionHandler((t, e) -> called.set(true));
609 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> {throw new RuntimeException();});
610 observable.set(null);
611 helper.fireValueChangedEvent();
612
613 assertTrue(called.get());
614 }
615
616 @Test
617 public void testExceptionHandledByThreadUncaughtHandlerInMultipleChange() {
618 AtomicInteger called = new AtomicInteger(0);
619
620 Thread.currentThread().setUncaughtExceptionHandler((t, e) -> called.incrementAndGet());
621
622 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> {throw new RuntimeException();});
623 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> {throw new RuntimeException();});
624 observable.set(null);
625 helper.fireValueChangedEvent();
626
627 assertEquals(2, called.get());
628 }
629
630 @Test
631 public void testExceptionHandledByThreadUncaughtHandlerInMultipleChangeAndInvalidation() {
632 AtomicInteger called = new AtomicInteger(0);
633
634 Thread.currentThread().setUncaughtExceptionHandler((t, e) -> called.incrementAndGet());
635
636 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> { throw new RuntimeException();});
637 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> { throw new RuntimeException();});
638 helper = ExpressionHelper.addListener(helper, observable, (o) -> { throw new RuntimeException();});
639 helper = ExpressionHelper.addListener(helper, observable, (o) -> {throw new RuntimeException();});
640 observable.set(null);
641 helper.fireValueChangedEvent();
642
643 assertEquals(4, called.get());
644 }
645
646 }
|
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package test.com.sun.javafx.binding;
27
28 import com.sun.javafx.binding.ExpressionHelper;
29 import com.sun.javafx.binding.ExpressionHelperShim;
30 import javafx.beans.InvalidationListener;
31 import test.javafx.beans.InvalidationListenerMock;
32 import javafx.beans.Observable;
33 import test.javafx.beans.WeakInvalidationListenerMock;
34 import javafx.beans.value.ChangeListener;
35 import test.javafx.beans.value.ChangeListenerMock;
36 import javafx.beans.value.ObservableValue;
37 import javafx.beans.value.ObservableValueStub;
38 import test.javafx.beans.value.WeakChangeListenerMock;
39 import org.junit.Before;
40 import org.junit.Test;
41
42 import java.util.BitSet;
43 import java.util.concurrent.atomic.AtomicBoolean;
44 import java.util.concurrent.atomic.AtomicInteger;
45
46 import static org.junit.Assert.assertEquals;
47 import static org.junit.Assert.assertTrue;
48
49 public class ExpressionHelperTest {
50
51 private static final Object UNDEFINED = new Object();
52 private static final Object DATA_1 = new Object();
53 private static final Object DATA_2 = new Object();
54
55 private ExpressionHelper helper;
56 private ObservableValueStub observable;
57 private InvalidationListenerMock[] invalidationListener;
58 private ChangeListenerMock<Object>[] changeListener;
505 changeListener[0].check(observable, DATA_1, null, 1);
506
507 ExpressionHelper.fireValueChangedEvent(helper);
508 invalidationListener[0].check(observable, 1);
509 changeListener[0].check(null, UNDEFINED, UNDEFINED, 0);
510
511 observable.set(DATA_1);
512 ExpressionHelper.fireValueChangedEvent(helper);
513 invalidationListener[0].check(observable, 1);
514 changeListener[0].check(observable, null, DATA_1, 1);
515
516 ExpressionHelper.fireValueChangedEvent(helper);
517 invalidationListener[0].check(observable, 1);
518 changeListener[0].check(null, UNDEFINED, UNDEFINED, 0);
519 }
520
521 @Test
522 public void testExceptionNotPropagatedFromSingleInvalidation() {
523 helper = ExpressionHelper.addListener(helper, observable,(o) -> {throw new RuntimeException();});
524 observable.set(null);
525 ExpressionHelperShim.fireValueChangedEvent(helper);
526 }
527
528 @Test
529 public void testExceptionNotPropagatedFromMultipleInvalidation() {
530 BitSet called = new BitSet();
531
532 helper = ExpressionHelper.addListener(helper, observable, (o) -> {called.set(0); throw new RuntimeException();});
533 helper = ExpressionHelper.addListener(helper, observable, (o) -> {called.set(1); throw new RuntimeException();});
534 observable.set(null);
535 ExpressionHelperShim.fireValueChangedEvent(helper);
536
537 assertTrue(called.get(0));
538 assertTrue(called.get(1));
539 }
540
541 @Test
542 public void testExceptionNotPropagatedFromSingleChange() {
543 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> {throw new RuntimeException();});
544 observable.set(null);
545 ExpressionHelperShim.fireValueChangedEvent(helper);
546 }
547
548 @Test
549 public void testExceptionNotPropagatedFromMultipleChange() {
550 BitSet called = new BitSet();
551
552 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> {called.set(0); throw new RuntimeException();});
553 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> {called.set(1); throw new RuntimeException();});
554 observable.set(null);
555 ExpressionHelperShim.fireValueChangedEvent(helper);
556
557 assertTrue(called.get(0));
558 assertTrue(called.get(1));
559 }
560
561 @Test
562 public void testExceptionNotPropagatedFromMultipleChangeAndInvalidation() {
563 BitSet called = new BitSet();
564
565 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> {called.set(0); throw new RuntimeException();});
566 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> {called.set(1); throw new RuntimeException();});
567 helper = ExpressionHelper.addListener(helper, observable, (o) -> {called.set(2); throw new RuntimeException();});
568 helper = ExpressionHelper.addListener(helper, observable, (o) -> {called.set(3); throw new RuntimeException();});
569 observable.set(null);
570 ExpressionHelperShim.fireValueChangedEvent(helper);
571
572 assertTrue(called.get(0));
573 assertTrue(called.get(1));
574 assertTrue(called.get(2));
575 assertTrue(called.get(3));
576 }
577
578 @Test
579 public void testExceptionHandledByThreadUncaughtHandlerInSingleInvalidation() {
580 AtomicBoolean called = new AtomicBoolean(false);
581
582 Thread.currentThread().setUncaughtExceptionHandler((t, e) -> called.set(true));
583
584 helper = ExpressionHelper.addListener(helper, observable,(o) -> {throw new RuntimeException();});
585 observable.set(null);
586 ExpressionHelperShim.fireValueChangedEvent(helper);
587
588 assertTrue(called.get());
589 }
590
591
592 @Test
593 public void testExceptionHandledByThreadUncaughtHandlerInMultipleInvalidation() {
594 AtomicInteger called = new AtomicInteger(0);
595
596 Thread.currentThread().setUncaughtExceptionHandler((t, e) -> called.incrementAndGet());
597
598 helper = ExpressionHelper.addListener(helper, observable, (o) -> {throw new RuntimeException();});
599 helper = ExpressionHelper.addListener(helper, observable, (o) -> {throw new RuntimeException();});
600 observable.set(null);
601 ExpressionHelperShim.fireValueChangedEvent(helper);
602
603 assertEquals(2, called.get());
604 }
605
606 @Test
607 public void testExceptionHandledByThreadUncaughtHandlerInSingleChange() {
608 AtomicBoolean called = new AtomicBoolean(false);
609
610 Thread.currentThread().setUncaughtExceptionHandler((t, e) -> called.set(true));
611 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> {throw new RuntimeException();});
612 observable.set(null);
613 ExpressionHelperShim.fireValueChangedEvent(helper);
614
615 assertTrue(called.get());
616 }
617
618 @Test
619 public void testExceptionHandledByThreadUncaughtHandlerInMultipleChange() {
620 AtomicInteger called = new AtomicInteger(0);
621
622 Thread.currentThread().setUncaughtExceptionHandler((t, e) -> called.incrementAndGet());
623
624 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> {throw new RuntimeException();});
625 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> {throw new RuntimeException();});
626 observable.set(null);
627 ExpressionHelperShim.fireValueChangedEvent(helper);
628
629 assertEquals(2, called.get());
630 }
631
632 @Test
633 public void testExceptionHandledByThreadUncaughtHandlerInMultipleChangeAndInvalidation() {
634 AtomicInteger called = new AtomicInteger(0);
635
636 Thread.currentThread().setUncaughtExceptionHandler((t, e) -> called.incrementAndGet());
637
638 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> { throw new RuntimeException();});
639 helper = ExpressionHelper.addListener(helper, observable, (value, o1, o2) -> { throw new RuntimeException();});
640 helper = ExpressionHelper.addListener(helper, observable, (o) -> { throw new RuntimeException();});
641 helper = ExpressionHelper.addListener(helper, observable, (o) -> {throw new RuntimeException();});
642 observable.set(null);
643 ExpressionHelperShim.fireValueChangedEvent(helper);
644
645 assertEquals(4, called.get());
646 }
647
648 }
|