1 /*
   2  * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   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 javafx.binding;
  27 
  28 import javafx.beans.binding.*;
  29 import javafx.beans.property.IntegerProperty;
  30 import javafx.beans.property.ListProperty;
  31 import javafx.beans.property.SimpleIntegerProperty;
  32 import javafx.beans.property.SimpleListProperty;
  33 import javafx.collections.FXCollections;
  34 import javafx.collections.ObservableList;
  35 import com.sun.javafx.binding.ErrorLoggingUtiltity;
  36 import org.junit.AfterClass;
  37 import org.junit.Before;
  38 import org.junit.BeforeClass;
  39 import org.junit.Test;
  40 
  41 import static org.junit.Assert.*;
  42 
  43 /**
  44  */
  45 public class BindingsListTest {
  46 
  47     private static final double EPSILON_DOUBLE = 1e-12;
  48     private static final float EPSILON_FLOAT = 1e-5f;
  49 
  50     private static final Object data1 = new Object();
  51     private static final Object data2 = new Object();
  52 
  53     private static final ErrorLoggingUtiltity log = new ErrorLoggingUtiltity();
  54 
  55     private ListProperty<Object> property;
  56     private ObservableList<Object> list1;
  57     private ObservableList<Object> list2;
  58     private IntegerProperty index;
  59 
  60     @BeforeClass
  61     public static void setUpClass() {
  62         log.start();
  63     }
  64 
  65     @AfterClass
  66     public static void tearDownClass() {
  67         log.stop();
  68     }
  69 
  70     @Before
  71     public void setUp() {
  72         property = new SimpleListProperty<Object>();
  73         list1 = FXCollections.<Object>observableArrayList(data1, data2);
  74         list2 = FXCollections.<Object>observableArrayList();
  75         index = new SimpleIntegerProperty();
  76     }
  77 
  78     @Test
  79     public void testSize() {
  80         final IntegerBinding size = Bindings.size(property);
  81         DependencyUtils.checkDependencies(size.getDependencies(), property);
  82 
  83         assertEquals(0, size.get());
  84         property.set(list1);
  85         assertEquals(2, size.get());
  86         list1.remove(data2);
  87         assertEquals(1, size.get());
  88         property.set(list2);
  89         assertEquals(0, size.get());
  90         property.addAll(data2, data2);
  91         assertEquals(2, size.get());
  92         property.set(null);
  93         assertEquals(0, size.get());
  94     }
  95 
  96     @Test(expected = NullPointerException.class)
  97     public void testSize_Null() {
  98         Bindings.size((ObservableList<Object>) null);
  99     }
 100 
 101     @Test
 102     public void testIsEmpty() {
 103         final BooleanBinding empty = Bindings.isEmpty(property);
 104         DependencyUtils.checkDependencies(empty.getDependencies(), property);
 105 
 106         assertTrue(empty.get());
 107         property.set(list1);
 108         assertFalse(empty.get());
 109         list1.remove(data2);
 110         assertFalse(empty.get());
 111         property.set(list2);
 112         assertTrue(empty.get());
 113         property.addAll(data2, data2);
 114         assertFalse(empty.get());
 115         property.set(null);
 116         assertTrue(empty.get());
 117     }
 118 
 119     @Test(expected = NullPointerException.class)
 120     public void testIsEmpty_Null() {
 121         Bindings.isEmpty((ObservableList<Object>) null);
 122     }
 123 
 124     @Test
 125     public void testIsNotEmpty() {
 126         final BooleanBinding notEmpty = Bindings.isNotEmpty(property);
 127         DependencyUtils.checkDependencies(notEmpty.getDependencies(), property);
 128 
 129         assertFalse(notEmpty.get());
 130         property.set(list1);
 131         assertTrue(notEmpty.get());
 132         list1.remove(data2);
 133         assertTrue(notEmpty.get());
 134         property.set(list2);
 135         assertFalse(notEmpty.get());
 136         property.addAll(data2, data2);
 137         assertTrue(notEmpty.get());
 138         property.set(null);
 139         assertFalse(notEmpty.get());
 140     }
 141 
 142     @Test(expected = NullPointerException.class)
 143     public void testIsNotEmpty_Null() {
 144         Bindings.isNotEmpty((ObservableList<Object>) null);
 145     }
 146 
 147     @Test
 148     public void testValueAt_Constant() {
 149         final ObjectBinding<Object> binding0 = Bindings.valueAt(property, 0);
 150         final ObjectBinding<Object> binding1 = Bindings.valueAt(property, 1);
 151         final ObjectBinding<Object> binding2 = Bindings.valueAt(property, 2);
 152         DependencyUtils.checkDependencies(binding0.getDependencies(), property);
 153         DependencyUtils.checkDependencies(binding1.getDependencies(), property);
 154         DependencyUtils.checkDependencies(binding2.getDependencies(), property);
 155         assertNull(binding0.get());
 156         log.checkFine(IndexOutOfBoundsException.class);
 157         assertNull(binding1.get());
 158         log.checkFine(IndexOutOfBoundsException.class);
 159         assertNull(binding2.get());
 160         log.checkFine(IndexOutOfBoundsException.class);
 161 
 162         property.set(list1);
 163         assertEquals(data1, binding0.get());
 164         assertEquals(data2, binding1.get());
 165         assertNull(binding2.get());
 166         log.checkFine(IndexOutOfBoundsException.class);
 167 
 168         property.remove(data2);
 169         assertEquals(data1, binding0.get());
 170         assertNull(binding1.get());
 171         log.checkFine(IndexOutOfBoundsException.class);
 172         assertNull(binding2.get());
 173         log.checkFine(IndexOutOfBoundsException.class);
 174 
 175         property.set(list2);
 176         assertNull(binding0.get());
 177         log.checkFine(IndexOutOfBoundsException.class);
 178         assertNull(binding1.get());
 179         log.checkFine(IndexOutOfBoundsException.class);
 180         assertNull(binding2.get());
 181         log.checkFine(IndexOutOfBoundsException.class);
 182 
 183         property.addAll(data2, data2);
 184         assertEquals(data2, binding0.get());
 185         assertEquals(data2, binding1.get());
 186         assertNull(binding2.get());
 187         log.checkFine(IndexOutOfBoundsException.class);
 188 
 189         property.set(null);
 190         assertNull(binding0.get());
 191         log.checkFine(IndexOutOfBoundsException.class);
 192         assertNull(binding1.get());
 193         log.checkFine(IndexOutOfBoundsException.class);
 194         assertNull(binding2.get());
 195         log.checkFine(IndexOutOfBoundsException.class);
 196     }
 197 
 198     @Test(expected = NullPointerException.class)
 199     public void testValueAt_Constant_Null() {
 200         Bindings.valueAt(null, 0);
 201     }
 202 
 203     @Test(expected = IllegalArgumentException.class)
 204     public void testValueAt_Constant_NegativeIndex() {
 205         Bindings.valueAt(property, -1);
 206     }
 207 
 208     @Test
 209     public void testValueAt_Variable() {
 210         final ObjectBinding<Object> binding = Bindings.valueAt(property, index);
 211         DependencyUtils.checkDependencies(binding.getDependencies(), property, index);
 212 
 213         index.set(-1);
 214         assertNull(binding.get());
 215         log.checkFine(IndexOutOfBoundsException.class);
 216         index.set(0);
 217         assertNull(binding.get());
 218         log.checkFine(IndexOutOfBoundsException.class);
 219 
 220         property.set(list1);
 221         index.set(-1);
 222         assertNull(binding.get());
 223         log.checkFine(ArrayIndexOutOfBoundsException.class);
 224         index.set(0);
 225         assertEquals(data1, binding.get());
 226         index.set(1);
 227         assertEquals(data2, binding.get());
 228         index.set(2);
 229         assertNull(binding.get());
 230         log.checkFine(IndexOutOfBoundsException.class);
 231 
 232         property.remove(data2);
 233         index.set(-1);
 234         assertNull(binding.get());
 235         log.checkFine(ArrayIndexOutOfBoundsException.class);
 236         index.set(0);
 237         assertEquals(data1, binding.get());
 238         index.set(1);
 239         assertNull(binding.get());
 240         log.checkFine(IndexOutOfBoundsException.class);
 241 
 242         property.set(list2);
 243         index.set(-1);
 244         assertNull(binding.get());
 245         log.checkFine(ArrayIndexOutOfBoundsException.class);
 246         index.set(0);
 247         assertNull(binding.get());
 248         log.checkFine(IndexOutOfBoundsException.class);
 249 
 250         property.addAll(data2, data2);
 251         index.set(-1);
 252         assertNull(binding.get());
 253         log.checkFine(ArrayIndexOutOfBoundsException.class);
 254         index.set(0);
 255         assertEquals(data2, binding.get());
 256         index.set(1);
 257         assertEquals(data2, binding.get());
 258         index.set(2);
 259         assertNull(binding.get());
 260         log.checkFine(IndexOutOfBoundsException.class);
 261 
 262         property.set(null);
 263         index.set(-1);
 264         assertNull(binding.get());
 265         log.checkFine(IndexOutOfBoundsException.class);
 266         index.set(0);
 267         assertNull(binding.get());
 268         log.checkFine(IndexOutOfBoundsException.class);
 269     }
 270 
 271     @Test(expected = NullPointerException.class)
 272     public void testValueAt_Variable_Null() {
 273         Bindings.valueAt((ObservableList<Object>)null, index);
 274     }
 275 
 276     @Test(expected = NullPointerException.class)
 277     public void testValueAt_Variable_NullIndex() {
 278         Bindings.valueAt(property, null);
 279     }
 280 
 281     @Test
 282     public void testBooleanValueAt_Constant() {
 283         final boolean defaultData = false;
 284         final boolean localData1 = false;
 285         final boolean localData2 = true;
 286         final ListProperty<Boolean> localProperty = new SimpleListProperty<Boolean>();
 287         final ObservableList<Boolean> localList1 = FXCollections.observableArrayList(localData1, localData2);
 288         final ObservableList<Boolean> localList2 = FXCollections.observableArrayList();
 289 
 290         final BooleanBinding binding0 = Bindings.booleanValueAt(localProperty, 0);
 291         final BooleanBinding binding1 = Bindings.booleanValueAt(localProperty, 1);
 292         final BooleanBinding binding2 = Bindings.booleanValueAt(localProperty, 2);
 293         DependencyUtils.checkDependencies(binding0.getDependencies(), localProperty);
 294         DependencyUtils.checkDependencies(binding1.getDependencies(), localProperty);
 295         DependencyUtils.checkDependencies(binding2.getDependencies(), localProperty);
 296         assertEquals(defaultData, binding0.get());
 297         log.checkFine(IndexOutOfBoundsException.class);
 298         assertEquals(defaultData, binding1.get());
 299         log.checkFine(IndexOutOfBoundsException.class);
 300         assertEquals(defaultData, binding2.get());
 301         log.checkFine(IndexOutOfBoundsException.class);
 302 
 303         localProperty.set(localList1);
 304         assertEquals(localData1, binding0.get());
 305         assertEquals(localData2, binding1.get());
 306         assertEquals(defaultData, binding2.get());
 307         log.checkFine(IndexOutOfBoundsException.class);
 308 
 309         localProperty.remove(1);
 310         assertEquals(localData1, binding0.get());
 311         assertEquals(defaultData, binding1.get());
 312         log.checkFine(IndexOutOfBoundsException.class);
 313         assertEquals(defaultData, binding2.get());
 314         log.checkFine(IndexOutOfBoundsException.class);
 315 
 316         localProperty.set(localList2);
 317         assertEquals(defaultData, binding0.get());
 318         log.checkFine(IndexOutOfBoundsException.class);
 319         assertEquals(defaultData, binding1.get());
 320         log.checkFine(IndexOutOfBoundsException.class);
 321         assertEquals(defaultData, binding2.get());
 322         log.checkFine(IndexOutOfBoundsException.class);
 323 
 324         localProperty.addAll(localData2, localData2);
 325         assertEquals(localData2, binding0.get());
 326         assertEquals(localData2, binding1.get());
 327         assertEquals(defaultData, binding2.get());
 328         log.checkFine(IndexOutOfBoundsException.class);
 329 
 330         localProperty.set(null);
 331         assertEquals(defaultData, binding0.get());
 332         log.checkFine(IndexOutOfBoundsException.class);
 333         assertEquals(defaultData, binding1.get());
 334         log.checkFine(IndexOutOfBoundsException.class);
 335         assertEquals(defaultData, binding2.get());
 336         log.checkFine(IndexOutOfBoundsException.class);
 337     }
 338 
 339     @Test(expected = NullPointerException.class)
 340     public void testBooleanValueAt_Constant_Null() {
 341         Bindings.booleanValueAt(null, 0);
 342     }
 343 
 344     @Test(expected = IllegalArgumentException.class)
 345     public void testBooleanValueAt_Constant_NegativeIndex() {
 346         final ListProperty<Boolean> localProperty = new SimpleListProperty<Boolean>();
 347         Bindings.booleanValueAt(localProperty, -1);
 348     }
 349 
 350     @Test
 351     public void testBooleanValueAt_Variable() {
 352         final boolean defaultData = false;
 353         final boolean localData1 = false;
 354         final boolean localData2 = true;
 355         final ListProperty<Boolean> localProperty = new SimpleListProperty<Boolean>();
 356         final ObservableList<Boolean> localList1 = FXCollections.observableArrayList(localData1, localData2);
 357         final ObservableList<Boolean> localList2 = FXCollections.observableArrayList();
 358 
 359         final BooleanBinding binding = Bindings.booleanValueAt(localProperty, index);
 360         DependencyUtils.checkDependencies(binding.getDependencies(), localProperty, index);
 361 
 362         index.set(-1);
 363         assertEquals(defaultData, binding.get());
 364         log.checkFine(IndexOutOfBoundsException.class);
 365         index.set(0);
 366         assertEquals(defaultData, binding.get());
 367         log.checkFine(IndexOutOfBoundsException.class);
 368 
 369         localProperty.set(localList1);
 370         index.set(-1);
 371         assertEquals(defaultData, binding.get());
 372         log.checkFine(ArrayIndexOutOfBoundsException.class);
 373         index.set(0);
 374         assertEquals(localData1, binding.get());
 375         index.set(1);
 376         assertEquals(localData2, binding.get());
 377         index.set(2);
 378         assertEquals(defaultData, binding.get());
 379         log.checkFine(IndexOutOfBoundsException.class);
 380 
 381         localProperty.remove(1);
 382         index.set(-1);
 383         assertEquals(defaultData, binding.get());
 384         log.checkFine(ArrayIndexOutOfBoundsException.class);
 385         index.set(0);
 386         assertEquals(localData1, binding.get());
 387         index.set(1);
 388         assertEquals(defaultData, binding.get());
 389         log.checkFine(IndexOutOfBoundsException.class);
 390 
 391         localProperty.set(0, null);
 392         index.set(-1);
 393         assertEquals(defaultData, binding.get());
 394         log.checkFine(ArrayIndexOutOfBoundsException.class);
 395         index.set(0);
 396         assertEquals(defaultData, binding.get());
 397         log.checkFine(NullPointerException.class);
 398         index.set(1);
 399         assertEquals(defaultData, binding.get());
 400         log.checkFine(IndexOutOfBoundsException.class);
 401 
 402         localProperty.set(localList2);
 403         index.set(-1);
 404         assertEquals(defaultData, binding.get());
 405         log.checkFine(ArrayIndexOutOfBoundsException.class);
 406         index.set(0);
 407         assertEquals(defaultData, binding.get());
 408         log.checkFine(IndexOutOfBoundsException.class);
 409 
 410         localProperty.addAll(localData2, localData2);
 411         index.set(-1);
 412         assertEquals(defaultData, binding.get());
 413         log.checkFine(ArrayIndexOutOfBoundsException.class);
 414         index.set(0);
 415         assertEquals(localData2, binding.get());
 416         index.set(1);
 417         assertEquals(localData2, binding.get());
 418         index.set(2);
 419         assertEquals(defaultData, binding.get());
 420         log.checkFine(IndexOutOfBoundsException.class);
 421 
 422         localProperty.set(null);
 423         index.set(-1);
 424         assertEquals(defaultData, binding.get());
 425         log.checkFine(IndexOutOfBoundsException.class);
 426         index.set(0);
 427         assertEquals(defaultData, binding.get());
 428         log.checkFine(IndexOutOfBoundsException.class);
 429     }
 430 
 431     @Test(expected = NullPointerException.class)
 432     public void testBooleanValueAt_Variable_Null() {
 433         Bindings.booleanValueAt((ObservableList<Boolean>)null, index);
 434     }
 435 
 436     @Test(expected = NullPointerException.class)
 437     public void testBooleanValueAt_Variable_NullIndex() {
 438         final ListProperty<Boolean> localProperty = new SimpleListProperty<Boolean>();
 439         Bindings.booleanValueAt(localProperty, null);
 440     }
 441 
 442     @Test
 443     public void testDoubleValueAt_Constant() {
 444         final double defaultData = 0.0;
 445         final double localData1 = Math.PI;
 446         final double localData2 = -Math.E;
 447         final ListProperty<Double> localProperty = new SimpleListProperty<Double>();
 448         final ObservableList<Double> localList1 = FXCollections.observableArrayList(localData1, localData2);
 449         final ObservableList<Double> localList2 = FXCollections.observableArrayList();
 450 
 451         final DoubleBinding binding0 = Bindings.doubleValueAt(localProperty, 0);
 452         final DoubleBinding binding1 = Bindings.doubleValueAt(localProperty, 1);
 453         final DoubleBinding binding2 = Bindings.doubleValueAt(localProperty, 2);
 454         DependencyUtils.checkDependencies(binding0.getDependencies(), localProperty);
 455         DependencyUtils.checkDependencies(binding1.getDependencies(), localProperty);
 456         DependencyUtils.checkDependencies(binding2.getDependencies(), localProperty);
 457         assertEquals(defaultData, binding0.get(), EPSILON_DOUBLE);
 458         log.checkFine(IndexOutOfBoundsException.class);
 459         assertEquals(defaultData, binding1.get(), EPSILON_DOUBLE);
 460         log.checkFine(IndexOutOfBoundsException.class);
 461         assertEquals(defaultData, binding2.get(), EPSILON_DOUBLE);
 462         log.checkFine(IndexOutOfBoundsException.class);
 463 
 464         localProperty.set(localList1);
 465         assertEquals(localData1, binding0.get(), EPSILON_DOUBLE);
 466         assertEquals(localData2, binding1.get(), EPSILON_DOUBLE);
 467         assertEquals(defaultData, binding2.get(), EPSILON_DOUBLE);
 468         log.checkFine(IndexOutOfBoundsException.class);
 469 
 470         localProperty.remove(1);
 471         assertEquals(localData1, binding0.get(), EPSILON_DOUBLE);
 472         assertEquals(defaultData, binding1.get(), EPSILON_DOUBLE);
 473         log.checkFine(IndexOutOfBoundsException.class);
 474         assertEquals(defaultData, binding2.get(), EPSILON_DOUBLE);
 475         log.checkFine(IndexOutOfBoundsException.class);
 476 
 477         localProperty.set(localList2);
 478         assertEquals(defaultData, binding0.get(), EPSILON_DOUBLE);
 479         log.checkFine(IndexOutOfBoundsException.class);
 480         assertEquals(defaultData, binding1.get(), EPSILON_DOUBLE);
 481         log.checkFine(IndexOutOfBoundsException.class);
 482         assertEquals(defaultData, binding2.get(), EPSILON_DOUBLE);
 483         log.checkFine(IndexOutOfBoundsException.class);
 484 
 485         localProperty.addAll(localData2, localData2);
 486         assertEquals(localData2, binding0.get(), EPSILON_DOUBLE);
 487         assertEquals(localData2, binding1.get(), EPSILON_DOUBLE);
 488         assertEquals(defaultData, binding2.get(), EPSILON_DOUBLE);
 489         log.checkFine(IndexOutOfBoundsException.class);
 490 
 491         localProperty.set(null);
 492         assertEquals(defaultData, binding0.get(), EPSILON_DOUBLE);
 493         log.checkFine(IndexOutOfBoundsException.class);
 494         assertEquals(defaultData, binding1.get(), EPSILON_DOUBLE);
 495         log.checkFine(IndexOutOfBoundsException.class);
 496         assertEquals(defaultData, binding2.get(), EPSILON_DOUBLE);
 497         log.checkFine(IndexOutOfBoundsException.class);
 498     }
 499 
 500     @Test(expected = NullPointerException.class)
 501     public void testDoubleValueAt_Constant_Null() {
 502         Bindings.doubleValueAt(null, 0);
 503     }
 504 
 505     @Test(expected = IllegalArgumentException.class)
 506     public void testDoubleValueAt_Constant_NegativeIndex() {
 507         final ListProperty<Double> localProperty = new SimpleListProperty<Double>();
 508         Bindings.doubleValueAt(localProperty, -1);
 509     }
 510 
 511     @Test
 512     public void testDoubleValueAt_Variable() {
 513         final double defaultData = 0.0;
 514         final double localData1 = -Math.PI;
 515         final double localData2 = Math.E;
 516         final ListProperty<Double> localProperty = new SimpleListProperty<Double>();
 517         final ObservableList<Double> localList1 = FXCollections.observableArrayList(localData1, localData2);
 518         final ObservableList<Double> localList2 = FXCollections.observableArrayList();
 519 
 520         final DoubleBinding binding = Bindings.doubleValueAt(localProperty, index);
 521         DependencyUtils.checkDependencies(binding.getDependencies(), localProperty, index);
 522 
 523         index.set(-1);
 524         assertEquals(defaultData, binding.get(), EPSILON_DOUBLE);
 525         log.checkFine(IndexOutOfBoundsException.class);
 526         index.set(0);
 527         assertEquals(defaultData, binding.get(), EPSILON_DOUBLE);
 528         log.checkFine(IndexOutOfBoundsException.class);
 529 
 530         localProperty.set(localList1);
 531         index.set(-1);
 532         assertEquals(defaultData, binding.get(), EPSILON_DOUBLE);
 533         log.checkFine(ArrayIndexOutOfBoundsException.class);
 534         index.set(0);
 535         assertEquals(localData1, binding.get(), EPSILON_DOUBLE);
 536         index.set(1);
 537         assertEquals(localData2, binding.get(), EPSILON_DOUBLE);
 538         index.set(2);
 539         assertEquals(defaultData, binding.get(), EPSILON_DOUBLE);
 540         log.checkFine(IndexOutOfBoundsException.class);
 541 
 542         localProperty.remove(1);
 543         index.set(-1);
 544         assertEquals(defaultData, binding.get(), EPSILON_DOUBLE);
 545         log.checkFine(ArrayIndexOutOfBoundsException.class);
 546         index.set(0);
 547         assertEquals(localData1, binding.get(), EPSILON_DOUBLE);
 548         index.set(1);
 549         assertEquals(defaultData, binding.get(), EPSILON_DOUBLE);
 550         log.checkFine(IndexOutOfBoundsException.class);
 551 
 552         localProperty.set(0, null);
 553         index.set(-1);
 554         assertEquals(defaultData, binding.get(), EPSILON_DOUBLE);
 555         log.checkFine(ArrayIndexOutOfBoundsException.class);
 556         index.set(0);
 557         assertEquals(defaultData, binding.get(), EPSILON_DOUBLE);
 558         log.checkFine(NullPointerException.class);
 559         index.set(1);
 560         assertEquals(defaultData, binding.get(), EPSILON_DOUBLE);
 561         log.checkFine(IndexOutOfBoundsException.class);
 562 
 563         localProperty.set(localList2);
 564         index.set(-1);
 565         assertEquals(defaultData, binding.get(), EPSILON_DOUBLE);
 566         log.checkFine(ArrayIndexOutOfBoundsException.class);
 567         index.set(0);
 568         assertEquals(defaultData, binding.get(), EPSILON_DOUBLE);
 569         log.checkFine(IndexOutOfBoundsException.class);
 570 
 571         localProperty.addAll(localData2, localData2);
 572         index.set(-1);
 573         assertEquals(defaultData, binding.get(), EPSILON_DOUBLE);
 574         log.checkFine(ArrayIndexOutOfBoundsException.class);
 575         index.set(0);
 576         assertEquals(localData2, binding.get(), EPSILON_DOUBLE);
 577         index.set(1);
 578         assertEquals(localData2, binding.get(), EPSILON_DOUBLE);
 579         index.set(2);
 580         assertEquals(defaultData, binding.get(), EPSILON_DOUBLE);
 581         log.checkFine(IndexOutOfBoundsException.class);
 582 
 583         localProperty.set(null);
 584         index.set(-1);
 585         assertEquals(defaultData, binding.get(), EPSILON_DOUBLE);
 586         log.checkFine(IndexOutOfBoundsException.class);
 587         index.set(0);
 588         assertEquals(defaultData, binding.get(), EPSILON_DOUBLE);
 589         log.checkFine(IndexOutOfBoundsException.class);
 590     }
 591 
 592     @Test(expected = NullPointerException.class)
 593     public void testDoubleValueAt_Variable_Null() {
 594         Bindings.doubleValueAt((ObservableList<Double>)null, index);
 595     }
 596 
 597     @Test(expected = NullPointerException.class)
 598     public void testDoubleValueAt_Variable_NullIndex() {
 599         final ListProperty<Double> localProperty = new SimpleListProperty<Double>();
 600         Bindings.doubleValueAt(localProperty, null);
 601     }
 602 
 603     @Test
 604     public void testFloatValueAt_Constant() {
 605         final float defaultData = 0.0f;
 606         final float localData1 = (float)Math.PI;
 607         final float localData2 = (float)-Math.E;
 608         final ListProperty<Float> localProperty = new SimpleListProperty<Float>();
 609         final ObservableList<Float> localList1 = FXCollections.observableArrayList(localData1, localData2);
 610         final ObservableList<Float> localList2 = FXCollections.observableArrayList();
 611 
 612         final FloatBinding binding0 = Bindings.floatValueAt(localProperty, 0);
 613         final FloatBinding binding1 = Bindings.floatValueAt(localProperty, 1);
 614         final FloatBinding binding2 = Bindings.floatValueAt(localProperty, 2);
 615         DependencyUtils.checkDependencies(binding0.getDependencies(), localProperty);
 616         DependencyUtils.checkDependencies(binding1.getDependencies(), localProperty);
 617         DependencyUtils.checkDependencies(binding2.getDependencies(), localProperty);
 618         assertEquals(defaultData, binding0.get(), EPSILON_FLOAT);
 619         log.checkFine(IndexOutOfBoundsException.class);
 620         assertEquals(defaultData, binding1.get(), EPSILON_FLOAT);
 621         log.checkFine(IndexOutOfBoundsException.class);
 622         assertEquals(defaultData, binding2.get(), EPSILON_FLOAT);
 623         log.checkFine(IndexOutOfBoundsException.class);
 624 
 625         localProperty.set(localList1);
 626         assertEquals(localData1, binding0.get(), EPSILON_FLOAT);
 627         assertEquals(localData2, binding1.get(), EPSILON_FLOAT);
 628         assertEquals(defaultData, binding2.get(), EPSILON_FLOAT);
 629         log.checkFine(IndexOutOfBoundsException.class);
 630 
 631         localProperty.remove(1);
 632         assertEquals(localData1, binding0.get(), EPSILON_FLOAT);
 633         assertEquals(defaultData, binding1.get(), EPSILON_FLOAT);
 634         log.checkFine(IndexOutOfBoundsException.class);
 635         assertEquals(defaultData, binding2.get(), EPSILON_FLOAT);
 636         log.checkFine(IndexOutOfBoundsException.class);
 637 
 638         localProperty.set(localList2);
 639         assertEquals(defaultData, binding0.get(), EPSILON_FLOAT);
 640         log.checkFine(IndexOutOfBoundsException.class);
 641         assertEquals(defaultData, binding1.get(), EPSILON_FLOAT);
 642         log.checkFine(IndexOutOfBoundsException.class);
 643         assertEquals(defaultData, binding2.get(), EPSILON_FLOAT);
 644         log.checkFine(IndexOutOfBoundsException.class);
 645 
 646         localProperty.addAll(localData2, localData2);
 647         assertEquals(localData2, binding0.get(), EPSILON_FLOAT);
 648         assertEquals(localData2, binding1.get(), EPSILON_FLOAT);
 649         assertEquals(defaultData, binding2.get(), EPSILON_FLOAT);
 650         log.checkFine(IndexOutOfBoundsException.class);
 651 
 652         localProperty.set(null);
 653         assertEquals(defaultData, binding0.get(), EPSILON_FLOAT);
 654         log.checkFine(IndexOutOfBoundsException.class);
 655         assertEquals(defaultData, binding1.get(), EPSILON_FLOAT);
 656         log.checkFine(IndexOutOfBoundsException.class);
 657         assertEquals(defaultData, binding2.get(), EPSILON_FLOAT);
 658         log.checkFine(IndexOutOfBoundsException.class);
 659     }
 660 
 661     @Test(expected = NullPointerException.class)
 662     public void testFloatValueAt_Constant_Null() {
 663         Bindings.floatValueAt((ObservableList) null, 0);
 664     }
 665 
 666     @Test(expected = IllegalArgumentException.class)
 667     public void testFloatValueAt_Constant_NegativeIndex() {
 668         final ListProperty<Float> localProperty = new SimpleListProperty<Float>();
 669         Bindings.floatValueAt(localProperty, -1);
 670     }
 671 
 672     @Test
 673     public void testFloatValueAt_Variable() {
 674         final float defaultData = 0.0f;
 675         final float localData1 = (float)-Math.PI;
 676         final float localData2 = (float)Math.E;
 677         final ListProperty<Float> localProperty = new SimpleListProperty<Float>();
 678         final ObservableList<Float> localList1 = FXCollections.observableArrayList(localData1, localData2);
 679         final ObservableList<Float> localList2 = FXCollections.observableArrayList();
 680 
 681         final FloatBinding binding = Bindings.floatValueAt(localProperty, index);
 682         DependencyUtils.checkDependencies(binding.getDependencies(), localProperty, index);
 683 
 684         index.set(-1);
 685         assertEquals(defaultData, binding.get(), EPSILON_FLOAT);
 686         log.checkFine(IndexOutOfBoundsException.class);
 687         index.set(0);
 688         assertEquals(defaultData, binding.get(), EPSILON_FLOAT);
 689         log.checkFine(IndexOutOfBoundsException.class);
 690 
 691         localProperty.set(localList1);
 692         index.set(-1);
 693         assertEquals(defaultData, binding.get(), EPSILON_FLOAT);
 694         log.checkFine(ArrayIndexOutOfBoundsException.class);
 695         index.set(0);
 696         assertEquals(localData1, binding.get(), EPSILON_FLOAT);
 697         index.set(1);
 698         assertEquals(localData2, binding.get(), EPSILON_FLOAT);
 699         index.set(2);
 700         assertEquals(defaultData, binding.get(), EPSILON_FLOAT);
 701         log.checkFine(IndexOutOfBoundsException.class);
 702 
 703         localProperty.remove(1);
 704         index.set(-1);
 705         assertEquals(defaultData, binding.get(), EPSILON_FLOAT);
 706         log.checkFine(ArrayIndexOutOfBoundsException.class);
 707         index.set(0);
 708         assertEquals(localData1, binding.get(), EPSILON_FLOAT);
 709         index.set(1);
 710         assertEquals(defaultData, binding.get(), EPSILON_FLOAT);
 711         log.checkFine(IndexOutOfBoundsException.class);
 712 
 713         localProperty.set(0, null);
 714         index.set(-1);
 715         assertEquals(defaultData, binding.get(), EPSILON_FLOAT);
 716         log.checkFine(ArrayIndexOutOfBoundsException.class);
 717         index.set(0);
 718         assertEquals(defaultData, binding.get(), EPSILON_FLOAT);
 719         log.checkFine(NullPointerException.class);
 720         index.set(1);
 721         assertEquals(defaultData, binding.get(), EPSILON_FLOAT);
 722         log.checkFine(IndexOutOfBoundsException.class);
 723 
 724         localProperty.set(localList2);
 725         index.set(-1);
 726         assertEquals(defaultData, binding.get(), EPSILON_FLOAT);
 727         log.checkFine(ArrayIndexOutOfBoundsException.class);
 728         index.set(0);
 729         assertEquals(defaultData, binding.get(), EPSILON_FLOAT);
 730         log.checkFine(IndexOutOfBoundsException.class);
 731 
 732         localProperty.addAll(localData2, localData2);
 733         index.set(-1);
 734         assertEquals(defaultData, binding.get(), EPSILON_FLOAT);
 735         log.checkFine(ArrayIndexOutOfBoundsException.class);
 736         index.set(0);
 737         assertEquals(localData2, binding.get(), EPSILON_FLOAT);
 738         index.set(1);
 739         assertEquals(localData2, binding.get(), EPSILON_FLOAT);
 740         index.set(2);
 741         assertEquals(defaultData, binding.get(), EPSILON_FLOAT);
 742         log.checkFine(IndexOutOfBoundsException.class);
 743 
 744         localProperty.set(null);
 745         index.set(-1);
 746         assertEquals(defaultData, binding.get(), EPSILON_FLOAT);
 747         log.checkFine(IndexOutOfBoundsException.class);
 748         index.set(0);
 749         assertEquals(defaultData, binding.get(), EPSILON_FLOAT);
 750         log.checkFine(IndexOutOfBoundsException.class);
 751     }
 752 
 753     @Test(expected = NullPointerException.class)
 754     public void testFloatValueAt_Variable_Null() {
 755         Bindings.floatValueAt((ObservableList<Float>)null, index);
 756     }
 757 
 758     @Test(expected = NullPointerException.class)
 759     public void testFloatValueAt_Variable_NullIndex() {
 760         final ListProperty<Float> localProperty = new SimpleListProperty<Float>();
 761         Bindings.floatValueAt(localProperty, null);
 762     }
 763 
 764     @Test
 765     public void testIntegerValueAt_Constant() {
 766         final int defaultData = 0;
 767         final int localData1 = 42;
 768         final int localData2 = -7;
 769         final ListProperty<Integer> localProperty = new SimpleListProperty<Integer>();
 770         final ObservableList<Integer> localList1 = FXCollections.observableArrayList(localData1, localData2);
 771         final ObservableList<Integer> localList2 = FXCollections.observableArrayList();
 772 
 773         final IntegerBinding binding0 = Bindings.integerValueAt(localProperty, 0);
 774         final IntegerBinding binding1 = Bindings.integerValueAt(localProperty, 1);
 775         final IntegerBinding binding2 = Bindings.integerValueAt(localProperty, 2);
 776         DependencyUtils.checkDependencies(binding0.getDependencies(), localProperty);
 777         DependencyUtils.checkDependencies(binding1.getDependencies(), localProperty);
 778         DependencyUtils.checkDependencies(binding2.getDependencies(), localProperty);
 779         assertEquals(defaultData, binding0.get());
 780         log.checkFine(IndexOutOfBoundsException.class);
 781         assertEquals(defaultData, binding1.get());
 782         log.checkFine(IndexOutOfBoundsException.class);
 783         assertEquals(defaultData, binding2.get());
 784         log.checkFine(IndexOutOfBoundsException.class);
 785 
 786         localProperty.set(localList1);
 787         assertEquals(localData1, binding0.get());
 788         assertEquals(localData2, binding1.get());
 789         assertEquals(defaultData, binding2.get());
 790         log.checkFine(IndexOutOfBoundsException.class);
 791 
 792         localProperty.remove(1);
 793         assertEquals(localData1, binding0.get());
 794         assertEquals(defaultData, binding1.get());
 795         log.checkFine(IndexOutOfBoundsException.class);
 796         assertEquals(defaultData, binding2.get());
 797         log.checkFine(IndexOutOfBoundsException.class);
 798 
 799         localProperty.set(localList2);
 800         assertEquals(defaultData, binding0.get());
 801         log.checkFine(IndexOutOfBoundsException.class);
 802         assertEquals(defaultData, binding1.get());
 803         log.checkFine(IndexOutOfBoundsException.class);
 804         assertEquals(defaultData, binding2.get());
 805         log.checkFine(IndexOutOfBoundsException.class);
 806 
 807         localProperty.addAll(localData2, localData2);
 808         assertEquals(localData2, binding0.get());
 809         assertEquals(localData2, binding1.get());
 810         assertEquals(defaultData, binding2.get());
 811         log.checkFine(IndexOutOfBoundsException.class);
 812 
 813         localProperty.set(null);
 814         assertEquals(defaultData, binding0.get());
 815         log.checkFine(IndexOutOfBoundsException.class);
 816         assertEquals(defaultData, binding1.get());
 817         log.checkFine(IndexOutOfBoundsException.class);
 818         assertEquals(defaultData, binding2.get());
 819         log.checkFine(IndexOutOfBoundsException.class);
 820     }
 821 
 822     @Test(expected = NullPointerException.class)
 823     public void testIntegerValueAt_Constant_Null() {
 824         Bindings.integerValueAt((ObservableList) null, 0);
 825     }
 826 
 827     @Test(expected = IllegalArgumentException.class)
 828     public void testIntegerValueAt_Constant_NegativeIndex() {
 829         final ListProperty<Integer> localProperty = new SimpleListProperty<Integer>();
 830         Bindings.integerValueAt(localProperty, -1);
 831     }
 832 
 833     @Test
 834     public void testIntegerValueAt_Variable() {
 835         final int defaultData = 0;
 836         final int localData1 = 42;
 837         final int localData2 = -7;
 838         final ListProperty<Integer> localProperty = new SimpleListProperty<Integer>();
 839         final ObservableList<Integer> localList1 = FXCollections.observableArrayList(localData1, localData2);
 840         final ObservableList<Integer> localList2 = FXCollections.observableArrayList();
 841 
 842         final IntegerBinding binding = Bindings.integerValueAt(localProperty, index);
 843         DependencyUtils.checkDependencies(binding.getDependencies(), localProperty, index);
 844 
 845         index.set(-1);
 846         assertEquals(defaultData, binding.get());
 847         log.checkFine(IndexOutOfBoundsException.class);
 848         index.set(0);
 849         assertEquals(defaultData, binding.get());
 850         log.checkFine(IndexOutOfBoundsException.class);
 851 
 852         localProperty.set(localList1);
 853         index.set(-1);
 854         assertEquals(defaultData, binding.get());
 855         log.checkFine(ArrayIndexOutOfBoundsException.class);
 856         index.set(0);
 857         assertEquals(localData1, binding.get());
 858         index.set(1);
 859         assertEquals(localData2, binding.get());
 860         index.set(2);
 861         assertEquals(defaultData, binding.get());
 862         log.checkFine(IndexOutOfBoundsException.class);
 863 
 864         localProperty.remove(1);
 865         index.set(-1);
 866         assertEquals(defaultData, binding.get());
 867         log.checkFine(ArrayIndexOutOfBoundsException.class);
 868         index.set(0);
 869         assertEquals(localData1, binding.get());
 870         index.set(1);
 871         assertEquals(defaultData, binding.get());
 872         log.checkFine(IndexOutOfBoundsException.class);
 873 
 874         localProperty.set(0, null);
 875         index.set(-1);
 876         assertEquals(defaultData, binding.get());
 877         log.checkFine(ArrayIndexOutOfBoundsException.class);
 878         index.set(0);
 879         assertEquals(defaultData, binding.get());
 880         log.checkFine(NullPointerException.class);
 881         index.set(1);
 882         assertEquals(defaultData, binding.get());
 883         log.checkFine(IndexOutOfBoundsException.class);
 884 
 885         localProperty.set(localList2);
 886         index.set(-1);
 887         assertEquals(defaultData, binding.get());
 888         log.checkFine(ArrayIndexOutOfBoundsException.class);
 889         index.set(0);
 890         assertEquals(defaultData, binding.get());
 891         log.checkFine(IndexOutOfBoundsException.class);
 892 
 893         localProperty.addAll(localData2, localData2);
 894         index.set(-1);
 895         assertEquals(defaultData, binding.get());
 896         log.checkFine(ArrayIndexOutOfBoundsException.class);
 897         index.set(0);
 898         assertEquals(localData2, binding.get());
 899         index.set(1);
 900         assertEquals(localData2, binding.get());
 901         index.set(2);
 902         assertEquals(defaultData, binding.get());
 903         log.checkFine(IndexOutOfBoundsException.class);
 904 
 905         localProperty.set(null);
 906         index.set(-1);
 907         assertEquals(defaultData, binding.get());
 908         log.checkFine(IndexOutOfBoundsException.class);
 909         index.set(0);
 910         assertEquals(defaultData, binding.get());
 911         log.checkFine(IndexOutOfBoundsException.class);
 912     }
 913 
 914     @Test(expected = NullPointerException.class)
 915     public void testIntegerValueAt_Variable_Null() {
 916         Bindings.integerValueAt((ObservableList<Integer>)null, index);
 917     }
 918 
 919     @Test(expected = NullPointerException.class)
 920     public void testIntegerValueAt_Variable_NullIndex() {
 921         final ListProperty<Integer> localProperty = new SimpleListProperty<Integer>();
 922         Bindings.integerValueAt(localProperty, null);
 923     }
 924 
 925     @Test
 926     public void testLongValueAt_Constant() {
 927         final long defaultData = 0L;
 928         final long localData1 = 1234567890987654321L;
 929         final long localData2 = -987654321987654321L;
 930         final ListProperty<Long> localProperty = new SimpleListProperty<Long>();
 931         final ObservableList<Long> localList1 = FXCollections.observableArrayList(localData1, localData2);
 932         final ObservableList<Long> localList2 = FXCollections.observableArrayList();
 933 
 934         final LongBinding binding0 = Bindings.longValueAt(localProperty, 0);
 935         final LongBinding binding1 = Bindings.longValueAt(localProperty, 1);
 936         final LongBinding binding2 = Bindings.longValueAt(localProperty, 2);
 937         DependencyUtils.checkDependencies(binding0.getDependencies(), localProperty);
 938         DependencyUtils.checkDependencies(binding1.getDependencies(), localProperty);
 939         DependencyUtils.checkDependencies(binding2.getDependencies(), localProperty);
 940         assertEquals(defaultData, binding0.get());
 941         log.checkFine(IndexOutOfBoundsException.class);
 942         assertEquals(defaultData, binding1.get());
 943         log.checkFine(IndexOutOfBoundsException.class);
 944         assertEquals(defaultData, binding2.get());
 945         log.checkFine(IndexOutOfBoundsException.class);
 946 
 947         localProperty.set(localList1);
 948         assertEquals(localData1, binding0.get());
 949         assertEquals(localData2, binding1.get());
 950         assertEquals(defaultData, binding2.get());
 951         log.checkFine(IndexOutOfBoundsException.class);
 952 
 953         localProperty.remove(1);
 954         assertEquals(localData1, binding0.get());
 955         assertEquals(defaultData, binding1.get());
 956         log.checkFine(IndexOutOfBoundsException.class);
 957         assertEquals(defaultData, binding2.get());
 958         log.checkFine(IndexOutOfBoundsException.class);
 959 
 960         localProperty.set(localList2);
 961         assertEquals(defaultData, binding0.get());
 962         log.checkFine(IndexOutOfBoundsException.class);
 963         assertEquals(defaultData, binding1.get());
 964         log.checkFine(IndexOutOfBoundsException.class);
 965         assertEquals(defaultData, binding2.get());
 966         log.checkFine(IndexOutOfBoundsException.class);
 967 
 968         localProperty.addAll(localData2, localData2);
 969         assertEquals(localData2, binding0.get());
 970         assertEquals(localData2, binding1.get());
 971         assertEquals(defaultData, binding2.get());
 972         log.checkFine(IndexOutOfBoundsException.class);
 973 
 974         localProperty.set(null);
 975         assertEquals(defaultData, binding0.get());
 976         log.checkFine(IndexOutOfBoundsException.class);
 977         assertEquals(defaultData, binding1.get());
 978         log.checkFine(IndexOutOfBoundsException.class);
 979         assertEquals(defaultData, binding2.get());
 980         log.checkFine(IndexOutOfBoundsException.class);
 981     }
 982 
 983     @Test(expected = NullPointerException.class)
 984     public void testLongValueAt_Constant_Null() {
 985         Bindings.longValueAt(null, 0);
 986     }
 987 
 988     @Test(expected = IllegalArgumentException.class)
 989     public void testLongValueAt_Constant_NegativeIndex() {
 990         final ListProperty<Long> localProperty = new SimpleListProperty<Long>();
 991         Bindings.longValueAt(localProperty, -1);
 992     }
 993 
 994     @Test
 995     public void testLongValueAt_Variable() {
 996         final long defaultData = 0;
 997         final long localData1 = 98765432123456789L;
 998         final long localData2 = -1234567890123456789L;
 999         final ListProperty<Long> localProperty = new SimpleListProperty<Long>();
1000         final ObservableList<Long> localList1 = FXCollections.observableArrayList(localData1, localData2);
1001         final ObservableList<Long> localList2 = FXCollections.observableArrayList();
1002 
1003         final LongBinding binding = Bindings.longValueAt(localProperty, index);
1004         DependencyUtils.checkDependencies(binding.getDependencies(), localProperty, index);
1005 
1006         index.set(-1);
1007         assertEquals(defaultData, binding.get());
1008         log.checkFine(IndexOutOfBoundsException.class);
1009         index.set(0);
1010         assertEquals(defaultData, binding.get());
1011         log.checkFine(IndexOutOfBoundsException.class);
1012 
1013         localProperty.set(localList1);
1014         index.set(-1);
1015         assertEquals(defaultData, binding.get());
1016         log.checkFine(ArrayIndexOutOfBoundsException.class);
1017         index.set(0);
1018         assertEquals(localData1, binding.get());
1019         index.set(1);
1020         assertEquals(localData2, binding.get());
1021         index.set(2);
1022         assertEquals(defaultData, binding.get());
1023         log.checkFine(IndexOutOfBoundsException.class);
1024 
1025         localProperty.remove(1);
1026         index.set(-1);
1027         assertEquals(defaultData, binding.get());
1028         log.checkFine(ArrayIndexOutOfBoundsException.class);
1029         index.set(0);
1030         assertEquals(localData1, binding.get());
1031         index.set(1);
1032         assertEquals(defaultData, binding.get());
1033         log.checkFine(IndexOutOfBoundsException.class);
1034 
1035         localProperty.set(0, null);
1036         index.set(-1);
1037         assertEquals(defaultData, binding.get());
1038         log.checkFine(ArrayIndexOutOfBoundsException.class);
1039         index.set(0);
1040         assertEquals(defaultData, binding.get());
1041         log.checkFine(NullPointerException.class);
1042         index.set(1);
1043         assertEquals(defaultData, binding.get());
1044         log.checkFine(IndexOutOfBoundsException.class);
1045 
1046         localProperty.set(localList2);
1047         index.set(-1);
1048         assertEquals(defaultData, binding.get());
1049         log.checkFine(ArrayIndexOutOfBoundsException.class);
1050         index.set(0);
1051         assertEquals(defaultData, binding.get());
1052         log.checkFine(IndexOutOfBoundsException.class);
1053 
1054         localProperty.addAll(localData2, localData2);
1055         index.set(-1);
1056         assertEquals(defaultData, binding.get());
1057         log.checkFine(ArrayIndexOutOfBoundsException.class);
1058         index.set(0);
1059         assertEquals(localData2, binding.get());
1060         index.set(1);
1061         assertEquals(localData2, binding.get());
1062         index.set(2);
1063         assertEquals(defaultData, binding.get());
1064         log.checkFine(IndexOutOfBoundsException.class);
1065 
1066         localProperty.set(null);
1067         index.set(-1);
1068         assertEquals(defaultData, binding.get());
1069         log.checkFine(IndexOutOfBoundsException.class);
1070         index.set(0);
1071         assertEquals(defaultData, binding.get());
1072         log.checkFine(IndexOutOfBoundsException.class);
1073     }
1074 
1075     @Test(expected = NullPointerException.class)
1076     public void testLongValueAt_Variable_Null() {
1077         Bindings.longValueAt((ObservableList<Long>)null, index);
1078     }
1079 
1080     @Test(expected = NullPointerException.class)
1081     public void testLongValueAt_Variable_NullIndex() {
1082         final ListProperty<Long> localProperty = new SimpleListProperty<Long>();
1083         Bindings.longValueAt(localProperty, null);
1084     }
1085 
1086     @Test
1087     public void testStringValueAt_Constant() {
1088         final String defaultData = null;
1089         final String localData1 = "Hello World";
1090         final String localData2 = "Goodbye World";
1091         final ListProperty<String> localProperty = new SimpleListProperty<String>();
1092         final ObservableList<String> localList1 = FXCollections.observableArrayList(localData1, localData2);
1093         final ObservableList<String> localList2 = FXCollections.observableArrayList();
1094 
1095         final StringBinding binding0 = Bindings.stringValueAt(localProperty, 0);
1096         final StringBinding binding1 = Bindings.stringValueAt(localProperty, 1);
1097         final StringBinding binding2 = Bindings.stringValueAt(localProperty, 2);
1098         DependencyUtils.checkDependencies(binding0.getDependencies(), localProperty);
1099         DependencyUtils.checkDependencies(binding1.getDependencies(), localProperty);
1100         DependencyUtils.checkDependencies(binding2.getDependencies(), localProperty);
1101         assertEquals(defaultData, binding0.get());
1102         log.checkFine(IndexOutOfBoundsException.class);
1103         assertEquals(defaultData, binding1.get());
1104         log.checkFine(IndexOutOfBoundsException.class);
1105         assertEquals(defaultData, binding2.get());
1106         log.checkFine(IndexOutOfBoundsException.class);
1107 
1108         localProperty.set(localList1);
1109         assertEquals(localData1, binding0.get());
1110         assertEquals(localData2, binding1.get());
1111         assertEquals(defaultData, binding2.get());
1112         log.checkFine(IndexOutOfBoundsException.class);
1113 
1114         localProperty.remove(1);
1115         assertEquals(localData1, binding0.get());
1116         assertEquals(defaultData, binding1.get());
1117         log.checkFine(IndexOutOfBoundsException.class);
1118         assertEquals(defaultData, binding2.get());
1119         log.checkFine(IndexOutOfBoundsException.class);
1120 
1121         localProperty.set(localList2);
1122         assertEquals(defaultData, binding0.get());
1123         log.checkFine(IndexOutOfBoundsException.class);
1124         assertEquals(defaultData, binding1.get());
1125         log.checkFine(IndexOutOfBoundsException.class);
1126         assertEquals(defaultData, binding2.get());
1127         log.checkFine(IndexOutOfBoundsException.class);
1128 
1129         localProperty.addAll(localData2, localData2);
1130         assertEquals(localData2, binding0.get());
1131         assertEquals(localData2, binding1.get());
1132         assertEquals(defaultData, binding2.get());
1133         log.checkFine(IndexOutOfBoundsException.class);
1134 
1135         localProperty.set(null);
1136         assertEquals(defaultData, binding0.get());
1137         log.checkFine(IndexOutOfBoundsException.class);
1138         assertEquals(defaultData, binding1.get());
1139         log.checkFine(IndexOutOfBoundsException.class);
1140         assertEquals(defaultData, binding2.get());
1141         log.checkFine(IndexOutOfBoundsException.class);
1142     }
1143 
1144     @Test(expected = NullPointerException.class)
1145     public void testStringValueAt_Constant_Null() {
1146         Bindings.stringValueAt(null, 0);
1147     }
1148 
1149     @Test(expected = IllegalArgumentException.class)
1150     public void testStringValueAt_Constant_NegativeIndex() {
1151         final ListProperty<String> localProperty = new SimpleListProperty<String>();
1152         Bindings.stringValueAt(localProperty, -1);
1153     }
1154 
1155     @Test
1156     public void testStringValueAt_Variable() {
1157         final String defaultData = null;
1158         final String localData1 = "Goodbye";
1159         final String localData2 = "Hello";
1160         final ListProperty<String> localProperty = new SimpleListProperty<String>();
1161         final ObservableList<String> localList1 = FXCollections.observableArrayList(localData1, localData2);
1162         final ObservableList<String> localList2 = FXCollections.observableArrayList();
1163 
1164         final StringBinding binding = Bindings.stringValueAt(localProperty, index);
1165         DependencyUtils.checkDependencies(binding.getDependencies(), localProperty, index);
1166 
1167         index.set(-1);
1168         assertEquals(defaultData, binding.get());
1169         log.checkFine(IndexOutOfBoundsException.class);
1170         index.set(0);
1171         assertEquals(defaultData, binding.get());
1172         log.checkFine(IndexOutOfBoundsException.class);
1173 
1174         localProperty.set(localList1);
1175         index.set(-1);
1176         assertEquals(defaultData, binding.get());
1177         log.checkFine(ArrayIndexOutOfBoundsException.class);
1178         index.set(0);
1179         assertEquals(localData1, binding.get());
1180         index.set(1);
1181         assertEquals(localData2, binding.get());
1182         index.set(2);
1183         assertEquals(defaultData, binding.get());
1184         log.checkFine(IndexOutOfBoundsException.class);
1185 
1186         localProperty.remove(1);
1187         index.set(-1);
1188         assertEquals(defaultData, binding.get());
1189         log.checkFine(ArrayIndexOutOfBoundsException.class);
1190         index.set(0);
1191         assertEquals(localData1, binding.get());
1192         index.set(1);
1193         assertEquals(defaultData, binding.get());
1194         log.checkFine(IndexOutOfBoundsException.class);
1195 
1196         localProperty.set(localList2);
1197         index.set(-1);
1198         assertEquals(defaultData, binding.get());
1199         log.checkFine(ArrayIndexOutOfBoundsException.class);
1200         index.set(0);
1201         assertEquals(defaultData, binding.get());
1202         log.checkFine(IndexOutOfBoundsException.class);
1203 
1204         localProperty.addAll(localData2, localData2);
1205         index.set(-1);
1206         assertEquals(defaultData, binding.get());
1207         log.checkFine(ArrayIndexOutOfBoundsException.class);
1208         index.set(0);
1209         assertEquals(localData2, binding.get());
1210         index.set(1);
1211         assertEquals(localData2, binding.get());
1212         index.set(2);
1213         assertEquals(defaultData, binding.get());
1214         log.checkFine(IndexOutOfBoundsException.class);
1215 
1216         localProperty.set(null);
1217         index.set(-1);
1218         assertEquals(defaultData, binding.get());
1219         log.checkFine(IndexOutOfBoundsException.class);
1220         index.set(0);
1221         assertEquals(defaultData, binding.get());
1222         log.checkFine(IndexOutOfBoundsException.class);
1223     }
1224 
1225     @Test(expected = NullPointerException.class)
1226     public void testStringValueAt_Variable_Null() {
1227         Bindings.stringValueAt((ObservableList<String>)null, index);
1228     }
1229 
1230     @Test(expected = NullPointerException.class)
1231     public void testStringValueAt_Variable_NullIndex() {
1232         final ListProperty<String> localProperty = new SimpleListProperty<String>();
1233         Bindings.stringValueAt(localProperty, null);
1234     }
1235 
1236 
1237 }