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 javafx.binding; 27 28 import static org.junit.Assert.assertEquals; 29 import static org.junit.Assert.assertTrue; 30 31 import java.util.Arrays; 32 import java.util.Collection; 33 34 import javafx.beans.binding.Binding; 35 import javafx.beans.binding.Bindings; 36 import javafx.beans.binding.BooleanExpression; 37 import javafx.beans.binding.DoubleExpression; 38 import javafx.beans.binding.FloatExpression; 39 import javafx.beans.binding.IntegerExpression; 40 import javafx.beans.binding.LongExpression; 41 import javafx.beans.binding.NumberExpression; 42 import javafx.beans.property.DoubleProperty; 43 import javafx.beans.property.FloatProperty; 44 import javafx.beans.property.IntegerProperty; 45 import javafx.beans.property.LongProperty; 46 import javafx.beans.property.SimpleDoubleProperty; 47 import javafx.beans.property.SimpleFloatProperty; 48 import javafx.beans.property.SimpleIntegerProperty; 49 import javafx.beans.property.SimpleLongProperty; 50 import javafx.beans.value.ObservableNumberValue; 51 52 import org.junit.Before; 53 import org.junit.Test; 54 import org.junit.runner.RunWith; 55 import org.junit.runners.Parameterized; 56 57 @RunWith(Parameterized.class) 58 public class BindingsNumberCastTest { 59 60 public static interface Functions { 61 Binding generateExpression(ObservableNumberValue op1, ObservableNumberValue op2); 62 void check(double op1, double op2, Binding binding); 63 } 64 65 private static final double EPSILON = 1e-5; 66 67 private final Functions func; 68 69 private Double double0; 70 private Float float0; 71 private Long long0; 72 private Integer integer0; 73 74 private DoubleProperty double1; 75 private FloatProperty float1; 76 private LongProperty long1; 77 private IntegerProperty integer1; 78 79 public BindingsNumberCastTest(Functions func) { 80 this.func = func; 81 } 82 83 @Before 84 public void setUp() { 85 double0 = Double.valueOf(3.1415); 86 float0 = Float.valueOf(2.71f); 87 long0 = Long.valueOf(111L); 88 integer0 = Integer.valueOf(42); 89 90 double1 = new SimpleDoubleProperty(double0); 91 float1 = new SimpleFloatProperty(float0); 92 long1 = new SimpleLongProperty(long0); 93 integer1 = new SimpleIntegerProperty(integer0); 94 } 95 96 @Test 97 public void testDouble() { 98 Binding binding = func.generateExpression(double1, double1); 99 assertTrue(binding instanceof DoubleExpression || binding instanceof BooleanExpression); 100 func.check(double0, double0, binding); 101 102 binding = func.generateExpression(double1, float1); 103 assertTrue(binding instanceof DoubleExpression || binding instanceof BooleanExpression); 104 func.check(double0, float0, binding); 105 106 binding = func.generateExpression(double1, long1); 107 assertTrue(binding instanceof DoubleExpression || binding instanceof BooleanExpression); 108 func.check(double0, long0, binding); 109 110 binding = func.generateExpression(double1, integer1); 111 assertTrue(binding instanceof DoubleExpression || binding instanceof BooleanExpression); 112 func.check(double0, integer0, binding); 113 } 114 115 @Test 116 public void testFloat() { 117 Binding binding = func.generateExpression(float1, double1); 118 assertTrue(binding instanceof DoubleExpression || binding instanceof BooleanExpression); 119 func.check(float0, double0, binding); 120 121 binding = func.generateExpression(float1, float1); 122 assertTrue(binding instanceof FloatExpression || binding instanceof BooleanExpression); 123 func.check(float0, float0, binding); 124 125 binding = func.generateExpression(float1, long1); 126 assertTrue(binding instanceof FloatExpression || binding instanceof BooleanExpression); 127 func.check(float0, long0, binding); 128 129 binding = func.generateExpression(float1, integer1); 130 assertTrue(binding instanceof FloatExpression || binding instanceof BooleanExpression); 131 func.check(float0, integer0, binding); 132 } 133 134 @Test 135 public void testLong() { 136 Binding binding = func.generateExpression(long1, double1); 137 assertTrue(binding instanceof DoubleExpression || binding instanceof BooleanExpression); 138 func.check(long0, double0, binding); 139 140 binding = func.generateExpression(long1, float1); 141 assertTrue(binding instanceof FloatExpression || binding instanceof BooleanExpression); 142 func.check(long0, float0, binding); 143 144 binding = func.generateExpression(long1, long1); 145 assertTrue(binding instanceof LongExpression || binding instanceof BooleanExpression); 146 func.check(long0, long0, binding); 147 148 binding = func.generateExpression(long1, integer1); 149 assertTrue(binding instanceof LongExpression || binding instanceof BooleanExpression); 150 func.check(long0, integer0, binding); 151 } 152 153 @Test 154 public void testInteger() { 155 Binding binding = func.generateExpression(integer1, double1); 156 assertTrue(binding instanceof DoubleExpression || binding instanceof BooleanExpression); 157 func.check(integer0, double0, binding); 158 159 binding = func.generateExpression(integer1, float1); 160 assertTrue(binding instanceof FloatExpression || binding instanceof BooleanExpression); 161 func.check(integer0, float0, binding); 162 163 binding = func.generateExpression(integer1, long1); 164 assertTrue(binding instanceof LongExpression || binding instanceof BooleanExpression); 165 func.check(integer0, long0, binding); 166 167 binding = func.generateExpression(integer1, integer1); 168 assertTrue(binding instanceof IntegerExpression || binding instanceof BooleanExpression); 169 func.check(integer0, integer0, binding); 170 } 171 172 @Parameterized.Parameters 173 public static Collection<Object[]> parameters() { 174 return Arrays.asList(new Object[][] { 175 { 176 new Functions() { 177 @Override 178 public Binding generateExpression(ObservableNumberValue op1, ObservableNumberValue op2) { 179 return Bindings.add(op1, op2); 180 } 181 182 @Override 183 public void check(double op1, double op2, Binding binding) { 184 assertTrue(binding instanceof NumberExpression); 185 assertEquals(op1 + op2, ((NumberExpression)binding).doubleValue(), EPSILON); 186 } 187 188 } 189 }, 190 { 191 new Functions() { 192 @Override 193 public Binding generateExpression(ObservableNumberValue op1, ObservableNumberValue op2) { 194 return Bindings.multiply(op1, op2); 195 } 196 197 @Override 198 public void check(double op1, double op2, Binding binding) { 199 assertTrue(binding instanceof NumberExpression); 200 assertEquals(op1 * op2, ((NumberExpression)binding).doubleValue(), EPSILON); 201 } 202 203 } 204 }, 205 { 206 new Functions() { 207 @Override 208 public Binding generateExpression(ObservableNumberValue op1, ObservableNumberValue op2) { 209 return Bindings.divide(op1, op2); 210 } 211 212 @Override 213 public void check(double op1, double op2, Binding binding) { 214 assertTrue(binding instanceof NumberExpression); 215 if ((binding instanceof DoubleExpression) || (binding instanceof FloatExpression)) { 216 assertEquals(op1 / op2, ((NumberExpression)binding).doubleValue(), EPSILON); 217 } else { 218 assertEquals((long)op1 / (long)op2, ((NumberExpression)binding).longValue()); 219 } 220 } 221 222 } 223 }, 224 { 225 new Functions() { 226 @Override 227 public Binding generateExpression(ObservableNumberValue op1, ObservableNumberValue op2) { 228 return Bindings.min(op1, op2); 229 } 230 231 @Override 232 public void check(double op1, double op2, Binding binding) { 233 assertTrue(binding instanceof NumberExpression); 234 assertEquals(Math.min(op1, op2), ((NumberExpression)binding).doubleValue(), EPSILON); 235 } 236 237 } 238 }, 239 { 240 new Functions() { 241 @Override 242 public Binding generateExpression(ObservableNumberValue op1, ObservableNumberValue op2) { 243 return Bindings.max(op1, op2); 244 } 245 246 @Override 247 public void check(double op1, double op2, Binding binding) { 248 assertTrue(binding instanceof NumberExpression); 249 assertEquals(Math.max(op1, op2), ((NumberExpression)binding).doubleValue(), EPSILON); 250 } 251 252 } 253 }, 254 { 255 new Functions() { 256 @Override 257 public Binding generateExpression(ObservableNumberValue op1, ObservableNumberValue op2) { 258 return Bindings.equal(op1, op2); 259 } 260 261 @Override 262 public void check(double op1, double op2, Binding binding) { 263 assertTrue(binding instanceof BooleanExpression); 264 assertEquals(Math.abs(op1 - op2) < EPSILON, ((BooleanExpression)binding).get()); 265 } 266 267 } 268 }, 269 { 270 new Functions() { 271 @Override 272 public Binding generateExpression(ObservableNumberValue op1, ObservableNumberValue op2) { 273 return Bindings.greaterThan(op1, op2); 274 } 275 276 @Override 277 public void check(double op1, double op2, Binding binding) { 278 assertTrue(binding instanceof BooleanExpression); 279 assertEquals(op1 > op2, ((BooleanExpression)binding).get()); 280 } 281 282 } 283 }, 284 }); 285 } 286 287 }