1 /*
   2  * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package test.com.sun.scenario.animation.shared;
  27 
  28 import com.sun.javafx.animation.TickCalculation;
  29 import com.sun.scenario.animation.shared.SimpleClipInterpolatorShim;
  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 SimpleClipInterpolatorTest {
  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 SimpleClipInterpolatorShim sci = new SimpleClipInterpolatorShim(kf1, kf2,  6000);
  50         
  51         assertNotSame(sci, sci.setKeyFrames(new KeyFrame[]{kf1, kf2, kf3}, new long[] {0, 6000, 12000}));
  52         assertSame   (sci, sci.setKeyFrames(new KeyFrame[]{kf1, kf2     }, new long[] {0, 6000,      }));
  53         assertSame   (sci, sci.setKeyFrames(new KeyFrame[]{kf1,      kf3}, new long[] {0,       12000}));
  54         assertNotSame(sci, sci.setKeyFrames(new KeyFrame[]{kf1          }, new long[] {0,            }));
  55         assertNotSame(sci, sci.setKeyFrames(new KeyFrame[]{     kf2, kf3}, new long[] {   6000, 12000}));
  56         assertSame   (sci, sci.setKeyFrames(new KeyFrame[]{     kf2     }, new long[] {   6000       }));
  57         assertSame   (sci, sci.setKeyFrames(new KeyFrame[]{          kf3}, new long[] {         12000}));
  58         assertNotSame(sci, sci.setKeyFrames(new KeyFrame[]{             }, new long[] {              }));
  59         }
  60     
  61     @Test
  62     public void test_NoKeyValues() {
  63         final KeyFrame start = new KeyFrame(Duration.ZERO);
  64         final KeyFrame end1 = new KeyFrame(Duration.millis(1000));
  65         final KeyFrame end2 = new KeyFrame(Duration.millis(2000));
  66         
  67         // two key frames
  68         final SimpleClipInterpolatorShim sci1 = new SimpleClipInterpolatorShim(start, end1, 6000);
  69         sci1.validate(true);
  70         sci1.interpolate(TickCalculation.fromMillis(300));
  71         
  72         sci1.validate(true);
  73         sci1.interpolate(TickCalculation.fromMillis(800));
  74         
  75         sci1.setKeyFrames(new KeyFrame[]{start, end2}, new long[] {0, 12000});
  76         sci1.interpolate(TickCalculation.fromMillis(400));
  77         
  78         sci1.validate(true);
  79         sci1.interpolate(TickCalculation.fromMillis(600));
  80         
  81         // one key frame
  82         final SimpleClipInterpolatorShim sci2 = new SimpleClipInterpolatorShim(end1, 6000);
  83         sci2.validate(true);
  84         sci2.interpolate(TickCalculation.fromMillis(300));
  85         
  86         sci2.validate(true);
  87         sci2.interpolate(TickCalculation.fromMillis(800));
  88         
  89         sci2.setKeyFrames(new KeyFrame[]{end2}, new long[] {12000});
  90         sci2.interpolate(TickCalculation.fromMillis(400));
  91         
  92         sci2.validate(true);
  93         sci2.interpolate(TickCalculation.fromMillis(600));
  94     }
  95 
  96     @Test
  97     public void test_TwoKeyFrames_OneKeyValue() {
  98         final IntegerProperty v = new SimpleIntegerProperty();
  99         final KeyFrame start1 = new KeyFrame(Duration.ZERO, new KeyValue(v, 30));
 100         final KeyFrame end1 = new KeyFrame(Duration.millis(1000), new KeyValue(v, 40));
 101         final KeyFrame end2 = new KeyFrame(Duration.millis(2000), new KeyValue(v, 60));
 102         
 103         final SimpleClipInterpolatorShim sci1 = new SimpleClipInterpolatorShim(start1, end1, 6000);
 104         v.set(0);
 105         sci1.validate(true);
 106         sci1.interpolate(TickCalculation.fromMillis(0));
 107         assertEquals(30, v.get());
 108         sci1.interpolate(TickCalculation.fromMillis(300));
 109         assertEquals(33, v.get());
 110         sci1.interpolate(TickCalculation.fromMillis(1000));
 111         assertEquals(40, v.get());
 112         
 113         // re-validate
 114         v.set(20);
 115         sci1.validate(true);
 116         sci1.interpolate(TickCalculation.fromMillis(0));
 117         assertEquals(30, v.get());
 118         sci1.interpolate(TickCalculation.fromMillis(800));
 119         assertEquals(38, v.get());
 120         sci1.interpolate(TickCalculation.fromMillis(1000));
 121         assertEquals(40, v.get());
 122         
 123         // set new key frames
 124         sci1.setKeyFrames(new KeyFrame[]{start1, end2}, new long[] {0, 12000});
 125         v.set(0);
 126         sci1.interpolate(TickCalculation.fromMillis(0));
 127         assertEquals(30, v.get());
 128         sci1.interpolate(TickCalculation.fromMillis(400));
 129         assertEquals(34, v.get());
 130         sci1.interpolate(TickCalculation.fromMillis(1000));
 131         assertEquals(40, v.get());
 132         
 133         // validate new key frames
 134         sci1.validate(true);
 135         sci1.interpolate(TickCalculation.fromMillis(0));
 136         assertEquals(30, v.get());
 137         sci1.interpolate(TickCalculation.fromMillis(600));
 138         assertEquals(39, v.get());
 139         sci1.interpolate(TickCalculation.fromMillis(2000));
 140         assertEquals(60, v.get());
 141         
 142     }
 143 
 144     @Test
 145     public void test_OneKeyFrame_OneKeyValue() {
 146         final IntegerProperty v = new SimpleIntegerProperty();
 147         final KeyFrame end1 = new KeyFrame(Duration.millis(1000), new KeyValue(v, 40));
 148         final KeyFrame end2 = new KeyFrame(Duration.millis(2000), new KeyValue(v, 60));
 149 
 150         final SimpleClipInterpolatorShim sci3 = new SimpleClipInterpolatorShim(end1, 6000);
 151         v.set(0);
 152         sci3.validate(true);
 153         sci3.interpolate(TickCalculation.fromMillis(0));
 154         assertEquals(0, v.get());
 155         sci3.interpolate(TickCalculation.fromMillis(300));
 156         assertEquals(12, v.get());
 157         sci3.interpolate(TickCalculation.fromMillis(1000));
 158         assertEquals(40, v.get());
 159         
 160         // re-validate
 161         v.set(20);
 162         sci3.validate(true);
 163         sci3.interpolate(TickCalculation.fromMillis(0));
 164         assertEquals(20, v.get());
 165         sci3.interpolate(TickCalculation.fromMillis(800));
 166         assertEquals(36, v.get());
 167         sci3.interpolate(TickCalculation.fromMillis(1000));
 168         assertEquals(40, v.get());
 169         
 170         // set new key frames
 171         sci3.setKeyFrames(new KeyFrame[]{end2}, new long[] {12000});
 172         v.set(0);
 173         sci3.interpolate(TickCalculation.fromMillis(0));
 174         assertEquals(20, v.get());
 175         sci3.interpolate(TickCalculation.fromMillis(400));
 176         assertEquals(28, v.get());
 177         sci3.interpolate(TickCalculation.fromMillis(1000));
 178         assertEquals(40, v.get());
 179         
 180         // validate new key frames
 181         v.set(20);
 182         sci3.validate(true);
 183         sci3.interpolate(TickCalculation.fromMillis(0));
 184         assertEquals(20, v.get());
 185         sci3.interpolate(TickCalculation.fromMillis(600));
 186         assertEquals(32, v.get());
 187         sci3.interpolate(TickCalculation.fromMillis(2000));
 188         assertEquals(60, v.get());
 189     }
 190 
 191     @Test
 192     public void test_TwoKeyFrames_ThreeKeyValues() {
 193         final IntegerProperty v1 = new SimpleIntegerProperty();
 194         final IntegerProperty v2 = new SimpleIntegerProperty();
 195         final IntegerProperty v3 = new SimpleIntegerProperty();
 196         final KeyFrame start1 = new KeyFrame(Duration.ZERO, new KeyValue(v2, 130), new KeyValue(v3, 230));
 197         final KeyFrame end1 = new KeyFrame(Duration.millis(1000), new KeyValue(v1, 40), new KeyValue(v2, 140));
 198         final KeyFrame end2 = new KeyFrame(Duration.millis(2000), new KeyValue(v1, 60), new KeyValue(v2, 160));
 199         
 200         final SimpleClipInterpolatorShim sci1 = new SimpleClipInterpolatorShim(start1, end1, 6000);
 201         v1.set(  0);
 202         v2.set(100);
 203         v3.set(200);
 204         sci1.validate(true);
 205         sci1.interpolate(TickCalculation.fromMillis(0));
 206         assertEquals(  0, v1.get());
 207         assertEquals(130, v2.get());
 208         assertEquals(200, v3.get());
 209         sci1.interpolate(TickCalculation.fromMillis(300));
 210         assertEquals( 12, v1.get());
 211         assertEquals(133, v2.get());
 212         assertEquals(200, v3.get());
 213         sci1.interpolate(TickCalculation.fromMillis(1000));
 214         assertEquals( 40, v1.get());
 215         assertEquals(140, v2.get());
 216         assertEquals(200, v3.get());
 217         
 218         // re-validate
 219         v1.set( 20);
 220         v2.set(120);
 221         v3.set(220);
 222         sci1.validate(true);
 223         sci1.interpolate(TickCalculation.fromMillis(0));
 224         assertEquals( 20, v1.get());
 225         assertEquals(130, v2.get());
 226         assertEquals(220, v3.get());
 227         sci1.interpolate(TickCalculation.fromMillis(800));
 228         assertEquals( 36, v1.get());
 229         assertEquals(138, v2.get());
 230         assertEquals(220, v3.get());
 231         sci1.interpolate(TickCalculation.fromMillis(1000));
 232         assertEquals( 40, v1.get());
 233         assertEquals(140, v2.get());
 234         assertEquals(220, v3.get());
 235         
 236         // change key frames
 237         sci1.setKeyFrames(new KeyFrame[]{start1, end2}, new long[] {0, 12000});
 238         v1.set(  0);
 239         v2.set(100);
 240         v3.set(200);
 241         sci1.interpolate(TickCalculation.fromMillis(0));
 242         assertEquals( 20, v1.get());
 243         assertEquals(130, v2.get());
 244         assertEquals(200, v3.get());
 245         sci1.interpolate(TickCalculation.fromMillis(300));
 246         assertEquals( 26, v1.get());
 247         assertEquals(133, v2.get());
 248         assertEquals(200, v3.get());
 249         sci1.interpolate(TickCalculation.fromMillis(1000));
 250         assertEquals( 40, v1.get());
 251         assertEquals(140, v2.get());
 252         assertEquals(200, v3.get());
 253         
 254         // validate new key frames
 255         v1.set( 20);
 256         v2.set(120);
 257         v3.set(220);
 258         sci1.validate(true);
 259         sci1.interpolate(TickCalculation.fromMillis(0));
 260         assertEquals( 20, v1.get());
 261         assertEquals(130, v2.get());
 262         assertEquals(220, v3.get());
 263         sci1.interpolate(TickCalculation.fromMillis(600));
 264         assertEquals( 32, v1.get());
 265         assertEquals(139, v2.get());
 266         assertEquals(220, v3.get());
 267         sci1.interpolate(TickCalculation.fromMillis(2000));
 268         assertEquals( 60, v1.get());
 269         assertEquals(160, v2.get());
 270         assertEquals(220, v3.get());
 271         
 272     }
 273 
 274     @Test
 275     public void test_OneKeyFrames_ThreeKeyValues() {
 276         final IntegerProperty v1 = new SimpleIntegerProperty();
 277         final IntegerProperty v2 = new SimpleIntegerProperty();
 278         final IntegerProperty v3 = new SimpleIntegerProperty();
 279         final KeyFrame end1 = new KeyFrame(Duration.millis(1000), new KeyValue(v1, 40), new KeyValue(v2, 140), new KeyValue(v3, 240));
 280         final KeyFrame end2 = new KeyFrame(Duration.millis(2000), new KeyValue(v1, 60), new KeyValue(v2, 160), new KeyValue(v3, 260));
 281 
 282         final SimpleClipInterpolatorShim sci1 = new SimpleClipInterpolatorShim(end1, 6000);
 283         v1.set(  0);
 284         v2.set(100);
 285         v3.set(200);
 286         sci1.validate(true);
 287         sci1.interpolate(TickCalculation.fromMillis(0));
 288         assertEquals(  0, v1.get());
 289         assertEquals(100, v2.get());
 290         assertEquals(200, v3.get());
 291         sci1.interpolate(TickCalculation.fromMillis(300));
 292         assertEquals( 12, v1.get());
 293         assertEquals(112, v2.get());
 294         assertEquals(212, v3.get());
 295         sci1.interpolate(TickCalculation.fromMillis(1000));
 296         assertEquals( 40, v1.get());
 297         assertEquals(140, v2.get());
 298         assertEquals(240, v3.get());
 299         
 300         // re-validate
 301         v1.set( 20);
 302         v2.set(120);
 303         v3.set(220);
 304         sci1.validate(true);
 305         sci1.interpolate(TickCalculation.fromMillis(0));
 306         assertEquals( 20, v1.get());
 307         assertEquals(120, v2.get());
 308         assertEquals(220, v3.get());
 309         sci1.interpolate(TickCalculation.fromMillis(800));
 310         assertEquals( 36, v1.get());
 311         assertEquals(136, v2.get());
 312         assertEquals(236, v3.get());
 313         sci1.interpolate(TickCalculation.fromMillis(1000));
 314         assertEquals( 40, v1.get());
 315         assertEquals(140, v2.get());
 316         assertEquals(240, v3.get());
 317         
 318         // change key frames
 319         sci1.setKeyFrames(new KeyFrame[]{end2}, new long[] {12000});
 320         v1.set(  0);
 321         v2.set(100);
 322         v3.set(200);
 323         sci1.interpolate(TickCalculation.fromMillis(0));
 324         assertEquals( 20, v1.get());
 325         assertEquals(120, v2.get());
 326         assertEquals(220, v3.get());
 327         sci1.interpolate(TickCalculation.fromMillis(300));
 328         assertEquals( 26, v1.get());
 329         assertEquals(126, v2.get());
 330         assertEquals(226, v3.get());
 331         sci1.interpolate(TickCalculation.fromMillis(1000));
 332         assertEquals( 40, v1.get());
 333         assertEquals(140, v2.get());
 334         assertEquals(240, v3.get());
 335         
 336         // validate new key frames
 337         v1.set( 20);
 338         v2.set(120);
 339         v3.set(220);
 340         sci1.validate(true);
 341         sci1.interpolate(TickCalculation.fromMillis(0));
 342         assertEquals( 20, v1.get());
 343         assertEquals(120, v2.get());
 344         assertEquals(220, v3.get());
 345         sci1.interpolate(TickCalculation.fromMillis(600));
 346         assertEquals( 32, v1.get());
 347         assertEquals(132, v2.get());
 348         assertEquals(232, v3.get());
 349         sci1.interpolate(TickCalculation.fromMillis(2000));
 350         assertEquals( 60, v1.get());
 351         assertEquals(160, v2.get());
 352         assertEquals(260, v3.get());
 353     }
 354 
 355     @Test
 356     public void test_DuplicateKeyValue() {
 357         final IntegerProperty v1 = new SimpleIntegerProperty();
 358         final IntegerProperty v2 = new SimpleIntegerProperty();
 359         final KeyFrame start1 = new KeyFrame(Duration.ZERO, new KeyValue(v1, 30), new KeyValue(v2, 0));
 360         final KeyFrame start2 = new KeyFrame(Duration.ZERO, new KeyValue(v1, 30), new KeyValue(v1, -30), new KeyValue(v2, 0));
 361         final KeyFrame end1 = new KeyFrame(Duration.millis(1000), new KeyValue(v1, 40), new KeyValue(v2, 100));
 362         final KeyFrame end2 = new KeyFrame(Duration.millis(1000), new KeyValue(v1, 40), new KeyValue(v1, -40), new KeyValue(v2, 100));
 363 
 364         // single value in start, duplicate value in end
 365         final SimpleClipInterpolatorShim sci1 = new SimpleClipInterpolatorShim(start1, end2, 6000);
 366         v1.set(0);
 367         v2.set(0);
 368         sci1.validate(true);
 369         sci1.interpolate(TickCalculation.fromMillis(0));
 370         assertEquals(30, v1.get());
 371         assertEquals(0, v2.get());
 372         sci1.interpolate(TickCalculation.fromMillis(300));
 373         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (9 == v1.get()));
 374         assertEquals(30, v2.get());
 375         sci1.interpolate(TickCalculation.fromMillis(1000));
 376         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 377         assertEquals(100, v2.get());
 378 
 379         // duplicate value in start, single value in end
 380         final SimpleClipInterpolatorShim sci2 = new SimpleClipInterpolatorShim(start2, end1, 6000);
 381         v1.set(0);
 382         v2.set(0);
 383         sci2.validate(true);
 384         sci2.interpolate(TickCalculation.fromMillis(0));
 385         assertTrue("v1.get(): " + v1.get(), (30 == v1.get()) || (-30 == v1.get()));
 386         assertEquals(0, v2.get());
 387         sci2.interpolate(TickCalculation.fromMillis(300));
 388         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (-9 == v1.get()));
 389         assertEquals(30, v2.get());
 390         sci2.interpolate(TickCalculation.fromMillis(1000));
 391         assertEquals(40, v1.get());
 392         assertEquals(100, v2.get());
 393 
 394         // duplicate value in start, duplicate value in end
 395         final SimpleClipInterpolatorShim sci3 = new SimpleClipInterpolatorShim(start2, end2, 6000);
 396         v1.set(0);
 397         v2.set(0);
 398         sci3.validate(true);
 399         sci3.interpolate(TickCalculation.fromMillis(0));
 400         assertTrue("v1.get(): " + v1.get(), (30 == v1.get()) || (-30 == v1.get()));
 401         assertEquals(0, v2.get());
 402         sci3.interpolate(TickCalculation.fromMillis(300));
 403         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (9 == v1.get()) || (-9 == v1.get()) || (-33 == v1.get()));
 404         assertEquals(30, v2.get());
 405         sci3.interpolate(TickCalculation.fromMillis(1000));
 406         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 407         assertEquals(100, v2.get());
 408 
 409         // no value in start, duplicate value in end
 410         final SimpleClipInterpolatorShim sci4 = new SimpleClipInterpolatorShim(end2, 6000);
 411         v1.set(0);
 412         v2.set(0);
 413         sci4.validate(true);
 414         sci4.interpolate(TickCalculation.fromMillis(0));
 415         assertEquals(0, v1.get());
 416         assertEquals(0, v2.get());
 417         sci4.interpolate(TickCalculation.fromMillis(400));
 418         assertTrue("v1.get(): " + v1.get(), (16 == v1.get()) || (-16 == v1.get()));
 419         assertEquals(40, v2.get());
 420         sci4.interpolate(TickCalculation.fromMillis(1000));
 421         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 422         assertEquals(100, v2.get());
 423     }
 424 
 425 }