1 /*
   2  * Copyright (c) 2010, 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 
  30 import java.util.Arrays;
  31 import java.util.Collection;
  32 
  33 import javafx.beans.InvalidationListenerMock;
  34 import javafx.beans.binding.Binding;
  35 import javafx.beans.binding.Bindings;
  36 import javafx.beans.property.DoubleProperty;
  37 import javafx.beans.property.FloatProperty;
  38 import javafx.beans.property.IntegerProperty;
  39 import javafx.beans.property.LongProperty;
  40 import javafx.beans.property.SimpleDoubleProperty;
  41 import javafx.beans.property.SimpleFloatProperty;
  42 import javafx.beans.property.SimpleIntegerProperty;
  43 import javafx.beans.property.SimpleLongProperty;
  44 import javafx.beans.value.*;
  45 
  46 import org.junit.Before;
  47 import org.junit.Test;
  48 import org.junit.runner.RunWith;
  49 import org.junit.runners.Parameterized;
  50 
  51 @RunWith(Parameterized.class)
  52 public class BindingsNumberCalculationsTest<T> {
  53 
  54     private static final float EPSILON_FLOAT = 1e-5f;
  55     private static final double EPSILON_DOUBLE = 1e-10;
  56 
  57     public static interface Functions<S> {
  58         Binding generateExpressionExpression(Object op1, Object op2);
  59         Binding generateExpressionPrimitive(Object op1, S op2);
  60         Binding generatePrimitiveExpression(S op1, Object op2);
  61         void setOp1(S value);
  62         void setOp2(S value);
  63         void check(S op1, S op2, ObservableValue exp);
  64     }
  65 
  66     private final ObservableValue op1;
  67     private final ObservableValue op2;
  68     private final Functions<T> func;
  69     private final T[] v;
  70     private InvalidationListenerMock observer;
  71 
  72     public BindingsNumberCalculationsTest(ObservableValue op1, ObservableValue op2, Functions<T> func, T[] v) {
  73         this.op1 = op1;
  74         this.op2 = op2;
  75         this.func = func;
  76         this.v = v;
  77     }
  78 
  79     @Before
  80     public void setUp() {
  81         func.setOp1(v[0]);
  82         func.setOp2(v[1]);
  83         observer = new InvalidationListenerMock();
  84     }
  85 
  86     @Test
  87     public void test_Expression_Expression() {
  88         final Binding binding = func.generateExpressionExpression(op1, op2);
  89         binding.addListener(observer);
  90 
  91         // check initial value
  92         func.check(v[0], v[1], binding);
  93         DependencyUtils.checkDependencies(binding.getDependencies(), op1, op2);
  94 
  95         // change first operand
  96         observer.reset();
  97         func.setOp1(v[2]);
  98         func.check(v[2], v[1], binding);
  99         observer.check(binding, 1);
 100 
 101         // change second operand
 102         func.setOp2(v[3]);
 103         func.check(v[2], v[3], binding);
 104         observer.check(binding, 1);
 105 
 106         // change both operands
 107         func.setOp1(v[4]);
 108         func.setOp2(v[5]);
 109         func.check(v[4], v[5], binding);
 110         observer.check(binding, 1);
 111     }
 112 
 113     @Test
 114     public void test_Self() {
 115         // using same FloatValue twice
 116         final Binding binding = func.generateExpressionExpression(op1, op1);
 117         binding.addListener(observer);
 118 
 119         // check initial value
 120         func.check(v[0], v[0], binding);
 121 
 122         // change value
 123         observer.reset();
 124         func.setOp1(v[7]);
 125         func.check(v[7], v[7], binding);
 126         observer.check(binding, 1);
 127     }
 128 
 129     @Test(expected=NullPointerException.class)
 130     public void test_null_Expression() {
 131         func.generateExpressionExpression(null, op1);
 132     }
 133 
 134     @Test(expected=NullPointerException.class)
 135     public void test_Expression_null() {
 136         func.generateExpressionExpression(op1, null);
 137     }
 138 
 139     @Test
 140     public void test_Expression_Primitive() {
 141         final Binding binding = func.generateExpressionPrimitive(op1, v[7]);
 142         binding.addListener(observer);
 143 
 144         // check initial value
 145         func.check(v[0], v[7], binding);
 146         DependencyUtils.checkDependencies(binding.getDependencies(), op1);
 147 
 148         // change first operand
 149         observer.reset();
 150         func.setOp1(v[8]);
 151         func.check(v[8], v[7], binding);
 152         observer.check(binding, 1);
 153     }
 154 
 155     @Test(expected=NullPointerException.class)
 156     public void test_null_Primitive() {
 157         func.generateExpressionPrimitive(null, v[0]);
 158     }
 159 
 160     @Test
 161     public void test_Primitive_Expression() {
 162         final Binding binding = func.generatePrimitiveExpression(v[9], op1);
 163         binding.addListener(observer);
 164 
 165         // check initial value
 166         func.check(v[9], v[0], binding);
 167         DependencyUtils.checkDependencies(binding.getDependencies(), op1);
 168 
 169         // change first operand
 170         observer.reset();
 171         func.setOp1(v[10]);
 172         func.check(v[9], v[10], binding);
 173         observer.check(binding, 1);
 174     }
 175 
 176     @Test(expected=NullPointerException.class)
 177     public void test_Primitive_null() {
 178         func.generatePrimitiveExpression(v[0], null);
 179     }
 180 
 181     @Parameterized.Parameters
 182     public static Collection<Object[]> parameters() {
 183         final FloatProperty float1 = new SimpleFloatProperty();
 184         final FloatProperty float2 = new SimpleFloatProperty();
 185         final Float[] floatData = new Float[] {-3592.9f, 234872.8347f, 3897.274f, 3958.938745f, -8347.3478f, 217.902874f, -2784.827f, -28723.7824f, 82.8274f, -12.23478f, 0.92874f};
 186 
 187         final DoubleProperty double1 = new SimpleDoubleProperty();
 188         final DoubleProperty double2 = new SimpleDoubleProperty();
 189         final Double[] doubleData = new Double[] {2348.2345, -92.214, -214.0214, -908.214, 67.124, 0.214, 2893.124, -214.987234, -89724.897234, 234.25, 8721.234};
 190 
 191         final IntegerProperty int1 = new SimpleIntegerProperty();
 192         final IntegerProperty int2 = new SimpleIntegerProperty();
 193         final Integer[] integerData = new Integer[] {248, -9384, -234, -34, -450809, 342345, 8923489, 23789, -89234, -13134, 23134879};
 194 
 195         final LongProperty long1 = new SimpleLongProperty();
 196         final LongProperty long2 = new SimpleLongProperty();
 197         final Long[] longData = new Long[] {9823984L, 2908934L, -234234L, 9089234L, 132323L, -89324L, -12424L, -8923442L, 78234L, -233487L, 988998L};
 198 
 199         return Arrays.asList(new Object[][] {
 200             // float
 201             {
 202                 float1, float2,
 203                 new Functions<Float>() {
 204                     @Override
 205                     public Binding generateExpressionExpression(Object op1, Object op2) {
 206                         return Bindings.add((ObservableFloatValue)op1, (ObservableFloatValue)op2);
 207                     }
 208                     @Override
 209                     public Binding generateExpressionPrimitive(Object op1, Float op2) {
 210                         return Bindings.add((ObservableFloatValue)op1, op2.floatValue());
 211                     }
 212                     @Override
 213                     public Binding generatePrimitiveExpression(Float op1, Object op2) {
 214                         return Bindings.add(op1.floatValue(), (ObservableFloatValue)op2);
 215                     }
 216                     @Override
 217                     public void setOp1(Float value) {float1.set(value);}
 218                     @Override
 219                     public void setOp2(Float value) {float2.set(value);}
 220                     @Override
 221                     public void check(Float op1, Float op2, ObservableValue exp) {
 222                         assertEquals(op1 + op2, ((ObservableFloatValue)exp).get(), EPSILON_FLOAT);
 223                     }
 224                 },
 225                 floatData
 226             },
 227             {
 228                 float1, float2,
 229                 new Functions<Float>() {
 230                     @Override
 231                     public Binding generateExpressionExpression(Object op1, Object op2) {
 232                         return Bindings.subtract((ObservableFloatValue)op1, (ObservableFloatValue)op2);
 233                     }
 234                     @Override
 235                     public Binding generateExpressionPrimitive(Object op1, Float op2) {
 236                         return Bindings.subtract((ObservableFloatValue)op1, op2.floatValue());
 237                     }
 238                     @Override
 239                     public Binding generatePrimitiveExpression(Float op1, Object op2) {
 240                         return Bindings.subtract(op1.floatValue(), (ObservableFloatValue)op2);
 241                     }
 242                     @Override
 243                     public void setOp1(Float value) {float1.set(value);}
 244                     @Override
 245                     public void setOp2(Float value) {float2.set(value);}
 246                     @Override
 247                     public void check(Float op1, Float op2, ObservableValue exp) {
 248                         assertEquals(op1 - op2, ((ObservableFloatValue)exp).get(), EPSILON_FLOAT);
 249                     }
 250                 },
 251                 floatData
 252             },
 253             {
 254                 float1, float2,
 255                 new Functions<Float>() {
 256                     @Override
 257                     public Binding generateExpressionExpression(Object op1, Object op2) {
 258                         return Bindings.multiply((ObservableFloatValue)op1, (ObservableFloatValue)op2);
 259                     }
 260                     @Override
 261                     public Binding generateExpressionPrimitive(Object op1, Float op2) {
 262                         return Bindings.multiply((ObservableFloatValue)op1, op2.floatValue());
 263                     }
 264                     @Override
 265                     public Binding generatePrimitiveExpression(Float op1, Object op2) {
 266                         return Bindings.multiply(op1.floatValue(), (ObservableFloatValue)op2);
 267                     }
 268                     @Override
 269                     public void setOp1(Float value) {float1.set(value);}
 270                     @Override
 271                     public void setOp2(Float value) {float2.set(value);}
 272                     @Override
 273                     public void check(Float op1, Float op2, ObservableValue exp) {
 274                         assertEquals(op1 * op2, ((ObservableFloatValue)exp).get(), EPSILON_FLOAT);
 275                     }
 276                 },
 277                 floatData
 278             },
 279             {
 280                 float1, float2,
 281                 new Functions<Float>() {
 282                     @Override
 283                     public Binding generateExpressionExpression(Object op1, Object op2) {
 284                         return Bindings.divide((ObservableFloatValue)op1, (ObservableFloatValue)op2);
 285                     }
 286                     @Override
 287                     public Binding generateExpressionPrimitive(Object op1, Float op2) {
 288                         return Bindings.divide((ObservableFloatValue)op1, op2.floatValue());
 289                     }
 290                     @Override
 291                     public Binding generatePrimitiveExpression(Float op1, Object op2) {
 292                         return Bindings.divide(op1.floatValue(), (ObservableFloatValue)op2);
 293                     }
 294                     @Override
 295                     public void setOp1(Float value) {float1.set(value);}
 296                     @Override
 297                     public void setOp2(Float value) {float2.set(value);}
 298                     @Override
 299                     public void check(Float op1, Float op2, ObservableValue exp) {
 300                         assertEquals(op1 / op2, ((ObservableFloatValue)exp).get(), EPSILON_FLOAT);
 301                     }
 302                 },
 303                 floatData
 304             },
 305             {
 306                 float1, float2,
 307                 new Functions<Float>() {
 308                     @Override
 309                     public Binding generateExpressionExpression(Object op1, Object op2) {
 310                         return Bindings.min((ObservableFloatValue)op1, (ObservableFloatValue)op2);
 311                     }
 312                     @Override
 313                     public Binding generateExpressionPrimitive(Object op1, Float op2) {
 314                         return Bindings.min((ObservableFloatValue)op1, op2.floatValue());
 315                     }
 316                     @Override
 317                     public Binding generatePrimitiveExpression(Float op1, Object op2) {
 318                         return Bindings.min(op1.floatValue(), (ObservableFloatValue)op2);
 319                     }
 320                     @Override
 321                     public void setOp1(Float value) {float1.set(value);}
 322                     @Override
 323                     public void setOp2(Float value) {float2.set(value);}
 324                     @Override
 325                     public void check(Float op1, Float op2, ObservableValue exp) {
 326                         assertEquals(Math.min(op1, op2), ((ObservableFloatValue)exp).get(), EPSILON_FLOAT);
 327                     }
 328                 },
 329                 floatData
 330             },
 331             {
 332                 float1, float2,
 333                 new Functions<Float>() {
 334                     @Override
 335                     public Binding generateExpressionExpression(Object op1, Object op2) {
 336                         return Bindings.max((ObservableFloatValue)op1, (ObservableFloatValue)op2);
 337                     }
 338                     @Override
 339                     public Binding generateExpressionPrimitive(Object op1, Float op2) {
 340                         return Bindings.max((ObservableFloatValue)op1, op2.floatValue());
 341                     }
 342                     @Override
 343                     public Binding generatePrimitiveExpression(Float op1, Object op2) {
 344                         return Bindings.max(op1.floatValue(), (ObservableFloatValue)op2);
 345                     }
 346                     @Override
 347                     public void setOp1(Float value) {float1.set(value);}
 348                     @Override
 349                     public void setOp2(Float value) {float2.set(value);}
 350                     @Override
 351                     public void check(Float op1, Float op2, ObservableValue exp) {
 352                         assertEquals(Math.max(op1, op2), ((ObservableFloatValue)exp).get(), EPSILON_FLOAT);
 353                     }
 354                 },
 355                 floatData
 356             },
 357 
 358 
 359 
 360             // double
 361             {
 362                 double1, double2,
 363                 new Functions<Double>() {
 364                     @Override
 365                     public Binding generateExpressionExpression(Object op1, Object op2) {
 366                         return Bindings.add((ObservableDoubleValue)op1, (ObservableDoubleValue)op2);
 367                     }
 368                     @Override
 369                     public Binding generateExpressionPrimitive(Object op1, Double op2) {
 370                         return Bindings.add((ObservableDoubleValue)op1, op2.doubleValue());
 371                     }
 372                     @Override
 373                     public Binding generatePrimitiveExpression(Double op1, Object op2) {
 374                         return Bindings.add(op1.doubleValue(), (ObservableDoubleValue)op2);
 375                     }
 376                     @Override
 377                     public void setOp1(Double value) {double1.set(value);}
 378                     @Override
 379                     public void setOp2(Double value) {double2.set(value);}
 380                     @Override
 381                     public void check(Double op1, Double op2, ObservableValue exp) {
 382                         assertEquals(op1 + op2, ((ObservableDoubleValue)exp).get(), EPSILON_DOUBLE);
 383                     }
 384                 },
 385                 doubleData
 386             },
 387             {
 388                 double1, double2,
 389                 new Functions<Double>() {
 390                     @Override
 391                     public Binding generateExpressionExpression(Object op1, Object op2) {
 392                         return Bindings.subtract((ObservableDoubleValue)op1, (ObservableDoubleValue)op2);
 393                     }
 394                     @Override
 395                     public Binding generateExpressionPrimitive(Object op1, Double op2) {
 396                         return Bindings.subtract((ObservableDoubleValue)op1, op2.doubleValue());
 397                     }
 398                     @Override
 399                     public Binding generatePrimitiveExpression(Double op1, Object op2) {
 400                         return Bindings.subtract(op1.doubleValue(), (ObservableDoubleValue)op2);
 401                     }
 402                     @Override
 403                     public void setOp1(Double value) {double1.set(value);}
 404                     @Override
 405                     public void setOp2(Double value) {double2.set(value);}
 406                     @Override
 407                     public void check(Double op1, Double op2, ObservableValue exp) {
 408                         assertEquals(op1 - op2, ((ObservableDoubleValue)exp).get(), EPSILON_DOUBLE);
 409                     }
 410                 },
 411                 doubleData
 412             },
 413             {
 414                 double1, double2,
 415                 new Functions<Double>() {
 416                     @Override
 417                     public Binding generateExpressionExpression(Object op1, Object op2) {
 418                         return Bindings.multiply((ObservableDoubleValue)op1, (ObservableDoubleValue)op2);
 419                     }
 420                     @Override
 421                     public Binding generateExpressionPrimitive(Object op1, Double op2) {
 422                         return Bindings.multiply((ObservableDoubleValue)op1, op2.doubleValue());
 423                     }
 424                     @Override
 425                     public Binding generatePrimitiveExpression(Double op1, Object op2) {
 426                         return Bindings.multiply(op1.doubleValue(), (ObservableDoubleValue)op2);
 427                     }
 428                     @Override
 429                     public void setOp1(Double value) {double1.set(value);}
 430                     @Override
 431                     public void setOp2(Double value) {double2.set(value);}
 432                     @Override
 433                     public void check(Double op1, Double op2, ObservableValue exp) {
 434                         assertEquals(op1 * op2, ((ObservableDoubleValue)exp).get(), EPSILON_DOUBLE);
 435                     }
 436                 },
 437                 doubleData
 438             },
 439             {
 440                 double1, double2,
 441                 new Functions<Double>() {
 442                     @Override
 443                     public Binding generateExpressionExpression(Object op1, Object op2) {
 444                         return Bindings.divide((ObservableDoubleValue)op1, (ObservableDoubleValue)op2);
 445                     }
 446                     @Override
 447                     public Binding generateExpressionPrimitive(Object op1, Double op2) {
 448                         return Bindings.divide((ObservableDoubleValue)op1, op2.doubleValue());
 449                     }
 450                     @Override
 451                     public Binding generatePrimitiveExpression(Double op1, Object op2) {
 452                         return Bindings.divide(op1.doubleValue(), (ObservableDoubleValue)op2);
 453                     }
 454                     @Override
 455                     public void setOp1(Double value) {double1.set(value);}
 456                     @Override
 457                     public void setOp2(Double value) {double2.set(value);}
 458                     @Override
 459                     public void check(Double op1, Double op2, ObservableValue exp) {
 460                         assertEquals(op1 / op2, ((ObservableDoubleValue)exp).get(), EPSILON_DOUBLE);
 461                     }
 462                 },
 463                 doubleData
 464             },
 465             {
 466                 double1, double2,
 467                 new Functions<Double>() {
 468                     @Override
 469                     public Binding generateExpressionExpression(Object op1, Object op2) {
 470                         return Bindings.min((ObservableDoubleValue)op1, (ObservableDoubleValue)op2);
 471                     }
 472                     @Override
 473                     public Binding generateExpressionPrimitive(Object op1, Double op2) {
 474                         return Bindings.min((ObservableDoubleValue)op1, op2.doubleValue());
 475                     }
 476                     @Override
 477                     public Binding generatePrimitiveExpression(Double op1, Object op2) {
 478                         return Bindings.min(op1.doubleValue(), (ObservableDoubleValue)op2);
 479                     }
 480                     @Override
 481                     public void setOp1(Double value) {double1.set(value);}
 482                     @Override
 483                     public void setOp2(Double value) {double2.set(value);}
 484                     @Override
 485                     public void check(Double op1, Double op2, ObservableValue exp) {
 486                         assertEquals(Math.min(op1, op2), ((ObservableDoubleValue)exp).get(), EPSILON_DOUBLE);
 487                     }
 488                 },
 489                 doubleData
 490             },
 491             {
 492                 double1, double2,
 493                 new Functions<Double>() {
 494                     @Override
 495                     public Binding generateExpressionExpression(Object op1, Object op2) {
 496                         return Bindings.max((ObservableDoubleValue)op1, (ObservableDoubleValue)op2);
 497                     }
 498                     @Override
 499                     public Binding generateExpressionPrimitive(Object op1, Double op2) {
 500                         return Bindings.max((ObservableDoubleValue)op1, op2.doubleValue());
 501                     }
 502                     @Override
 503                     public Binding generatePrimitiveExpression(Double op1, Object op2) {
 504                         return Bindings.max(op1.doubleValue(), (ObservableDoubleValue)op2);
 505                     }
 506                     @Override
 507                     public void setOp1(Double value) {double1.set(value);}
 508                     @Override
 509                     public void setOp2(Double value) {double2.set(value);}
 510                     @Override
 511                     public void check(Double op1, Double op2, ObservableValue exp) {
 512                         assertEquals(Math.max(op1, op2), ((ObservableDoubleValue)exp).get(), EPSILON_DOUBLE);
 513                     }
 514                 },
 515                 doubleData
 516             },
 517 
 518 
 519 
 520             // int
 521             {
 522                 int1, int2,
 523                 new Functions<Integer>() {
 524                     @Override
 525                     public Binding generateExpressionExpression(Object op1, Object op2) {
 526                         return Bindings.add((ObservableIntegerValue)op1, (ObservableIntegerValue)op2);
 527                     }
 528                     @Override
 529                     public Binding generateExpressionPrimitive(Object op1, Integer op2) {
 530                         return Bindings.add((ObservableIntegerValue)op1, op2.intValue());
 531                     }
 532                     @Override
 533                     public Binding generatePrimitiveExpression(Integer op1, Object op2) {
 534                         return Bindings.add(op1.intValue(), (ObservableIntegerValue)op2);
 535                     }
 536                     @Override
 537                     public void setOp1(Integer value) {int1.set(value);}
 538                     @Override
 539                     public void setOp2(Integer value) {int2.set(value);}
 540                     @Override
 541                     public void check(Integer op1, Integer op2, ObservableValue exp) {
 542                         assertEquals(op1 + op2, ((ObservableIntegerValue)exp).get());
 543                     }
 544                 },
 545                 integerData
 546             },
 547             {
 548                 int1, int2,
 549                 new Functions<Integer>() {
 550                     @Override
 551                     public Binding generateExpressionExpression(Object op1, Object op2) {
 552                         return Bindings.subtract((ObservableIntegerValue)op1, (ObservableIntegerValue)op2);
 553                     }
 554                     @Override
 555                     public Binding generateExpressionPrimitive(Object op1, Integer op2) {
 556                         return Bindings.subtract((ObservableIntegerValue)op1, op2.intValue());
 557                     }
 558                     @Override
 559                     public Binding generatePrimitiveExpression(Integer op1, Object op2) {
 560                         return Bindings.subtract(op1.intValue(), (ObservableIntegerValue)op2);
 561                     }
 562                     @Override
 563                     public void setOp1(Integer value) {int1.set(value);}
 564                     @Override
 565                     public void setOp2(Integer value) {int2.set(value);}
 566                     @Override
 567                     public void check(Integer op1, Integer op2, ObservableValue exp) {
 568                         assertEquals(op1 - op2, ((ObservableIntegerValue)exp).get());
 569                     }
 570                 },
 571                 integerData
 572             },
 573             {
 574                 int1, int2,
 575                 new Functions<Integer>() {
 576                     @Override
 577                     public Binding generateExpressionExpression(Object op1, Object op2) {
 578                         return Bindings.multiply((ObservableIntegerValue)op1, (ObservableIntegerValue)op2);
 579                     }
 580                     @Override
 581                     public Binding generateExpressionPrimitive(Object op1, Integer op2) {
 582                         return Bindings.multiply((ObservableIntegerValue)op1, op2.intValue());
 583                     }
 584                     @Override
 585                     public Binding generatePrimitiveExpression(Integer op1, Object op2) {
 586                         return Bindings.multiply(op1.intValue(), (ObservableIntegerValue)op2);
 587                     }
 588                     @Override
 589                     public void setOp1(Integer value) {int1.set(value);}
 590                     @Override
 591                     public void setOp2(Integer value) {int2.set(value);}
 592                     @Override
 593                     public void check(Integer op1, Integer op2, ObservableValue exp) {
 594                         assertEquals(op1 * op2, ((ObservableIntegerValue)exp).get());
 595                     }
 596                 },
 597                 integerData
 598             },
 599             {
 600                 int1, int2,
 601                 new Functions<Integer>() {
 602                     @Override
 603                     public Binding generateExpressionExpression(Object op1, Object op2) {
 604                         return Bindings.divide((ObservableIntegerValue)op1, (ObservableIntegerValue)op2);
 605                     }
 606                     @Override
 607                     public Binding generateExpressionPrimitive(Object op1, Integer op2) {
 608                         return Bindings.divide((ObservableIntegerValue)op1, op2.intValue());
 609                     }
 610                     @Override
 611                     public Binding generatePrimitiveExpression(Integer op1, Object op2) {
 612                         return Bindings.divide(op1.intValue(), (ObservableIntegerValue)op2);
 613                     }
 614                     @Override
 615                     public void setOp1(Integer value) {int1.set(value);}
 616                     @Override
 617                     public void setOp2(Integer value) {int2.set(value);}
 618                     @Override
 619                     public void check(Integer op1, Integer op2, ObservableValue exp) {
 620                         assertEquals(op1 / op2, ((ObservableIntegerValue)exp).get());
 621                     }
 622                 },
 623                 integerData
 624             },
 625             {
 626                 int1, int2,
 627                 new Functions<Integer>() {
 628                     @Override
 629                     public Binding generateExpressionExpression(Object op1, Object op2) {
 630                         return Bindings.min((ObservableIntegerValue)op1, (ObservableIntegerValue)op2);
 631                     }
 632                     @Override
 633                     public Binding generateExpressionPrimitive(Object op1, Integer op2) {
 634                         return Bindings.min((ObservableIntegerValue)op1, op2.intValue());
 635                     }
 636                     @Override
 637                     public Binding generatePrimitiveExpression(Integer op1, Object op2) {
 638                         return Bindings.min(op1.intValue(), (ObservableIntegerValue)op2);
 639                     }
 640                     @Override
 641                     public void setOp1(Integer value) {int1.set(value);}
 642                     @Override
 643                     public void setOp2(Integer value) {int2.set(value);}
 644                     @Override
 645                     public void check(Integer op1, Integer op2, ObservableValue exp) {
 646                         assertEquals(Math.min(op1, op2), ((ObservableIntegerValue)exp).get());
 647                     }
 648                 },
 649                 integerData
 650             },
 651             {
 652                 int1, int2,
 653                 new Functions<Integer>() {
 654                     @Override
 655                     public Binding generateExpressionExpression(Object op1, Object op2) {
 656                         return Bindings.max((ObservableIntegerValue)op1, (ObservableIntegerValue)op2);
 657                     }
 658                     @Override
 659                     public Binding generateExpressionPrimitive(Object op1, Integer op2) {
 660                         return Bindings.max((ObservableIntegerValue)op1, op2.intValue());
 661                     }
 662                     @Override
 663                     public Binding generatePrimitiveExpression(Integer op1, Object op2) {
 664                         return Bindings.max(op1.intValue(), (ObservableIntegerValue)op2);
 665                     }
 666                     @Override
 667                     public void setOp1(Integer value) {int1.set(value);}
 668                     @Override
 669                     public void setOp2(Integer value) {int2.set(value);}
 670                     @Override
 671                     public void check(Integer op1, Integer op2, ObservableValue exp) {
 672                         assertEquals(Math.max(op1, op2), ((ObservableIntegerValue)exp).get());
 673                     }
 674                 },
 675                 integerData
 676             },
 677 
 678 
 679 
 680             // long
 681             {
 682                 long1, long2,
 683                 new Functions<Long>() {
 684                     @Override
 685                     public Binding generateExpressionExpression(Object op1, Object op2) {
 686                         return Bindings.add((ObservableLongValue)op1, (ObservableLongValue)op2);
 687                     }
 688                     @Override
 689                     public Binding generateExpressionPrimitive(Object op1, Long op2) {
 690                         return Bindings.add((ObservableLongValue)op1, op2.longValue());
 691                     }
 692                     @Override
 693                     public Binding generatePrimitiveExpression(Long op1, Object op2) {
 694                         return Bindings.add(op1.longValue(), (ObservableLongValue)op2);
 695                     }
 696                     @Override
 697                     public void setOp1(Long value) {long1.set(value);}
 698                     @Override
 699                     public void setOp2(Long value) {long2.set(value);}
 700                     @Override
 701                     public void check(Long op1, Long op2, ObservableValue exp) {
 702                         assertEquals(op1 + op2, ((ObservableLongValue)exp).get());
 703                     }
 704                 },
 705                 longData
 706             },
 707             {
 708                 long1, long2,
 709                 new Functions<Long>() {
 710                     @Override
 711                     public Binding generateExpressionExpression(Object op1, Object op2) {
 712                         return Bindings.subtract((ObservableLongValue)op1, (ObservableLongValue)op2);
 713                     }
 714                     @Override
 715                     public Binding generateExpressionPrimitive(Object op1, Long op2) {
 716                         return Bindings.subtract((ObservableLongValue)op1, op2.longValue());
 717                     }
 718                     @Override
 719                     public Binding generatePrimitiveExpression(Long op1, Object op2) {
 720                         return Bindings.subtract(op1.longValue(), (ObservableLongValue)op2);
 721                     }
 722                     @Override
 723                     public void setOp1(Long value) {long1.set(value);}
 724                     @Override
 725                     public void setOp2(Long value) {long2.set(value);}
 726                     @Override
 727                     public void check(Long op1, Long op2, ObservableValue exp) {
 728                         assertEquals(op1 - op2, ((ObservableLongValue)exp).get());
 729                     }
 730                 },
 731                 longData
 732             },
 733             {
 734                 long1, long2,
 735                 new Functions<Long>() {
 736                     @Override
 737                     public Binding generateExpressionExpression(Object op1, Object op2) {
 738                         return Bindings.multiply((ObservableLongValue)op1, (ObservableLongValue)op2);
 739                     }
 740                     @Override
 741                     public Binding generateExpressionPrimitive(Object op1, Long op2) {
 742                         return Bindings.multiply((ObservableLongValue)op1, op2.longValue());
 743                     }
 744                     @Override
 745                     public Binding generatePrimitiveExpression(Long op1, Object op2) {
 746                         return Bindings.multiply(op1.longValue(), (ObservableLongValue)op2);
 747                     }
 748                     @Override
 749                     public void setOp1(Long value) {long1.set(value);}
 750                     @Override
 751                     public void setOp2(Long value) {long2.set(value);}
 752                     @Override
 753                     public void check(Long op1, Long op2, ObservableValue exp) {
 754                         assertEquals(op1 * op2, ((ObservableLongValue)exp).get());
 755                     }
 756                 },
 757                 longData
 758             },
 759             {
 760                 long1, long2,
 761                 new Functions<Long>() {
 762                     @Override
 763                     public Binding generateExpressionExpression(Object op1, Object op2) {
 764                         return Bindings.divide((ObservableLongValue)op1, (ObservableLongValue)op2);
 765                     }
 766                     @Override
 767                     public Binding generateExpressionPrimitive(Object op1, Long op2) {
 768                         return Bindings.divide((ObservableLongValue)op1, op2.longValue());
 769                     }
 770                     @Override
 771                     public Binding generatePrimitiveExpression(Long op1, Object op2) {
 772                         return Bindings.divide(op1.longValue(), (ObservableLongValue)op2);
 773                     }
 774                     @Override
 775                     public void setOp1(Long value) {long1.set(value);}
 776                     @Override
 777                     public void setOp2(Long value) {long2.set(value);}
 778                     @Override
 779                     public void check(Long op1, Long op2, ObservableValue exp) {
 780                         assertEquals(op1 / op2, ((ObservableLongValue)exp).get());
 781                     }
 782                 },
 783                 longData
 784             },
 785             {
 786                 long1, long2,
 787                 new Functions<Long>() {
 788                     @Override
 789                     public Binding generateExpressionExpression(Object op1, Object op2) {
 790                         return Bindings.min((ObservableLongValue)op1, (ObservableLongValue)op2);
 791                     }
 792                     @Override
 793                     public Binding generateExpressionPrimitive(Object op1, Long op2) {
 794                         return Bindings.min((ObservableLongValue)op1, op2.longValue());
 795                     }
 796                     @Override
 797                     public Binding generatePrimitiveExpression(Long op1, Object op2) {
 798                         return Bindings.min(op1.longValue(), (ObservableLongValue)op2);
 799                     }
 800                     @Override
 801                     public void setOp1(Long value) {long1.set(value);}
 802                     @Override
 803                     public void setOp2(Long value) {long2.set(value);}
 804                     @Override
 805                     public void check(Long op1, Long op2, ObservableValue exp) {
 806                         assertEquals(Math.min(op1, op2), ((ObservableLongValue)exp).get());
 807                     }
 808                 },
 809                 longData
 810             },
 811             {
 812                 long1, long2,
 813                 new Functions<Long>() {
 814                     @Override
 815                     public Binding generateExpressionExpression(Object op1, Object op2) {
 816                         return Bindings.max((ObservableLongValue)op1, (ObservableLongValue)op2);
 817                     }
 818                     @Override
 819                     public Binding generateExpressionPrimitive(Object op1, Long op2) {
 820                         return Bindings.max((ObservableLongValue)op1, op2.longValue());
 821                     }
 822                     @Override
 823                     public Binding generatePrimitiveExpression(Long op1, Object op2) {
 824                         return Bindings.max(op1.longValue(), (ObservableLongValue)op2);
 825                     }
 826                     @Override
 827                     public void setOp1(Long value) {long1.set(value);}
 828                     @Override
 829                     public void setOp2(Long value) {long2.set(value);}
 830                     @Override
 831                     public void check(Long op1, Long op2, ObservableValue exp) {
 832                         assertEquals(Math.max(op1, op2), ((ObservableLongValue)exp).get());
 833                     }
 834                 },
 835                 longData
 836             },
 837         });
 838     };
 839 }