modules/graphics/src/test/java/test/com/sun/scenario/animation/shared/GeneralClipInterpolatorTest.java

Print this page
rev 9250 : 8134762: Refactor Javafx graphics module tests for clear separation of tests
Reviewed-by:


   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.scenario.animation.shared;
  27 
  28 import com.sun.javafx.animation.TickCalculation;

  29 import static org.junit.Assert.assertEquals;
  30 import static org.junit.Assert.assertNotSame;
  31 import static org.junit.Assert.assertSame;
  32 import static org.junit.Assert.assertTrue;
  33 import javafx.animation.KeyFrame;
  34 import javafx.animation.KeyValue;
  35 import javafx.beans.property.IntegerProperty;
  36 import javafx.beans.property.SimpleIntegerProperty;
  37 import javafx.util.Duration;
  38 
  39 import org.junit.Test;
  40 
  41 public class GeneralClipInterpolatorTest {
  42         
  43         @Test
  44         public void testSetKeyFrame() {
  45         final KeyFrame kf1 = new KeyFrame(Duration.ZERO);
  46         final KeyFrame kf2 = new KeyFrame(Duration.millis(1000));
  47         final KeyFrame kf3 = new KeyFrame(Duration.millis(2000));
  48         final GeneralClipInterpolator gci = new GeneralClipInterpolator(new KeyFrame[] {kf1, kf2, kf3}, new long[] {0, 6000, 6000});
  49         
  50         assertSame   (gci, gci.setKeyFrames(new KeyFrame[]{kf1, kf2, kf3}, new long[] {0, 6000, 6000}));
  51         assertNotSame(gci, gci.setKeyFrames(new KeyFrame[]{kf1, kf2     }, new long[] {0, 6000      }));
  52         assertNotSame(gci, gci.setKeyFrames(new KeyFrame[]{kf1,      kf3}, new long[] {0,       6000}));
  53         assertSame   (gci, gci.setKeyFrames(new KeyFrame[]{kf1          }, new long[] {0            }));
  54         assertSame   (gci, gci.setKeyFrames(new KeyFrame[]{     kf2, kf3}, new long[] {   6000, 6000}));
  55         assertNotSame(gci, gci.setKeyFrames(new KeyFrame[]{     kf2     }, new long[] {   6000      }));
  56         assertNotSame(gci, gci.setKeyFrames(new KeyFrame[]{          kf3}, new long[] {         6000}));
  57         assertSame   (gci, gci.setKeyFrames(new KeyFrame[]{             }, new long[] {             }));
  58         }
  59         
  60         @Test
  61         public void test_OneKeyFrameOnly() {
  62                 // main purpose of this test is to ensure we do not throw exceptions
  63                 final KeyFrame kf1 = new KeyFrame(Duration.ZERO);
  64                 final KeyFrame kf2 = new KeyFrame(Duration.ZERO);
  65                 
  66         // one key frame
  67         final GeneralClipInterpolator gci1 = new GeneralClipInterpolator (new KeyFrame[] {kf1}, new long[] {0});
  68         gci1.validate(true);
  69         gci1.validate(true);
  70         gci1.setKeyFrames(new KeyFrame[]{kf2}, new long[] {6000});
  71         gci1.validate(true);
  72         gci1.setKeyFrames(new KeyFrame[]{}, new long[] {});
  73         gci1.validate(true);
  74         
  75         // no key frames
  76         final GeneralClipInterpolator gci2 = new GeneralClipInterpolator (new KeyFrame[] {}, new long[] {});
  77         gci2.validate(true);
  78         gci2.validate(true);
  79         gci2.setKeyFrames(new KeyFrame[]{kf1}, new long[] {0});
  80         gci2.validate(true);
  81     }
  82 
  83     @Test
  84     public void test_NoKeyValues() {
  85         final KeyFrame start1 = new KeyFrame(Duration.ZERO);
  86         final KeyFrame start2 = new KeyFrame(Duration.ZERO);
  87         final KeyFrame end1 = new KeyFrame(Duration.millis(1000));
  88         final KeyFrame end2a = new KeyFrame(Duration.millis(2000));
  89         final KeyFrame end2b = new KeyFrame(Duration.millis(3000));
  90         
  91         // four key frames
  92         final GeneralClipInterpolator gci1 = new GeneralClipInterpolator (new KeyFrame[] {start1, start2, end1, end2a}, new long[] {0, 0, 6000, 12000});
  93         gci1.validate(true);
  94         gci1.interpolate(TickCalculation.fromMillis(300));
  95         gci1.interpolate(TickCalculation.fromMillis(1300));
  96         
  97         gci1.validate(true);
  98         gci1.interpolate(TickCalculation.fromMillis(800));
  99         gci1.interpolate(TickCalculation.fromMillis(1800));
 100         
 101         gci1.setKeyFrames(new KeyFrame[]{start1, start2, end1, end2b}, new long[] {0, 0, 6000, 18000});
 102         gci1.interpolate(TickCalculation.fromMillis(400));
 103         gci1.interpolate(TickCalculation.fromMillis(1400));
 104         
 105         gci1.validate(true);
 106         gci1.interpolate(TickCalculation.fromMillis(600));
 107         gci1.interpolate(TickCalculation.fromMillis(1600));
 108         
 109         // two key frames
 110         final GeneralClipInterpolator gci2 = new GeneralClipInterpolator (new KeyFrame[] {end1, end2a}, new long[] {6000, 12000});
 111         gci2.validate(true);
 112         gci2.interpolate(TickCalculation.fromMillis(300));
 113         gci2.interpolate(TickCalculation.fromMillis(1300));
 114         
 115         gci2.validate(true);
 116         gci2.interpolate(TickCalculation.fromMillis(800));
 117         gci2.interpolate(TickCalculation.fromMillis(1800));
 118         
 119         gci2.setKeyFrames(new KeyFrame[]{end1, end2b}, new long[] {6000, 18000});
 120         gci2.interpolate(TickCalculation.fromMillis(400));
 121         gci2.interpolate(TickCalculation.fromMillis(1400));
 122         
 123         gci2.validate(true);
 124         gci2.interpolate(TickCalculation.fromMillis(600));
 125         gci2.interpolate(TickCalculation.fromMillis(1600));
 126     }
 127 
 128     @Test
 129     public void test_ThreeKeyFrames_OneKeyValue() {
 130         final IntegerProperty v = new SimpleIntegerProperty();
 131         final KeyFrame start1 = new KeyFrame(Duration.ZERO);
 132         final KeyFrame start2 = new KeyFrame(Duration.ZERO, new KeyValue(v, 30));
 133         final KeyFrame mid1 = new KeyFrame(Duration.millis(1000), new KeyValue(v, 40));
 134         final KeyFrame end1 = new KeyFrame(Duration.millis(2000), new KeyValue(v, 60));
 135         final KeyFrame end2 = new KeyFrame(Duration.millis(4000), new KeyValue(v, 70));
 136         
 137         final GeneralClipInterpolator gci1 = new GeneralClipInterpolator (new KeyFrame[] {start1, start2, mid1, end1}, new long[] {0, 0, 6000, 12000});
 138         v.set(0);
 139         gci1.validate(true);
 140         gci1.interpolate(TickCalculation.fromMillis(0));
 141         assertEquals(30, v.get());
 142         gci1.interpolate(TickCalculation.fromMillis(300));
 143         assertEquals(33, v.get());
 144         gci1.interpolate(TickCalculation.fromMillis(1000));
 145         assertEquals(40, v.get());
 146         gci1.interpolate(TickCalculation.fromMillis(1600));
 147         assertEquals(52, v.get());
 148         gci1.interpolate(TickCalculation.fromMillis(2000));
 149         assertEquals(60, v.get());
 150         
 151         // re-validate
 152         v.set(20);
 153         gci1.validate(true);
 154         gci1.interpolate(TickCalculation.fromMillis(0));
 155         assertEquals(30, v.get());
 156         gci1.interpolate(TickCalculation.fromMillis(800));
 157         assertEquals(38, v.get());


 181         gci1.validate(true);
 182         gci1.interpolate(TickCalculation.fromMillis(0));
 183         assertEquals(30, v.get());
 184         gci1.interpolate(TickCalculation.fromMillis(700));
 185         assertEquals(37, v.get());
 186         gci1.interpolate(TickCalculation.fromMillis(1000));
 187         assertEquals(40, v.get());
 188         gci1.interpolate(TickCalculation.fromMillis(1300));
 189         assertEquals(43, v.get());
 190         gci1.interpolate(TickCalculation.fromMillis(4000));
 191         assertEquals(70, v.get());
 192     }
 193 
 194     @Test
 195     public void test_TwoKeyFrames_OneKeyValue() {
 196         final IntegerProperty v = new SimpleIntegerProperty();
 197         final KeyFrame mid1 = new KeyFrame(Duration.millis(1000), new KeyValue(v, 40));
 198         final KeyFrame end1 = new KeyFrame(Duration.millis(2000), new KeyValue(v, 60));
 199         final KeyFrame end2 = new KeyFrame(Duration.millis(4000), new KeyValue(v, 70));
 200 
 201         final GeneralClipInterpolator gci1 = new GeneralClipInterpolator (new KeyFrame[] {mid1, end1}, new long[] {6000, 12000});
 202         v.set(0);
 203         gci1.validate(true);
 204         gci1.interpolate(TickCalculation.fromMillis(0));
 205         assertEquals( 0, v.get());
 206         gci1.interpolate(TickCalculation.fromMillis(300));
 207         assertEquals(12, v.get());
 208         gci1.interpolate(TickCalculation.fromMillis(1000));
 209         assertEquals(40, v.get());
 210         gci1.interpolate(TickCalculation.fromMillis(1600));
 211         assertEquals(52, v.get());
 212         gci1.interpolate(TickCalculation.fromMillis(2000));
 213         assertEquals(60, v.get());
 214         
 215         // re-validate
 216         v.set(20);
 217         gci1.validate(true);
 218         gci1.interpolate(TickCalculation.fromMillis(0));
 219         assertEquals(20, v.get());
 220         gci1.interpolate(TickCalculation.fromMillis(800));
 221         assertEquals(36, v.get());


 250         gci1.interpolate(TickCalculation.fromMillis(1000));
 251         assertEquals(40, v.get());
 252         gci1.interpolate(TickCalculation.fromMillis(1300));
 253         assertEquals(43, v.get());
 254         gci1.interpolate(TickCalculation.fromMillis(4000));
 255         assertEquals(70, v.get());
 256     }
 257 
 258     @Test
 259     public void test_ThreeKeyFrames_ThreeKeyValues() {
 260         final IntegerProperty v1 = new SimpleIntegerProperty();
 261         final IntegerProperty v2 = new SimpleIntegerProperty();
 262         final IntegerProperty v3 = new SimpleIntegerProperty();
 263         final IntegerProperty v4 = new SimpleIntegerProperty();
 264         final KeyFrame start1 = new KeyFrame(Duration.ZERO, new KeyValue(v3, 230), new KeyValue(v4, 330));
 265         final KeyFrame start2 = new KeyFrame(Duration.ZERO, new KeyValue(v2, 130));
 266         final KeyFrame mid1 = new KeyFrame(Duration.millis(1000), new KeyValue(v1, 40), new KeyValue(v2, 140), new KeyValue(v3, 240));
 267         final KeyFrame end1 = new KeyFrame(Duration.millis(2000), new KeyValue(v1, 60), new KeyValue(v2, 160));
 268         final KeyFrame end2 = new KeyFrame(Duration.millis(4000), new KeyValue(v1, 70), new KeyValue(v2, 170));
 269         
 270         final GeneralClipInterpolator gci1 = new GeneralClipInterpolator (new KeyFrame[] {start1, start2, mid1, end1}, new long[] {0, 0, 6000, 12000});
 271         v1.set(  0);
 272         v2.set(100);
 273         v3.set(200);
 274         v4.set(300);
 275         gci1.validate(true);
 276         gci1.interpolate(TickCalculation.fromMillis(0));
 277         assertEquals(  0, v1.get());
 278         assertEquals(130, v2.get());
 279         assertEquals(230, v3.get());
 280         assertEquals(300, v4.get());
 281         gci1.interpolate(TickCalculation.fromMillis(300));
 282         assertEquals( 12, v1.get());
 283         assertEquals(133, v2.get());
 284         assertEquals(233, v3.get());
 285         assertEquals(300, v4.get());
 286         gci1.interpolate(TickCalculation.fromMillis(1000));
 287         assertEquals( 40, v1.get());
 288         assertEquals(140, v2.get());
 289         assertEquals(240, v3.get());
 290         assertEquals(300, v4.get());


 388         assertEquals( 43, v1.get());
 389         assertEquals(143, v2.get());
 390         assertEquals(240, v3.get());
 391         assertEquals(320, v4.get());
 392         gci1.interpolate(TickCalculation.fromMillis(4000));
 393         assertEquals( 70, v1.get());
 394         assertEquals(170, v2.get());
 395         assertEquals(240, v3.get());
 396         assertEquals(320, v4.get());
 397     }
 398 
 399     @Test
 400     public void test_TwoKeyFrames_ThreeKeyValues() {
 401         final IntegerProperty v1 = new SimpleIntegerProperty();
 402         final IntegerProperty v2 = new SimpleIntegerProperty();
 403         final IntegerProperty v3 = new SimpleIntegerProperty();
 404         final KeyFrame mid1 = new KeyFrame(Duration.millis(1000), new KeyValue(v1, 40), new KeyValue(v2, 140), new KeyValue(v3, 240));
 405         final KeyFrame end1 = new KeyFrame(Duration.millis(2000), new KeyValue(v1, 60), new KeyValue(v2, 160), new KeyValue(v3, 260));
 406         final KeyFrame end2 = new KeyFrame(Duration.millis(4000), new KeyValue(v1, 70), new KeyValue(v2, 170), new KeyValue(v3, 270));
 407 
 408         final GeneralClipInterpolator gci1 = new GeneralClipInterpolator (new KeyFrame[] {mid1, end1}, new long[] {6000, 12000});
 409         v1.set(  0);
 410         v2.set(100);
 411         v3.set(200);
 412         gci1.validate(true);
 413         gci1.interpolate(TickCalculation.fromMillis(0));
 414         assertEquals(  0, v1.get());
 415         assertEquals(100, v2.get());
 416         assertEquals(200, v3.get());
 417         gci1.interpolate(TickCalculation.fromMillis(300));
 418         assertEquals( 12, v1.get());
 419         assertEquals(112, v2.get());
 420         assertEquals(212, v3.get());
 421         gci1.interpolate(TickCalculation.fromMillis(1000));
 422         assertEquals( 40, v1.get());
 423         assertEquals(140, v2.get());
 424         assertEquals(240, v3.get());
 425         gci1.interpolate(TickCalculation.fromMillis(1600));
 426         assertEquals( 52, v1.get());
 427         assertEquals(152, v2.get());
 428         assertEquals(252, v3.get());


 506         assertEquals(243, v3.get());
 507         gci1.interpolate(TickCalculation.fromMillis(4000));
 508         assertEquals( 70, v1.get());
 509         assertEquals(170, v2.get());
 510         assertEquals(270, v3.get());
 511     }
 512 
 513 
 514     @Test
 515     public void test_DuplicateKeyValue() {
 516         final IntegerProperty v1 = new SimpleIntegerProperty();
 517         final IntegerProperty v2 = new SimpleIntegerProperty();
 518         final KeyFrame start1 = new KeyFrame(Duration.ZERO, new KeyValue(v1, 30), new KeyValue(v2, 0));
 519         final KeyFrame start2 = new KeyFrame(Duration.ZERO, new KeyValue(v1, 30), new KeyValue(v1, -30), new KeyValue(v2, 0));
 520         final KeyFrame mid1 = new KeyFrame(Duration.millis(1000), new KeyValue(v1, 40), new KeyValue(v2, 100));
 521         final KeyFrame mid2 = new KeyFrame(Duration.millis(1000), new KeyValue(v1, 40), new KeyValue(v1, -40), new KeyValue(v2, 100));
 522         final KeyFrame end1 = new KeyFrame(Duration.millis(2000), new KeyValue(v1, 60), new KeyValue(v2, 0));
 523         final KeyFrame end2 = new KeyFrame(Duration.millis(2000), new KeyValue(v1, 60), new KeyValue(v1, -60), new KeyValue(v2, 0));
 524 
 525         // single value in start, single value in mid, duplicate value in end
 526         final GeneralClipInterpolator gci1 = new GeneralClipInterpolator (new KeyFrame[] {start1, mid1, end2}, new long[] {0, 6000, 12000});
 527         v1.set(0);
 528         v2.set(0);
 529         gci1.validate(true);
 530         gci1.interpolate(TickCalculation.fromMillis(0));
 531         assertEquals(30, v1.get());
 532         assertEquals(0, v2.get());
 533         gci1.interpolate(TickCalculation.fromMillis(300));
 534         assertEquals(33, v1.get());
 535         assertEquals(30, v2.get());
 536         gci1.interpolate(TickCalculation.fromMillis(1000));
 537         assertEquals(40, v1.get());
 538         assertEquals(100, v2.get());
 539         gci1.interpolate(TickCalculation.fromMillis(1600));
 540         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (-20 == v1.get()));
 541         assertEquals(40, v2.get());
 542         gci1.interpolate(TickCalculation.fromMillis(2000));
 543         assertTrue("v1.get(): " + v1.get(), (60 == v1.get()) || (-60 == v1.get()));
 544         assertEquals(0, v2.get());
 545 
 546         // single value in start, duplicate value in mid, single value in end
 547         final GeneralClipInterpolator gci2 = new GeneralClipInterpolator (new KeyFrame[] {start1, mid2, end1}, new long[] {0, 6000, 12000});
 548         v1.set(0);
 549         v2.set(0);
 550         gci2.validate(true);
 551         gci2.interpolate(TickCalculation.fromMillis(0));
 552         assertEquals(30, v1.get());
 553         assertEquals(0, v2.get());
 554         gci2.interpolate(TickCalculation.fromMillis(300));
 555         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (9 == v1.get()));
 556         assertEquals(30, v2.get());
 557         gci2.interpolate(TickCalculation.fromMillis(1000));
 558         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 559         assertEquals(100, v2.get());
 560         gci2.interpolate(TickCalculation.fromMillis(1600));
 561         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (20 == v1.get()));
 562         assertEquals(40, v2.get());
 563         gci2.interpolate(TickCalculation.fromMillis(2000));
 564         assertEquals(60, v1.get());
 565         assertEquals(0, v2.get());
 566 
 567         // duplicate value in start, single value in mid, single value in end
 568         final GeneralClipInterpolator gci3 = new GeneralClipInterpolator (new KeyFrame[] {start2, mid1, end1}, new long[] {0, 6000, 12000});
 569         v1.set(0);
 570         v2.set(0);
 571         gci3.validate(true);
 572         gci3.interpolate(TickCalculation.fromMillis(0));
 573         assertTrue("v1.get(): " + v1.get(), (30 == v1.get()) || (-30 == v1.get()));
 574         assertEquals(0, v2.get());
 575         gci3.interpolate(TickCalculation.fromMillis(300));
 576         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (-9 == v1.get()));
 577         assertEquals(30, v2.get());
 578         gci3.interpolate(TickCalculation.fromMillis(1000));
 579         assertEquals(40, v1.get());
 580         assertEquals(100, v2.get());
 581         gci3.interpolate(TickCalculation.fromMillis(1600));
 582         assertEquals(52, v1.get());
 583         assertEquals(40, v2.get());
 584         gci3.interpolate(TickCalculation.fromMillis(2000));
 585         assertEquals(60, v1.get());
 586         assertEquals(0, v2.get());
 587 
 588         // duplicate value in start, duplicate value in mid, single value in end
 589         final GeneralClipInterpolator gci4 = new GeneralClipInterpolator (new KeyFrame[] {start2, mid2, end1}, new long[] {0, 6000, 12000});
 590         v1.set(0);
 591         v2.set(0);
 592         gci4.validate(true);
 593         gci4.interpolate(TickCalculation.fromMillis(0));
 594         assertTrue("v1.get(): " + v1.get(), (30 == v1.get()) || (-30 == v1.get()));
 595         assertEquals(0, v2.get());
 596         gci4.interpolate(TickCalculation.fromMillis(300));
 597         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (9 == v1.get()) || (-9 == v1.get()) || (-33 == v1.get()));
 598         assertEquals(30, v2.get());
 599         gci4.interpolate(TickCalculation.fromMillis(1000));
 600         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 601         assertEquals(100, v2.get());
 602         gci4.interpolate(TickCalculation.fromMillis(1600));
 603         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (20 == v1.get()));
 604         assertEquals(40, v2.get());
 605         gci4.interpolate(TickCalculation.fromMillis(2000));
 606         assertEquals(60, v1.get());
 607         assertEquals(0, v2.get());
 608 
 609         // duplicate value in start, single value in mid, duplicate value in end
 610         final GeneralClipInterpolator gci5 = new GeneralClipInterpolator (new KeyFrame[] {start2, mid1, end2}, new long[] {0, 6000, 12000});
 611         v1.set(0);
 612         v2.set(0);
 613         gci5.validate(true);
 614         gci5.interpolate(TickCalculation.fromMillis(0));
 615         assertTrue("v1.get(): " + v1.get(), (30 == v1.get()) || (-30 == v1.get()));
 616         assertEquals(0, v2.get());
 617         gci5.interpolate(TickCalculation.fromMillis(300));
 618         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (-9 == v1.get()));
 619         assertEquals(30, v2.get());
 620         gci5.interpolate(TickCalculation.fromMillis(1000));
 621         assertEquals(40, v1.get());
 622         assertEquals(100, v2.get());
 623         gci5.interpolate(TickCalculation.fromMillis(1600));
 624         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (-20 == v1.get()));
 625         assertEquals(40, v2.get());
 626         gci5.interpolate(TickCalculation.fromMillis(2000));
 627         assertTrue("v1.get(): " + v1.get(), (60 == v1.get()) || (-60 == v1.get()));
 628         assertEquals(0, v2.get());
 629 
 630         // single value in start, duplicate value in mid, duplicate value in end
 631         final GeneralClipInterpolator gci6 = new GeneralClipInterpolator (new KeyFrame[] {start1, mid2, end2}, new long[] {0, 6000, 12000});
 632         v1.set(0);
 633         v2.set(0);
 634         gci6.validate(true);
 635         gci6.interpolate(TickCalculation.fromMillis(0));
 636         assertEquals(30, v1.get());
 637         assertEquals(0, v2.get());
 638         gci6.interpolate(TickCalculation.fromMillis(300));
 639         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (9 == v1.get()));
 640         assertEquals(30, v2.get());
 641         gci6.interpolate(TickCalculation.fromMillis(1000));
 642         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 643         assertEquals(100, v2.get());
 644         gci6.interpolate(TickCalculation.fromMillis(1600));
 645         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (-20 == v1.get()) || (20 == v1.get()) || (-52 == v1.get()));
 646         assertEquals(40, v2.get());
 647         gci6.interpolate(TickCalculation.fromMillis(2000));
 648         assertTrue("v1.get(): " + v1.get(), (60 == v1.get()) || (-60 == v1.get()));
 649         assertEquals(0, v2.get());
 650 
 651         // duplicate value in start, duplicate value in mid, duplicate value in end
 652         final GeneralClipInterpolator gci7 = new GeneralClipInterpolator (new KeyFrame[] {start2, mid2, end2}, new long[] {0, 6000, 12000});
 653         v1.set(0);
 654         v2.set(0);
 655         gci7.validate(true);
 656         gci7.interpolate(TickCalculation.fromMillis(0));
 657         assertTrue("v1.get(): " + v1.get(), (30 == v1.get()) || (-30 == v1.get()));
 658         assertEquals(0, v2.get());
 659         gci7.interpolate(TickCalculation.fromMillis(300));
 660         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (9 == v1.get()) || (-9 == v1.get()) || (-33 == v1.get()));
 661         assertEquals(30, v2.get());
 662         gci7.interpolate(TickCalculation.fromMillis(1000));
 663         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 664         assertEquals(100, v2.get());
 665         gci7.interpolate(TickCalculation.fromMillis(1600));
 666         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (-20 == v1.get()) || (20 == v1.get()) || (-52 == v1.get()));
 667         assertEquals(40, v2.get());
 668         gci7.interpolate(TickCalculation.fromMillis(2000));
 669         assertTrue("v1.get(): " + v1.get(), (60 == v1.get()) || (-60 == v1.get()));
 670         assertEquals(0, v2.get());
 671 
 672         // no value in start, single value in mid, duplicate value in end
 673         final GeneralClipInterpolator gci8 = new GeneralClipInterpolator (new KeyFrame[] {mid1, end2}, new long[] {6000, 12000});
 674         v1.set(0);
 675         v2.set(0);
 676         gci8.validate(true);
 677         gci8.interpolate(TickCalculation.fromMillis(0));
 678         assertEquals(0, v1.get());
 679         assertEquals(0, v2.get());
 680         gci8.interpolate(TickCalculation.fromMillis(400));
 681         assertEquals(16, v1.get());
 682         assertEquals(40, v2.get());
 683         gci8.interpolate(TickCalculation.fromMillis(1000));
 684         assertEquals(40, v1.get());
 685         assertEquals(100, v2.get());
 686         gci8.interpolate(TickCalculation.fromMillis(1600));
 687         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (-20 == v1.get()));
 688         assertEquals(40, v2.get());
 689         gci8.interpolate(TickCalculation.fromMillis(2000));
 690         assertTrue("v1.get(): " + v1.get(), (60 == v1.get()) || (-60 == v1.get()));
 691         assertEquals(0, v2.get());
 692 
 693         // no value in start, duplicate value in mid, single value in end
 694         final GeneralClipInterpolator gci9 = new GeneralClipInterpolator (new KeyFrame[] {mid2, end1}, new long[] {6000, 12000});
 695         v1.set(0);
 696         v2.set(0);
 697         gci9.validate(true);
 698         gci9.interpolate(TickCalculation.fromMillis(0));
 699         assertEquals(0, v1.get());
 700         assertEquals(0, v2.get());
 701         gci9.interpolate(TickCalculation.fromMillis(400));
 702         assertTrue("v1.get(): " + v1.get(), (16 == v1.get()) || (-16 == v1.get()));
 703         assertEquals(40, v2.get());
 704         gci9.interpolate(TickCalculation.fromMillis(1000));
 705         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 706         assertEquals(100, v2.get());
 707         gci9.interpolate(TickCalculation.fromMillis(1600));
 708         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (20 == v1.get()));
 709         assertEquals(40, v2.get());
 710         gci9.interpolate(TickCalculation.fromMillis(2000));
 711         assertEquals(60, v1.get());
 712         assertEquals(0, v2.get());
 713 
 714         // no value in start, duplicate value in mid, duplicate value in end
 715         final GeneralClipInterpolator gci10 = new GeneralClipInterpolator (new KeyFrame[] {mid2, end2}, new long[] {6000, 12000});
 716         v1.set(0);
 717         v2.set(0);
 718         gci10.validate(true);
 719         gci10.interpolate(TickCalculation.fromMillis(0));
 720         assertEquals(0, v1.get());
 721         assertEquals(0, v2.get());
 722         gci10.interpolate(TickCalculation.fromMillis(400));
 723         assertTrue("v1.get(): " + v1.get(), (16 == v1.get()) || (-16 == v1.get()));
 724         assertEquals(40, v2.get());
 725         gci10.interpolate(TickCalculation.fromMillis(1000));
 726         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 727         assertEquals(100, v2.get());
 728         gci10.interpolate(TickCalculation.fromMillis(1600));
 729         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (-20 == v1.get()) || (20 == v1.get()) || (-52 == v1.get()));
 730         assertEquals(40, v2.get());
 731         gci10.interpolate(TickCalculation.fromMillis(2000));
 732         assertTrue("v1.get(): " + v1.get(), (60 == v1.get()) || (-60 == v1.get()));
 733         assertEquals(0, v2.get());
 734     }
 735 }


   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.com.sun.scenario.animation.shared;
  27 
  28 import com.sun.javafx.animation.TickCalculation;
  29 import com.sun.scenario.animation.shared.GeneralClipInterpolatorShim;
  30 import static org.junit.Assert.assertEquals;
  31 import static org.junit.Assert.assertNotSame;
  32 import static org.junit.Assert.assertSame;
  33 import static org.junit.Assert.assertTrue;
  34 import javafx.animation.KeyFrame;
  35 import javafx.animation.KeyValue;
  36 import javafx.beans.property.IntegerProperty;
  37 import javafx.beans.property.SimpleIntegerProperty;
  38 import javafx.util.Duration;
  39 
  40 import org.junit.Test;
  41 
  42 public class GeneralClipInterpolatorTest {
  43         
  44         @Test
  45         public void testSetKeyFrame() {
  46         final KeyFrame kf1 = new KeyFrame(Duration.ZERO);
  47         final KeyFrame kf2 = new KeyFrame(Duration.millis(1000));
  48         final KeyFrame kf3 = new KeyFrame(Duration.millis(2000));
  49         final GeneralClipInterpolatorShim gci = new GeneralClipInterpolatorShim(new KeyFrame[] {kf1, kf2, kf3}, new long[] {0, 6000, 6000});
  50         
  51         assertSame   (gci, gci.setKeyFrames(new KeyFrame[]{kf1, kf2, kf3}, new long[] {0, 6000, 6000}));
  52         assertNotSame(gci, gci.setKeyFrames(new KeyFrame[]{kf1, kf2     }, new long[] {0, 6000      }));
  53         assertNotSame(gci, gci.setKeyFrames(new KeyFrame[]{kf1,      kf3}, new long[] {0,       6000}));
  54         assertSame   (gci, gci.setKeyFrames(new KeyFrame[]{kf1          }, new long[] {0            }));
  55         assertSame   (gci, gci.setKeyFrames(new KeyFrame[]{     kf2, kf3}, new long[] {   6000, 6000}));
  56         assertNotSame(gci, gci.setKeyFrames(new KeyFrame[]{     kf2     }, new long[] {   6000      }));
  57         assertNotSame(gci, gci.setKeyFrames(new KeyFrame[]{          kf3}, new long[] {         6000}));
  58         assertSame   (gci, gci.setKeyFrames(new KeyFrame[]{             }, new long[] {             }));
  59         }
  60         
  61         @Test
  62         public void test_OneKeyFrameOnly() {
  63                 // main purpose of this test is to ensure we do not throw exceptions
  64                 final KeyFrame kf1 = new KeyFrame(Duration.ZERO);
  65                 final KeyFrame kf2 = new KeyFrame(Duration.ZERO);
  66                 
  67         // one key frame
  68         final GeneralClipInterpolatorShim gci1 = new GeneralClipInterpolatorShim (new KeyFrame[] {kf1}, new long[] {0});
  69         gci1.validate(true);
  70         gci1.validate(true);
  71         gci1.setKeyFrames(new KeyFrame[]{kf2}, new long[] {6000});
  72         gci1.validate(true);
  73         gci1.setKeyFrames(new KeyFrame[]{}, new long[] {});
  74         gci1.validate(true);
  75         
  76         // no key frames
  77         final GeneralClipInterpolatorShim gci2 = new GeneralClipInterpolatorShim (new KeyFrame[] {}, new long[] {});
  78         gci2.validate(true);
  79         gci2.validate(true);
  80         gci2.setKeyFrames(new KeyFrame[]{kf1}, new long[] {0});
  81         gci2.validate(true);
  82     }
  83 
  84     @Test
  85     public void test_NoKeyValues() {
  86         final KeyFrame start1 = new KeyFrame(Duration.ZERO);
  87         final KeyFrame start2 = new KeyFrame(Duration.ZERO);
  88         final KeyFrame end1 = new KeyFrame(Duration.millis(1000));
  89         final KeyFrame end2a = new KeyFrame(Duration.millis(2000));
  90         final KeyFrame end2b = new KeyFrame(Duration.millis(3000));
  91         
  92         // four key frames
  93         final GeneralClipInterpolatorShim gci1 = new GeneralClipInterpolatorShim (new KeyFrame[] {start1, start2, end1, end2a}, new long[] {0, 0, 6000, 12000});
  94         gci1.validate(true);
  95         gci1.interpolate(TickCalculation.fromMillis(300));
  96         gci1.interpolate(TickCalculation.fromMillis(1300));
  97         
  98         gci1.validate(true);
  99         gci1.interpolate(TickCalculation.fromMillis(800));
 100         gci1.interpolate(TickCalculation.fromMillis(1800));
 101         
 102         gci1.setKeyFrames(new KeyFrame[]{start1, start2, end1, end2b}, new long[] {0, 0, 6000, 18000});
 103         gci1.interpolate(TickCalculation.fromMillis(400));
 104         gci1.interpolate(TickCalculation.fromMillis(1400));
 105         
 106         gci1.validate(true);
 107         gci1.interpolate(TickCalculation.fromMillis(600));
 108         gci1.interpolate(TickCalculation.fromMillis(1600));
 109         
 110         // two key frames
 111         final GeneralClipInterpolatorShim gci2 = new GeneralClipInterpolatorShim (new KeyFrame[] {end1, end2a}, new long[] {6000, 12000});
 112         gci2.validate(true);
 113         gci2.interpolate(TickCalculation.fromMillis(300));
 114         gci2.interpolate(TickCalculation.fromMillis(1300));
 115         
 116         gci2.validate(true);
 117         gci2.interpolate(TickCalculation.fromMillis(800));
 118         gci2.interpolate(TickCalculation.fromMillis(1800));
 119         
 120         gci2.setKeyFrames(new KeyFrame[]{end1, end2b}, new long[] {6000, 18000});
 121         gci2.interpolate(TickCalculation.fromMillis(400));
 122         gci2.interpolate(TickCalculation.fromMillis(1400));
 123         
 124         gci2.validate(true);
 125         gci2.interpolate(TickCalculation.fromMillis(600));
 126         gci2.interpolate(TickCalculation.fromMillis(1600));
 127     }
 128 
 129     @Test
 130     public void test_ThreeKeyFrames_OneKeyValue() {
 131         final IntegerProperty v = new SimpleIntegerProperty();
 132         final KeyFrame start1 = new KeyFrame(Duration.ZERO);
 133         final KeyFrame start2 = new KeyFrame(Duration.ZERO, new KeyValue(v, 30));
 134         final KeyFrame mid1 = new KeyFrame(Duration.millis(1000), new KeyValue(v, 40));
 135         final KeyFrame end1 = new KeyFrame(Duration.millis(2000), new KeyValue(v, 60));
 136         final KeyFrame end2 = new KeyFrame(Duration.millis(4000), new KeyValue(v, 70));
 137         
 138         final GeneralClipInterpolatorShim gci1 = new GeneralClipInterpolatorShim (new KeyFrame[] {start1, start2, mid1, end1}, new long[] {0, 0, 6000, 12000});
 139         v.set(0);
 140         gci1.validate(true);
 141         gci1.interpolate(TickCalculation.fromMillis(0));
 142         assertEquals(30, v.get());
 143         gci1.interpolate(TickCalculation.fromMillis(300));
 144         assertEquals(33, v.get());
 145         gci1.interpolate(TickCalculation.fromMillis(1000));
 146         assertEquals(40, v.get());
 147         gci1.interpolate(TickCalculation.fromMillis(1600));
 148         assertEquals(52, v.get());
 149         gci1.interpolate(TickCalculation.fromMillis(2000));
 150         assertEquals(60, v.get());
 151         
 152         // re-validate
 153         v.set(20);
 154         gci1.validate(true);
 155         gci1.interpolate(TickCalculation.fromMillis(0));
 156         assertEquals(30, v.get());
 157         gci1.interpolate(TickCalculation.fromMillis(800));
 158         assertEquals(38, v.get());


 182         gci1.validate(true);
 183         gci1.interpolate(TickCalculation.fromMillis(0));
 184         assertEquals(30, v.get());
 185         gci1.interpolate(TickCalculation.fromMillis(700));
 186         assertEquals(37, v.get());
 187         gci1.interpolate(TickCalculation.fromMillis(1000));
 188         assertEquals(40, v.get());
 189         gci1.interpolate(TickCalculation.fromMillis(1300));
 190         assertEquals(43, v.get());
 191         gci1.interpolate(TickCalculation.fromMillis(4000));
 192         assertEquals(70, v.get());
 193     }
 194 
 195     @Test
 196     public void test_TwoKeyFrames_OneKeyValue() {
 197         final IntegerProperty v = new SimpleIntegerProperty();
 198         final KeyFrame mid1 = new KeyFrame(Duration.millis(1000), new KeyValue(v, 40));
 199         final KeyFrame end1 = new KeyFrame(Duration.millis(2000), new KeyValue(v, 60));
 200         final KeyFrame end2 = new KeyFrame(Duration.millis(4000), new KeyValue(v, 70));
 201 
 202         final GeneralClipInterpolatorShim gci1 = new GeneralClipInterpolatorShim (new KeyFrame[] {mid1, end1}, new long[] {6000, 12000});
 203         v.set(0);
 204         gci1.validate(true);
 205         gci1.interpolate(TickCalculation.fromMillis(0));
 206         assertEquals( 0, v.get());
 207         gci1.interpolate(TickCalculation.fromMillis(300));
 208         assertEquals(12, v.get());
 209         gci1.interpolate(TickCalculation.fromMillis(1000));
 210         assertEquals(40, v.get());
 211         gci1.interpolate(TickCalculation.fromMillis(1600));
 212         assertEquals(52, v.get());
 213         gci1.interpolate(TickCalculation.fromMillis(2000));
 214         assertEquals(60, v.get());
 215         
 216         // re-validate
 217         v.set(20);
 218         gci1.validate(true);
 219         gci1.interpolate(TickCalculation.fromMillis(0));
 220         assertEquals(20, v.get());
 221         gci1.interpolate(TickCalculation.fromMillis(800));
 222         assertEquals(36, v.get());


 251         gci1.interpolate(TickCalculation.fromMillis(1000));
 252         assertEquals(40, v.get());
 253         gci1.interpolate(TickCalculation.fromMillis(1300));
 254         assertEquals(43, v.get());
 255         gci1.interpolate(TickCalculation.fromMillis(4000));
 256         assertEquals(70, v.get());
 257     }
 258 
 259     @Test
 260     public void test_ThreeKeyFrames_ThreeKeyValues() {
 261         final IntegerProperty v1 = new SimpleIntegerProperty();
 262         final IntegerProperty v2 = new SimpleIntegerProperty();
 263         final IntegerProperty v3 = new SimpleIntegerProperty();
 264         final IntegerProperty v4 = new SimpleIntegerProperty();
 265         final KeyFrame start1 = new KeyFrame(Duration.ZERO, new KeyValue(v3, 230), new KeyValue(v4, 330));
 266         final KeyFrame start2 = new KeyFrame(Duration.ZERO, new KeyValue(v2, 130));
 267         final KeyFrame mid1 = new KeyFrame(Duration.millis(1000), new KeyValue(v1, 40), new KeyValue(v2, 140), new KeyValue(v3, 240));
 268         final KeyFrame end1 = new KeyFrame(Duration.millis(2000), new KeyValue(v1, 60), new KeyValue(v2, 160));
 269         final KeyFrame end2 = new KeyFrame(Duration.millis(4000), new KeyValue(v1, 70), new KeyValue(v2, 170));
 270         
 271         final GeneralClipInterpolatorShim gci1 = new GeneralClipInterpolatorShim (new KeyFrame[] {start1, start2, mid1, end1}, new long[] {0, 0, 6000, 12000});
 272         v1.set(  0);
 273         v2.set(100);
 274         v3.set(200);
 275         v4.set(300);
 276         gci1.validate(true);
 277         gci1.interpolate(TickCalculation.fromMillis(0));
 278         assertEquals(  0, v1.get());
 279         assertEquals(130, v2.get());
 280         assertEquals(230, v3.get());
 281         assertEquals(300, v4.get());
 282         gci1.interpolate(TickCalculation.fromMillis(300));
 283         assertEquals( 12, v1.get());
 284         assertEquals(133, v2.get());
 285         assertEquals(233, v3.get());
 286         assertEquals(300, v4.get());
 287         gci1.interpolate(TickCalculation.fromMillis(1000));
 288         assertEquals( 40, v1.get());
 289         assertEquals(140, v2.get());
 290         assertEquals(240, v3.get());
 291         assertEquals(300, v4.get());


 389         assertEquals( 43, v1.get());
 390         assertEquals(143, v2.get());
 391         assertEquals(240, v3.get());
 392         assertEquals(320, v4.get());
 393         gci1.interpolate(TickCalculation.fromMillis(4000));
 394         assertEquals( 70, v1.get());
 395         assertEquals(170, v2.get());
 396         assertEquals(240, v3.get());
 397         assertEquals(320, v4.get());
 398     }
 399 
 400     @Test
 401     public void test_TwoKeyFrames_ThreeKeyValues() {
 402         final IntegerProperty v1 = new SimpleIntegerProperty();
 403         final IntegerProperty v2 = new SimpleIntegerProperty();
 404         final IntegerProperty v3 = new SimpleIntegerProperty();
 405         final KeyFrame mid1 = new KeyFrame(Duration.millis(1000), new KeyValue(v1, 40), new KeyValue(v2, 140), new KeyValue(v3, 240));
 406         final KeyFrame end1 = new KeyFrame(Duration.millis(2000), new KeyValue(v1, 60), new KeyValue(v2, 160), new KeyValue(v3, 260));
 407         final KeyFrame end2 = new KeyFrame(Duration.millis(4000), new KeyValue(v1, 70), new KeyValue(v2, 170), new KeyValue(v3, 270));
 408 
 409         final GeneralClipInterpolatorShim gci1 = new GeneralClipInterpolatorShim (new KeyFrame[] {mid1, end1}, new long[] {6000, 12000});
 410         v1.set(  0);
 411         v2.set(100);
 412         v3.set(200);
 413         gci1.validate(true);
 414         gci1.interpolate(TickCalculation.fromMillis(0));
 415         assertEquals(  0, v1.get());
 416         assertEquals(100, v2.get());
 417         assertEquals(200, v3.get());
 418         gci1.interpolate(TickCalculation.fromMillis(300));
 419         assertEquals( 12, v1.get());
 420         assertEquals(112, v2.get());
 421         assertEquals(212, v3.get());
 422         gci1.interpolate(TickCalculation.fromMillis(1000));
 423         assertEquals( 40, v1.get());
 424         assertEquals(140, v2.get());
 425         assertEquals(240, v3.get());
 426         gci1.interpolate(TickCalculation.fromMillis(1600));
 427         assertEquals( 52, v1.get());
 428         assertEquals(152, v2.get());
 429         assertEquals(252, v3.get());


 507         assertEquals(243, v3.get());
 508         gci1.interpolate(TickCalculation.fromMillis(4000));
 509         assertEquals( 70, v1.get());
 510         assertEquals(170, v2.get());
 511         assertEquals(270, v3.get());
 512     }
 513 
 514 
 515     @Test
 516     public void test_DuplicateKeyValue() {
 517         final IntegerProperty v1 = new SimpleIntegerProperty();
 518         final IntegerProperty v2 = new SimpleIntegerProperty();
 519         final KeyFrame start1 = new KeyFrame(Duration.ZERO, new KeyValue(v1, 30), new KeyValue(v2, 0));
 520         final KeyFrame start2 = new KeyFrame(Duration.ZERO, new KeyValue(v1, 30), new KeyValue(v1, -30), new KeyValue(v2, 0));
 521         final KeyFrame mid1 = new KeyFrame(Duration.millis(1000), new KeyValue(v1, 40), new KeyValue(v2, 100));
 522         final KeyFrame mid2 = new KeyFrame(Duration.millis(1000), new KeyValue(v1, 40), new KeyValue(v1, -40), new KeyValue(v2, 100));
 523         final KeyFrame end1 = new KeyFrame(Duration.millis(2000), new KeyValue(v1, 60), new KeyValue(v2, 0));
 524         final KeyFrame end2 = new KeyFrame(Duration.millis(2000), new KeyValue(v1, 60), new KeyValue(v1, -60), new KeyValue(v2, 0));
 525 
 526         // single value in start, single value in mid, duplicate value in end
 527         final GeneralClipInterpolatorShim gci1 = new GeneralClipInterpolatorShim (new KeyFrame[] {start1, mid1, end2}, new long[] {0, 6000, 12000});
 528         v1.set(0);
 529         v2.set(0);
 530         gci1.validate(true);
 531         gci1.interpolate(TickCalculation.fromMillis(0));
 532         assertEquals(30, v1.get());
 533         assertEquals(0, v2.get());
 534         gci1.interpolate(TickCalculation.fromMillis(300));
 535         assertEquals(33, v1.get());
 536         assertEquals(30, v2.get());
 537         gci1.interpolate(TickCalculation.fromMillis(1000));
 538         assertEquals(40, v1.get());
 539         assertEquals(100, v2.get());
 540         gci1.interpolate(TickCalculation.fromMillis(1600));
 541         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (-20 == v1.get()));
 542         assertEquals(40, v2.get());
 543         gci1.interpolate(TickCalculation.fromMillis(2000));
 544         assertTrue("v1.get(): " + v1.get(), (60 == v1.get()) || (-60 == v1.get()));
 545         assertEquals(0, v2.get());
 546 
 547         // single value in start, duplicate value in mid, single value in end
 548         final GeneralClipInterpolatorShim gci2 = new GeneralClipInterpolatorShim (new KeyFrame[] {start1, mid2, end1}, new long[] {0, 6000, 12000});
 549         v1.set(0);
 550         v2.set(0);
 551         gci2.validate(true);
 552         gci2.interpolate(TickCalculation.fromMillis(0));
 553         assertEquals(30, v1.get());
 554         assertEquals(0, v2.get());
 555         gci2.interpolate(TickCalculation.fromMillis(300));
 556         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (9 == v1.get()));
 557         assertEquals(30, v2.get());
 558         gci2.interpolate(TickCalculation.fromMillis(1000));
 559         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 560         assertEquals(100, v2.get());
 561         gci2.interpolate(TickCalculation.fromMillis(1600));
 562         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (20 == v1.get()));
 563         assertEquals(40, v2.get());
 564         gci2.interpolate(TickCalculation.fromMillis(2000));
 565         assertEquals(60, v1.get());
 566         assertEquals(0, v2.get());
 567 
 568         // duplicate value in start, single value in mid, single value in end
 569         final GeneralClipInterpolatorShim gci3 = new GeneralClipInterpolatorShim (new KeyFrame[] {start2, mid1, end1}, new long[] {0, 6000, 12000});
 570         v1.set(0);
 571         v2.set(0);
 572         gci3.validate(true);
 573         gci3.interpolate(TickCalculation.fromMillis(0));
 574         assertTrue("v1.get(): " + v1.get(), (30 == v1.get()) || (-30 == v1.get()));
 575         assertEquals(0, v2.get());
 576         gci3.interpolate(TickCalculation.fromMillis(300));
 577         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (-9 == v1.get()));
 578         assertEquals(30, v2.get());
 579         gci3.interpolate(TickCalculation.fromMillis(1000));
 580         assertEquals(40, v1.get());
 581         assertEquals(100, v2.get());
 582         gci3.interpolate(TickCalculation.fromMillis(1600));
 583         assertEquals(52, v1.get());
 584         assertEquals(40, v2.get());
 585         gci3.interpolate(TickCalculation.fromMillis(2000));
 586         assertEquals(60, v1.get());
 587         assertEquals(0, v2.get());
 588 
 589         // duplicate value in start, duplicate value in mid, single value in end
 590         final GeneralClipInterpolatorShim gci4 = new GeneralClipInterpolatorShim (new KeyFrame[] {start2, mid2, end1}, new long[] {0, 6000, 12000});
 591         v1.set(0);
 592         v2.set(0);
 593         gci4.validate(true);
 594         gci4.interpolate(TickCalculation.fromMillis(0));
 595         assertTrue("v1.get(): " + v1.get(), (30 == v1.get()) || (-30 == v1.get()));
 596         assertEquals(0, v2.get());
 597         gci4.interpolate(TickCalculation.fromMillis(300));
 598         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (9 == v1.get()) || (-9 == v1.get()) || (-33 == v1.get()));
 599         assertEquals(30, v2.get());
 600         gci4.interpolate(TickCalculation.fromMillis(1000));
 601         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 602         assertEquals(100, v2.get());
 603         gci4.interpolate(TickCalculation.fromMillis(1600));
 604         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (20 == v1.get()));
 605         assertEquals(40, v2.get());
 606         gci4.interpolate(TickCalculation.fromMillis(2000));
 607         assertEquals(60, v1.get());
 608         assertEquals(0, v2.get());
 609 
 610         // duplicate value in start, single value in mid, duplicate value in end
 611         final GeneralClipInterpolatorShim gci5 = new GeneralClipInterpolatorShim (new KeyFrame[] {start2, mid1, end2}, new long[] {0, 6000, 12000});
 612         v1.set(0);
 613         v2.set(0);
 614         gci5.validate(true);
 615         gci5.interpolate(TickCalculation.fromMillis(0));
 616         assertTrue("v1.get(): " + v1.get(), (30 == v1.get()) || (-30 == v1.get()));
 617         assertEquals(0, v2.get());
 618         gci5.interpolate(TickCalculation.fromMillis(300));
 619         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (-9 == v1.get()));
 620         assertEquals(30, v2.get());
 621         gci5.interpolate(TickCalculation.fromMillis(1000));
 622         assertEquals(40, v1.get());
 623         assertEquals(100, v2.get());
 624         gci5.interpolate(TickCalculation.fromMillis(1600));
 625         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (-20 == v1.get()));
 626         assertEquals(40, v2.get());
 627         gci5.interpolate(TickCalculation.fromMillis(2000));
 628         assertTrue("v1.get(): " + v1.get(), (60 == v1.get()) || (-60 == v1.get()));
 629         assertEquals(0, v2.get());
 630 
 631         // single value in start, duplicate value in mid, duplicate value in end
 632         final GeneralClipInterpolatorShim gci6 = new GeneralClipInterpolatorShim (new KeyFrame[] {start1, mid2, end2}, new long[] {0, 6000, 12000});
 633         v1.set(0);
 634         v2.set(0);
 635         gci6.validate(true);
 636         gci6.interpolate(TickCalculation.fromMillis(0));
 637         assertEquals(30, v1.get());
 638         assertEquals(0, v2.get());
 639         gci6.interpolate(TickCalculation.fromMillis(300));
 640         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (9 == v1.get()));
 641         assertEquals(30, v2.get());
 642         gci6.interpolate(TickCalculation.fromMillis(1000));
 643         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 644         assertEquals(100, v2.get());
 645         gci6.interpolate(TickCalculation.fromMillis(1600));
 646         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (-20 == v1.get()) || (20 == v1.get()) || (-52 == v1.get()));
 647         assertEquals(40, v2.get());
 648         gci6.interpolate(TickCalculation.fromMillis(2000));
 649         assertTrue("v1.get(): " + v1.get(), (60 == v1.get()) || (-60 == v1.get()));
 650         assertEquals(0, v2.get());
 651 
 652         // duplicate value in start, duplicate value in mid, duplicate value in end
 653         final GeneralClipInterpolatorShim gci7 = new GeneralClipInterpolatorShim (new KeyFrame[] {start2, mid2, end2}, new long[] {0, 6000, 12000});
 654         v1.set(0);
 655         v2.set(0);
 656         gci7.validate(true);
 657         gci7.interpolate(TickCalculation.fromMillis(0));
 658         assertTrue("v1.get(): " + v1.get(), (30 == v1.get()) || (-30 == v1.get()));
 659         assertEquals(0, v2.get());
 660         gci7.interpolate(TickCalculation.fromMillis(300));
 661         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (9 == v1.get()) || (-9 == v1.get()) || (-33 == v1.get()));
 662         assertEquals(30, v2.get());
 663         gci7.interpolate(TickCalculation.fromMillis(1000));
 664         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 665         assertEquals(100, v2.get());
 666         gci7.interpolate(TickCalculation.fromMillis(1600));
 667         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (-20 == v1.get()) || (20 == v1.get()) || (-52 == v1.get()));
 668         assertEquals(40, v2.get());
 669         gci7.interpolate(TickCalculation.fromMillis(2000));
 670         assertTrue("v1.get(): " + v1.get(), (60 == v1.get()) || (-60 == v1.get()));
 671         assertEquals(0, v2.get());
 672 
 673         // no value in start, single value in mid, duplicate value in end
 674         final GeneralClipInterpolatorShim gci8 = new GeneralClipInterpolatorShim (new KeyFrame[] {mid1, end2}, new long[] {6000, 12000});
 675         v1.set(0);
 676         v2.set(0);
 677         gci8.validate(true);
 678         gci8.interpolate(TickCalculation.fromMillis(0));
 679         assertEquals(0, v1.get());
 680         assertEquals(0, v2.get());
 681         gci8.interpolate(TickCalculation.fromMillis(400));
 682         assertEquals(16, v1.get());
 683         assertEquals(40, v2.get());
 684         gci8.interpolate(TickCalculation.fromMillis(1000));
 685         assertEquals(40, v1.get());
 686         assertEquals(100, v2.get());
 687         gci8.interpolate(TickCalculation.fromMillis(1600));
 688         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (-20 == v1.get()));
 689         assertEquals(40, v2.get());
 690         gci8.interpolate(TickCalculation.fromMillis(2000));
 691         assertTrue("v1.get(): " + v1.get(), (60 == v1.get()) || (-60 == v1.get()));
 692         assertEquals(0, v2.get());
 693 
 694         // no value in start, duplicate value in mid, single value in end
 695         final GeneralClipInterpolatorShim gci9 = new GeneralClipInterpolatorShim (new KeyFrame[] {mid2, end1}, new long[] {6000, 12000});
 696         v1.set(0);
 697         v2.set(0);
 698         gci9.validate(true);
 699         gci9.interpolate(TickCalculation.fromMillis(0));
 700         assertEquals(0, v1.get());
 701         assertEquals(0, v2.get());
 702         gci9.interpolate(TickCalculation.fromMillis(400));
 703         assertTrue("v1.get(): " + v1.get(), (16 == v1.get()) || (-16 == v1.get()));
 704         assertEquals(40, v2.get());
 705         gci9.interpolate(TickCalculation.fromMillis(1000));
 706         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 707         assertEquals(100, v2.get());
 708         gci9.interpolate(TickCalculation.fromMillis(1600));
 709         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (20 == v1.get()));
 710         assertEquals(40, v2.get());
 711         gci9.interpolate(TickCalculation.fromMillis(2000));
 712         assertEquals(60, v1.get());
 713         assertEquals(0, v2.get());
 714 
 715         // no value in start, duplicate value in mid, duplicate value in end
 716         final GeneralClipInterpolatorShim gci10 = new GeneralClipInterpolatorShim (new KeyFrame[] {mid2, end2}, new long[] {6000, 12000});
 717         v1.set(0);
 718         v2.set(0);
 719         gci10.validate(true);
 720         gci10.interpolate(TickCalculation.fromMillis(0));
 721         assertEquals(0, v1.get());
 722         assertEquals(0, v2.get());
 723         gci10.interpolate(TickCalculation.fromMillis(400));
 724         assertTrue("v1.get(): " + v1.get(), (16 == v1.get()) || (-16 == v1.get()));
 725         assertEquals(40, v2.get());
 726         gci10.interpolate(TickCalculation.fromMillis(1000));
 727         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 728         assertEquals(100, v2.get());
 729         gci10.interpolate(TickCalculation.fromMillis(1600));
 730         assertTrue("v1.get(): " + v1.get(), (52 == v1.get()) || (-20 == v1.get()) || (20 == v1.get()) || (-52 == v1.get()));
 731         assertEquals(40, v2.get());
 732         gci10.interpolate(TickCalculation.fromMillis(2000));
 733         assertTrue("v1.get(): " + v1.get(), (60 == v1.get()) || (-60 == v1.get()));
 734         assertEquals(0, v2.get());
 735     }
 736 }