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 test.javafx.binding.expression; 27 28 import static org.junit.Assert.assertEquals; 29 import static org.junit.Assert.assertTrue; 30 31 import java.util.Locale; 32 33 import javafx.beans.InvalidationListener; 34 import javafx.beans.binding.BooleanBinding; 35 import javafx.beans.binding.DoubleBinding; 36 import javafx.beans.binding.FloatBinding; 37 import javafx.beans.binding.IntegerBinding; 38 import javafx.beans.binding.LongBinding; 39 import javafx.beans.binding.NumberBinding; 40 import javafx.beans.binding.NumberExpressionBase; 41 import javafx.beans.binding.StringBinding; 42 import javafx.beans.property.DoubleProperty; 43 import javafx.beans.property.IntegerProperty; 44 import javafx.beans.property.SimpleDoubleProperty; 45 import javafx.beans.property.SimpleIntegerProperty; 46 import javafx.beans.value.ChangeListener; 47 import javafx.beans.value.ObservableDoubleValueStub; 48 import javafx.beans.value.ObservableFloatValueStub; 49 import javafx.beans.value.ObservableIntegerValueStub; 50 import javafx.beans.value.ObservableLongValueStub; 51 import javafx.beans.value.ObservableNumberValue; 52 import test.javafx.binding.DependencyUtils; 53 import javafx.collections.FXCollections; 54 55 import org.junit.Before; 56 import org.junit.Ignore; 57 import org.junit.Test; 58 59 @SuppressWarnings("WebTest") 60 public class AbstractNumberExpressionTest { 61 62 private static final float EPSILON = 1e-6f; 63 64 private double data1; 65 private int data2; 66 private DoubleProperty op1; 67 private IntegerProperty op2; 68 private double double1; 69 private float float1; 70 private long long1; 71 private int integer1; 72 private short short1; 73 private byte byte1; 74 75 @Before 76 public void setUp() { 77 data1 = 90224.8923; 78 data2 = -13; 79 op1 = new SimpleDoubleProperty(data1); 80 op2 = new SimpleIntegerProperty(data2); 81 double1 = -234.234; 82 float1 = 111.9f; 83 long1 = 2009234L; 84 integer1 = -234734; 85 short1 = 9824; 86 byte1 = -123; 87 } 88 89 @Test 90 public void testArithmetic() { 91 final NumberBinding binding1 = op1.add(op2); 92 assertEquals(data1 + data2, binding1.doubleValue(), EPSILON); 93 94 final NumberBinding binding2 = op1.subtract(op2); 95 assertEquals(data1 - data2, binding2.doubleValue(), EPSILON); 96 97 final NumberBinding binding3 = op1.multiply(op2); 98 assertEquals(data1 * data2, binding3.doubleValue(), EPSILON); 99 100 final NumberBinding binding4 = op1.divide(op2); 101 assertEquals(data1 / data2, binding4.doubleValue(), EPSILON); 102 103 } 104 105 @Test 106 public void testEquals() { 107 BooleanBinding binding = op1.isEqualTo(op1, EPSILON); 108 assertEquals(true, binding.get()); 109 110 binding = op2.isEqualTo(op2); 111 assertEquals(true, binding.get()); 112 113 binding = op1.isEqualTo(op2, EPSILON); 114 assertEquals(false, binding.get()); 115 116 binding = op1.isEqualTo(data1, EPSILON); 117 assertEquals(true, binding.get()); 118 119 binding = op1.isEqualTo(data2, EPSILON); 120 assertEquals(false, binding.get()); 121 122 binding = op1.isEqualTo(double1, EPSILON); 123 assertEquals(false, binding.get()); 124 125 binding = op1.isEqualTo(float1, EPSILON); 126 assertEquals(false, binding.get()); 127 128 binding = op1.isEqualTo(long1, EPSILON); 129 assertEquals(false, binding.get()); 130 131 binding = op1.isEqualTo(long1); 132 assertEquals(false, binding.get()); 133 134 binding = op1.isEqualTo(integer1, EPSILON); 135 assertEquals(false, binding.get()); 136 137 binding = op1.isEqualTo(integer1); 138 assertEquals(false, binding.get()); 139 140 binding = op1.isEqualTo(short1, EPSILON); 141 assertEquals(false, binding.get()); 142 143 binding = op1.isEqualTo(short1); 144 assertEquals(false, binding.get()); 145 146 binding = op1.isEqualTo(byte1, EPSILON); 147 assertEquals(false, binding.get()); 148 149 binding = op1.isEqualTo(byte1); 150 assertEquals(false, binding.get()); 151 } 152 153 @Test 154 public void testNotEquals() { 155 BooleanBinding binding = op1.isNotEqualTo(op1, EPSILON); 156 assertEquals(false, binding.get()); 157 158 binding = op2.isNotEqualTo(op2); 159 assertEquals(false, binding.get()); 160 161 binding = op1.isNotEqualTo(op2, EPSILON); 162 assertEquals(true, binding.get()); 163 164 binding = op1.isNotEqualTo(data1, EPSILON); 165 assertEquals(false, binding.get()); 166 167 binding = op1.isNotEqualTo(data2, EPSILON); 168 assertEquals(true, binding.get()); 169 170 binding = op1.isNotEqualTo(double1, EPSILON); 171 assertEquals(true, binding.get()); 172 173 binding = op1.isNotEqualTo(float1, EPSILON); 174 assertEquals(true, binding.get()); 175 176 binding = op1.isNotEqualTo(long1, EPSILON); 177 assertEquals(true, binding.get()); 178 179 binding = op1.isNotEqualTo(long1); 180 assertEquals(true, binding.get()); 181 182 binding = op1.isNotEqualTo(integer1, EPSILON); 183 assertEquals(true, binding.get()); 184 185 binding = op1.isNotEqualTo(integer1); 186 assertEquals(true, binding.get()); 187 188 binding = op1.isNotEqualTo(short1, EPSILON); 189 assertEquals(true, binding.get()); 190 191 binding = op1.isNotEqualTo(short1); 192 assertEquals(true, binding.get()); 193 194 binding = op1.isNotEqualTo(byte1, EPSILON); 195 assertEquals(true, binding.get()); 196 197 binding = op1.isNotEqualTo(byte1); 198 assertEquals(true, binding.get()); 199 } 200 201 @Test 202 public void testGreater() { 203 BooleanBinding binding = op1.greaterThan(op1); 204 assertEquals(data1 > data1, binding.get()); 205 206 binding = op1.greaterThan(op2); 207 assertEquals(data1 > data2, binding.get()); 208 209 binding = op2.greaterThan(op1); 210 assertEquals(data2 > data1, binding.get()); 211 212 binding = op2.greaterThan(op2); 213 assertEquals(data2 > data2, binding.get()); 214 215 binding = op1.greaterThan(data1); 216 assertEquals(data1 > data1, binding.get()); 217 218 binding = op1.greaterThan(data2); 219 assertEquals(data1 > data2, binding.get()); 220 221 binding = op2.greaterThan(data1); 222 assertEquals(data2 > data1, binding.get()); 223 224 binding = op2.greaterThan(data2); 225 assertEquals(data2 > data2, binding.get()); 226 227 binding = op1.greaterThan(double1); 228 assertEquals(data1 > double1, binding.get()); 229 230 binding = op1.greaterThan(float1); 231 assertEquals(data1 > float1, binding.get()); 232 233 binding = op1.greaterThan(long1); 234 assertEquals(data1 > long1, binding.get()); 235 236 binding = op1.greaterThan(integer1); 237 assertEquals(data1 > integer1, binding.get()); 238 239 binding = op1.greaterThan(short1); 240 assertEquals(data1 > short1, binding.get()); 241 242 binding = op1.greaterThan(byte1); 243 assertEquals(data1 > byte1, binding.get()); 244 } 245 246 @Test 247 public void testLesser() { 248 BooleanBinding binding = op1.lessThan(op1); 249 assertEquals(data1 < data1, binding.get()); 250 251 binding = op1.lessThan(op2); 252 assertEquals(data1 < data2, binding.get()); 253 254 binding = op2.lessThan(op1); 255 assertEquals(data2 < data1, binding.get()); 256 257 binding = op2.lessThan(op2); 258 assertEquals(data2 < data2, binding.get()); 259 260 binding = op1.lessThan(data1); 261 assertEquals(data1 < data1, binding.get()); 262 263 binding = op1.lessThan(data2); 264 assertEquals(data1 < data2, binding.get()); 265 266 binding = op2.lessThan(data1); 267 assertEquals(data2 < data1, binding.get()); 268 269 binding = op2.lessThan(data2); 270 assertEquals(data2 < data2, binding.get()); 271 272 binding = op1.lessThan(double1); 273 assertEquals(data1 < double1, binding.get()); 274 275 binding = op1.lessThan(float1); 276 assertEquals(data1 < float1, binding.get()); 277 278 binding = op1.lessThan(long1); 279 assertEquals(data1 < long1, binding.get()); 280 281 binding = op1.lessThan(integer1); 282 assertEquals(data1 < integer1, binding.get()); 283 284 binding = op1.lessThan(short1); 285 assertEquals(data1 < short1, binding.get()); 286 287 binding = op1.lessThan(byte1); 288 assertEquals(data1 < byte1, binding.get()); 289 } 290 291 @Test 292 public void testGreaterOrEqual() { 293 BooleanBinding binding = op1.greaterThanOrEqualTo(op1); 294 assertEquals(data1 >= data1, binding.get()); 295 296 binding = op1.greaterThanOrEqualTo(op2); 297 assertEquals(data1 >= data2, binding.get()); 298 299 binding = op2.greaterThanOrEqualTo(op1); 300 assertEquals(data2 >= data1, binding.get()); 301 302 binding = op2.greaterThanOrEqualTo(op2); 303 assertEquals(data2 >= data2, binding.get()); 304 305 binding = op1.greaterThanOrEqualTo(data1); 306 assertEquals(data1 >= data1, binding.get()); 307 308 binding = op1.greaterThanOrEqualTo(data2); 309 assertEquals(data1 >= data2, binding.get()); 310 311 binding = op2.greaterThanOrEqualTo(data1); 312 assertEquals(data2 >= data1, binding.get()); 313 314 binding = op2.greaterThanOrEqualTo(data2); 315 assertEquals(data2 >= data2, binding.get()); 316 317 binding = op1.greaterThanOrEqualTo(double1); 318 assertEquals(data1 >= double1, binding.get()); 319 320 binding = op1.greaterThanOrEqualTo(float1); 321 assertEquals(data1 >= float1, binding.get()); 322 323 binding = op1.greaterThanOrEqualTo(long1); 324 assertEquals(data1 >= long1, binding.get()); 325 326 binding = op1.greaterThanOrEqualTo(integer1); 327 assertEquals(data1 >= integer1, binding.get()); 328 329 binding = op1.greaterThanOrEqualTo(short1); 330 assertEquals(data1 >= short1, binding.get()); 331 332 binding = op1.greaterThanOrEqualTo(byte1); 333 assertEquals(data1 >= byte1, binding.get()); 334 } 335 336 @Test 337 public void testLesserOrEqual() { 338 BooleanBinding binding = op1.lessThanOrEqualTo(op1); 339 assertEquals(data1 <= data1, binding.get()); 340 341 binding = op1.lessThanOrEqualTo(op2); 342 assertEquals(data1 <= data2, binding.get()); 343 344 binding = op2.lessThanOrEqualTo(op1); 345 assertEquals(data2 <= data1, binding.get()); 346 347 binding = op2.lessThanOrEqualTo(op2); 348 assertEquals(data2 <= data2, binding.get()); 349 350 binding = op1.lessThanOrEqualTo(data1); 351 assertEquals(data1 <= data1, binding.get()); 352 353 binding = op1.lessThanOrEqualTo(data2); 354 assertEquals(data1 <= data2, binding.get()); 355 356 binding = op2.lessThanOrEqualTo(data1); 357 assertEquals(data2 <= data1, binding.get()); 358 359 binding = op2.lessThanOrEqualTo(data2); 360 assertEquals(data2 <= data2, binding.get()); 361 362 binding = op1.lessThanOrEqualTo(double1); 363 assertEquals(data1 <= double1, binding.get()); 364 365 binding = op1.lessThanOrEqualTo(float1); 366 assertEquals(data1 <= float1, binding.get()); 367 368 binding = op1.lessThanOrEqualTo(long1); 369 assertEquals(data1 <= long1, binding.get()); 370 371 binding = op1.lessThanOrEqualTo(integer1); 372 assertEquals(data1 <= integer1, binding.get()); 373 374 binding = op1.lessThanOrEqualTo(short1); 375 assertEquals(data1 <= short1, binding.get()); 376 377 binding = op1.lessThanOrEqualTo(byte1); 378 assertEquals(data1 <= byte1, binding.get()); 379 } 380 381 public void testFactory() { 382 assertEquals(op1, NumberExpressionBase.numberExpression(op1)); 383 384 final ObservableDoubleValueStub double2 = new ObservableDoubleValueStub(); 385 double2.set(double1); 386 NumberExpressionBase exp = NumberExpressionBase.numberExpression(double2); 387 assertTrue(exp instanceof DoubleBinding); 388 assertEquals(FXCollections.singletonObservableList(double2), ((NumberBinding)exp).getDependencies()); 389 assertEquals(double1, exp.doubleValue(), EPSILON); 390 double2.set(0.0); 391 assertEquals(0.0, exp.doubleValue(), EPSILON); 392 393 final ObservableFloatValueStub float2 = new ObservableFloatValueStub(); 394 float2.set(float1); 395 exp = NumberExpressionBase.numberExpression(float2); 396 assertTrue(exp instanceof FloatBinding); 397 assertEquals(FXCollections.singletonObservableList(float2), ((NumberBinding)exp).getDependencies()); 398 assertEquals(float1, exp.floatValue(), EPSILON); 399 float2.set(0.0f); 400 assertEquals(0.0f, exp.floatValue(), EPSILON); 401 402 final ObservableLongValueStub long2 = new ObservableLongValueStub(); 403 long2.set(long1); 404 exp = NumberExpressionBase.numberExpression(long2); 405 assertTrue(exp instanceof LongBinding); 406 assertEquals(FXCollections.singletonObservableList(long2), ((NumberBinding)exp).getDependencies()); 407 assertEquals(long1, exp.longValue()); 408 long2.set(0L); 409 assertEquals(0, exp.longValue()); 410 411 final ObservableIntegerValueStub integer2 = new ObservableIntegerValueStub(); 412 integer2.set(integer1); 413 exp = NumberExpressionBase.numberExpression(integer2); 414 assertTrue(exp instanceof IntegerBinding); 415 assertEquals(FXCollections.singletonObservableList(integer2), ((NumberBinding)exp).getDependencies()); 416 assertEquals(integer1, exp.intValue()); 417 integer2.set(0); 418 assertEquals(0, exp.intValue()); 419 } 420 421 @Test(expected=NullPointerException.class) 422 public void testFactory_Null() { 423 NumberExpressionBase.numberExpression(null); 424 } 425 426 @Test(expected=IllegalArgumentException.class) 427 public void testFactory_UnknownClass() { 428 NumberExpressionBase.numberExpression(new ObservableNumberValue() { 429 @Override public void addListener(InvalidationListener observer) {} 430 @Override public void addListener(ChangeListener observer) {} 431 @Override public void removeListener(InvalidationListener observer) {} 432 @Override public void removeListener(ChangeListener observer) {} 433 @Override public Number getValue() {return null;} 434 @Override public int intValue() {return 0;} 435 @Override public long longValue() {return 0L;} 436 @Override public float floatValue() {return 0.0f;} 437 @Override public double doubleValue() {return 0.0;} 438 }); 439 } 440 441 @Test 442 public void testAsString() { 443 final IntegerProperty i = new SimpleIntegerProperty(); 444 final StringBinding s = i.asString(); 445 DependencyUtils.checkDependencies(s.getDependencies(), i); 446 assertEquals("0", s.get()); 447 i.set(42); 448 assertEquals("42", s.get()); 449 } 450 451 @Ignore("RT-33413") 452 @Test 453 public void testAsString_Format() { 454 final Locale defaultLocale = Locale.getDefault(); 455 try { 456 // checking German default 457 Locale.setDefault(Locale.GERMAN); 458 final DoubleProperty d = new SimpleDoubleProperty(Math.PI); 459 StringBinding s = d.asString("%.4f"); 460 DependencyUtils.checkDependencies(s.getDependencies(), d); 461 assertEquals("3,1416", s.get()); 462 d.set(Math.E); 463 assertEquals("2,7183", s.get()); 464 465 // checking US default 466 Locale.setDefault(Locale.US); 467 d.set(Math.PI); 468 assertEquals("3.1416", s.get()); 469 d.set(Math.E); 470 assertEquals("2.7183", s.get()); 471 } finally { 472 Locale.setDefault(defaultLocale); 473 } 474 } 475 476 @Ignore("RT-33413") 477 @Test 478 public void testAsString_LocaleFormat() { 479 // checking German default 480 final DoubleProperty d = new SimpleDoubleProperty(Math.PI); 481 StringBinding s = d.asString(Locale.GERMAN, "%.4f"); 482 DependencyUtils.checkDependencies(s.getDependencies(), d); 483 assertEquals("3,1416", s.get()); 484 d.set(Math.E); 485 assertEquals("2,7183", s.get()); 486 487 // checking US default 488 s = d.asString(Locale.US, "%.4f"); 489 DependencyUtils.checkDependencies(s.getDependencies(), d); 490 d.set(Math.PI); 491 assertEquals("3.1416", s.get()); 492 d.set(Math.E); 493 assertEquals("2.7183", s.get()); 494 } 495 }