1 /* 2 * Copyright (c) 2011, 2013, 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 com.sun.javafx.binding; 27 28 import javafx.beans.binding.Bindings; 29 import javafx.collections.FXCollections; 30 import javafx.collections.ObservableList; 31 import org.junit.Before; 32 import org.junit.Test; 33 34 import java.util.ArrayList; 35 import java.util.Arrays; 36 import java.util.List; 37 38 import static org.junit.Assert.*; 39 40 public class BidirectionalContentBindingListTest { 41 42 private ObservableList<Integer> op1; 43 private ObservableList<Integer> op2; 44 private ObservableList<Integer> op3; 45 private List<Integer> list0; 46 private List<Integer> list1; 47 private List<Integer> list2; 48 49 @Before 50 public void setUp() { 51 list0 = new ArrayList<Integer>(); 52 list1 = new ArrayList<Integer>(Arrays.asList(-1)); 53 list2 = new ArrayList<Integer>(Arrays.asList(2, 1)); 54 55 op1 = FXCollections.observableArrayList(list1); 56 op2 = FXCollections.observableArrayList(list2); 57 op3 = FXCollections.observableArrayList(list0); 58 } 59 60 @Test 61 public void testBind() { 62 final List<Integer> list2_sorted = new ArrayList<Integer>(Arrays.asList(1, 2)); 63 64 Bindings.bindContentBidirectional(op1, op2); 65 System.gc(); // making sure we did not not overdo weak references 66 assertEquals(list2, op1); 67 assertEquals(list2, op2); 68 69 op1.setAll(list1); 70 assertEquals(list1, op1); 71 assertEquals(list1, op2); 72 73 op1.setAll(list0); 74 assertEquals(list0, op1); 75 assertEquals(list0, op2); 76 77 op1.setAll(list2); 78 assertEquals(list2, op1); 79 assertEquals(list2, op2); 80 81 FXCollections.sort(op1); 82 assertEquals(list2_sorted, op1); 83 assertEquals(list2_sorted, op2); 84 85 op2.setAll(list1); 86 assertEquals(list1, op1); 87 assertEquals(list1, op2); 88 89 op2.setAll(list0); 90 assertEquals(list0, op1); 91 assertEquals(list0, op2); 92 93 op2.setAll(list2); 94 assertEquals(list2, op1); 95 assertEquals(list2, op2); 96 97 FXCollections.sort(op2); 98 assertEquals(list2_sorted, op1); 99 assertEquals(list2_sorted, op2); 100 } 101 102 @Test(expected = NullPointerException.class) 103 public void testBind_Null_X() { 104 Bindings.bindContentBidirectional(null, op2); 105 } 106 107 @Test(expected = NullPointerException.class) 108 public void testBind_X_Null() { 109 Bindings.bindContentBidirectional(op1, null); 110 } 111 112 @Test(expected = IllegalArgumentException.class) 113 public void testBind_X_Self() { 114 Bindings.bindContentBidirectional(op1, op1); 115 } 116 117 @Test 118 public void testUnbind() { 119 // unbind non-existing binding => no-op 120 Bindings.unbindContentBidirectional(op1, op2); 121 122 Bindings.bindContentBidirectional(op1, op2); 123 System.gc(); // making sure we did not not overdo weak references 124 assertEquals(list2, op1); 125 assertEquals(list2, op2); 126 127 Bindings.unbindContentBidirectional(op1, op2); 128 System.gc(); 129 assertEquals(list2, op1); 130 assertEquals(list2, op2); 131 132 op1.setAll(list1); 133 assertEquals(list1, op1); 134 assertEquals(list2, op2); 135 136 op2.setAll(list0); 137 assertEquals(list1, op1); 138 assertEquals(list0, op2); 139 140 // unbind in flipped order 141 Bindings.bindContentBidirectional(op1, op2); 142 System.gc(); // making sure we did not not overdo weak references 143 assertEquals(list0, op1); 144 assertEquals(list0, op2); 145 146 Bindings.unbindContentBidirectional(op2, op1); 147 System.gc(); 148 assertEquals(list0, op1); 149 assertEquals(list0, op2); 150 151 op1.setAll(list1); 152 assertEquals(list1, op1); 153 assertEquals(list0, op2); 154 155 op2.setAll(list2); 156 assertEquals(list1, op1); 157 assertEquals(list2, op2); 158 } 159 160 @Test(expected = NullPointerException.class) 161 public void testUnbind_Null_X() { 162 Bindings.unbindContentBidirectional(null, op2); 163 } 164 165 @Test(expected = NullPointerException.class) 166 public void testUnbind_X_Null() { 167 Bindings.unbindContentBidirectional(op1, null); 168 } 169 170 @Test(expected = IllegalArgumentException.class) 171 public void testUnbind_X_Self() { 172 Bindings.unbindContentBidirectional(op1, op1); 173 } 174 175 @Test 176 public void testChaining() { 177 Bindings.bindContentBidirectional(op1, op2); 178 Bindings.bindContentBidirectional(op2, op3); 179 System.gc(); // making sure we did not not overdo weak references 180 assertEquals(list0, op1); 181 assertEquals(list0, op2); 182 assertEquals(list0, op3); 183 184 op1.setAll(list1); 185 assertEquals(list1, op1); 186 assertEquals(list1, op2); 187 assertEquals(list1, op3); 188 189 op2.setAll(list2); 190 assertEquals(list2, op1); 191 assertEquals(list2, op2); 192 assertEquals(list2, op3); 193 194 op3.setAll(list0); 195 assertEquals(list0, op1); 196 assertEquals(list0, op2); 197 assertEquals(list0, op3); 198 199 // now unbind 200 Bindings.unbindContentBidirectional(op1, op2); 201 System.gc(); // making sure we did not not overdo weak references 202 assertEquals(list0, op1); 203 assertEquals(list0, op2); 204 assertEquals(list0, op3); 205 206 op1.setAll(list1); 207 assertEquals(list1, op1); 208 assertEquals(list0, op2); 209 assertEquals(list0, op3); 210 211 op2.setAll(list2); 212 assertEquals(list1, op1); 213 assertEquals(list2, op2); 214 assertEquals(list2, op3); 215 216 op3.setAll(list0); 217 assertEquals(list1, op1); 218 assertEquals(list0, op2); 219 assertEquals(list0, op3); 220 } 221 222 @Test 223 public void testHashCode() { 224 final int hc1 = BidirectionalContentBinding.bind(op1, op2).hashCode(); 225 BidirectionalContentBinding.unbind(op1, op2); 226 final int hc2 = BidirectionalContentBinding.bind(op2, op1).hashCode(); 227 assertEquals(hc1, hc2); 228 } 229 230 @Test 231 public void testEquals() { 232 final Object golden = BidirectionalContentBinding.bind(op1, op2); 233 BidirectionalContentBinding.unbind(op1, op2); 234 235 assertTrue(golden.equals(golden)); 236 assertFalse(golden.equals(null)); 237 assertFalse(golden.equals(op1)); 238 assertTrue(golden.equals(BidirectionalContentBinding.bind(op1, op2))); 239 BidirectionalContentBinding.unbind(op1, op2); 240 assertTrue(golden.equals(BidirectionalContentBinding.bind(op2, op1))); 241 BidirectionalContentBinding.unbind(op1, op2); 242 assertFalse(golden.equals(BidirectionalContentBinding.bind(op1, op3))); 243 BidirectionalContentBinding.unbind(op1, op3); 244 assertFalse(golden.equals(BidirectionalContentBinding.bind(op3, op1))); 245 BidirectionalContentBinding.unbind(op1, op3); 246 assertFalse(golden.equals(BidirectionalContentBinding.bind(op3, op2))); 247 BidirectionalContentBinding.unbind(op2, op3); 248 assertFalse(golden.equals(BidirectionalContentBinding.bind(op2, op3))); 249 BidirectionalContentBinding.unbind(op2, op3); 250 } 251 252 @Test 253 public void testEqualsWithGCedProperty() { 254 final Object binding1 = BidirectionalContentBinding.bind(op1, op2); 255 BidirectionalContentBinding.unbind(op1, op2); 256 final Object binding2 = BidirectionalContentBinding.bind(op1, op2); 257 BidirectionalContentBinding.unbind(op1, op2); 258 final Object binding3 = BidirectionalContentBinding.bind(op2, op1); 259 BidirectionalContentBinding.unbind(op1, op2); 260 final Object binding4 = BidirectionalContentBinding.bind(op2, op1); 261 BidirectionalContentBinding.unbind(op1, op2); 262 op1 = null; 263 System.gc(); 264 265 assertTrue(binding1.equals(binding1)); 266 assertFalse(binding1.equals(binding2)); 267 assertFalse(binding1.equals(binding3)); 268 269 assertTrue(binding3.equals(binding3)); 270 assertFalse(binding3.equals(binding1)); 271 assertFalse(binding3.equals(binding4)); 272 } 273 274 @Test 275 public void testChangeValue() { 276 Bindings.bindContentBidirectional(op1, op2); 277 assertEquals(2, op2.get(0).intValue()); 278 op1.set(0, 1); 279 assertEquals(1, op2.get(0).intValue()); 280 } 281 }