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 }