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