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 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 SimpleClipInterpolatorTest {
  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 SimpleClipInterpolator sci = new SimpleClipInterpolator(kf1, kf2,  6000);
  49         
  50         assertNotSame(sci, sci.setKeyFrames(new KeyFrame[]{kf1, kf2, kf3}, new long[] {0, 6000, 12000}));
  51         assertSame   (sci, sci.setKeyFrames(new KeyFrame[]{kf1, kf2     }, new long[] {0, 6000,      }));
  52         assertSame   (sci, sci.setKeyFrames(new KeyFrame[]{kf1,      kf3}, new long[] {0,       12000}));
  53         assertNotSame(sci, sci.setKeyFrames(new KeyFrame[]{kf1          }, new long[] {0,            }));
  54         assertNotSame(sci, sci.setKeyFrames(new KeyFrame[]{     kf2, kf3}, new long[] {   6000, 12000}));
  55         assertSame   (sci, sci.setKeyFrames(new KeyFrame[]{     kf2     }, new long[] {   6000       }));
  56         assertSame   (sci, sci.setKeyFrames(new KeyFrame[]{          kf3}, new long[] {         12000}));
  57         assertNotSame(sci, sci.setKeyFrames(new KeyFrame[]{             }, new long[] {              }));
  58         }
  59     
  60     @Test
  61     public void test_NoKeyValues() {
  62         final KeyFrame start = new KeyFrame(Duration.ZERO);
  63         final KeyFrame end1 = new KeyFrame(Duration.millis(1000));
  64         final KeyFrame end2 = new KeyFrame(Duration.millis(2000));
  65         
  66         // two key frames
  67         final SimpleClipInterpolator sci1 = new SimpleClipInterpolator (start, end1, 6000);
  68         sci1.validate(true);
  69         sci1.interpolate(TickCalculation.fromMillis(300));
  70         
  71         sci1.validate(true);
  72         sci1.interpolate(TickCalculation.fromMillis(800));
  73         
  74         sci1.setKeyFrames(new KeyFrame[]{start, end2}, new long[] {0, 12000});
  75         sci1.interpolate(TickCalculation.fromMillis(400));
  76         
  77         sci1.validate(true);
  78         sci1.interpolate(TickCalculation.fromMillis(600));
  79         
  80         // one key frame
  81         final SimpleClipInterpolator sci2 = new SimpleClipInterpolator (end1, 6000);
  82         sci2.validate(true);
  83         sci2.interpolate(TickCalculation.fromMillis(300));
  84         
  85         sci2.validate(true);
  86         sci2.interpolate(TickCalculation.fromMillis(800));
  87         
  88         sci2.setKeyFrames(new KeyFrame[]{end2}, new long[] {12000});
  89         sci2.interpolate(TickCalculation.fromMillis(400));
  90         
  91         sci2.validate(true);
  92         sci2.interpolate(TickCalculation.fromMillis(600));
  93     }
  94 
  95     @Test
  96     public void test_TwoKeyFrames_OneKeyValue() {
  97         final IntegerProperty v = new SimpleIntegerProperty();
  98         final KeyFrame start1 = new KeyFrame(Duration.ZERO, new KeyValue(v, 30));
  99         final KeyFrame end1 = new KeyFrame(Duration.millis(1000), new KeyValue(v, 40));
 100         final KeyFrame end2 = new KeyFrame(Duration.millis(2000), new KeyValue(v, 60));
 101         
 102         final SimpleClipInterpolator sci1 = new SimpleClipInterpolator (start1, end1, 6000);
 103         v.set(0);
 104         sci1.validate(true);
 105         sci1.interpolate(TickCalculation.fromMillis(0));
 106         assertEquals(30, v.get());
 107         sci1.interpolate(TickCalculation.fromMillis(300));
 108         assertEquals(33, v.get());
 109         sci1.interpolate(TickCalculation.fromMillis(1000));
 110         assertEquals(40, v.get());
 111         
 112         // re-validate
 113         v.set(20);
 114         sci1.validate(true);
 115         sci1.interpolate(TickCalculation.fromMillis(0));
 116         assertEquals(30, v.get());
 117         sci1.interpolate(TickCalculation.fromMillis(800));
 118         assertEquals(38, v.get());
 119         sci1.interpolate(TickCalculation.fromMillis(1000));
 120         assertEquals(40, v.get());
 121         
 122         // set new key frames
 123         sci1.setKeyFrames(new KeyFrame[]{start1, end2}, new long[] {0, 12000});
 124         v.set(0);
 125         sci1.interpolate(TickCalculation.fromMillis(0));
 126         assertEquals(30, v.get());
 127         sci1.interpolate(TickCalculation.fromMillis(400));
 128         assertEquals(34, v.get());
 129         sci1.interpolate(TickCalculation.fromMillis(1000));
 130         assertEquals(40, v.get());
 131         
 132         // validate new key frames
 133         sci1.validate(true);
 134         sci1.interpolate(TickCalculation.fromMillis(0));
 135         assertEquals(30, v.get());
 136         sci1.interpolate(TickCalculation.fromMillis(600));
 137         assertEquals(39, v.get());
 138         sci1.interpolate(TickCalculation.fromMillis(2000));
 139         assertEquals(60, v.get());
 140         
 141     }
 142 
 143     @Test
 144     public void test_OneKeyFrame_OneKeyValue() {
 145         final IntegerProperty v = new SimpleIntegerProperty();
 146         final KeyFrame end1 = new KeyFrame(Duration.millis(1000), new KeyValue(v, 40));
 147         final KeyFrame end2 = new KeyFrame(Duration.millis(2000), new KeyValue(v, 60));
 148 
 149         final SimpleClipInterpolator sci3 = new SimpleClipInterpolator (end1, 6000);
 150         v.set(0);
 151         sci3.validate(true);
 152         sci3.interpolate(TickCalculation.fromMillis(0));
 153         assertEquals(0, v.get());
 154         sci3.interpolate(TickCalculation.fromMillis(300));
 155         assertEquals(12, v.get());
 156         sci3.interpolate(TickCalculation.fromMillis(1000));
 157         assertEquals(40, v.get());
 158         
 159         // re-validate
 160         v.set(20);
 161         sci3.validate(true);
 162         sci3.interpolate(TickCalculation.fromMillis(0));
 163         assertEquals(20, v.get());
 164         sci3.interpolate(TickCalculation.fromMillis(800));
 165         assertEquals(36, v.get());
 166         sci3.interpolate(TickCalculation.fromMillis(1000));
 167         assertEquals(40, v.get());
 168         
 169         // set new key frames
 170         sci3.setKeyFrames(new KeyFrame[]{end2}, new long[] {12000});
 171         v.set(0);
 172         sci3.interpolate(TickCalculation.fromMillis(0));
 173         assertEquals(20, v.get());
 174         sci3.interpolate(TickCalculation.fromMillis(400));
 175         assertEquals(28, v.get());
 176         sci3.interpolate(TickCalculation.fromMillis(1000));
 177         assertEquals(40, v.get());
 178         
 179         // validate new key frames
 180         v.set(20);
 181         sci3.validate(true);
 182         sci3.interpolate(TickCalculation.fromMillis(0));
 183         assertEquals(20, v.get());
 184         sci3.interpolate(TickCalculation.fromMillis(600));
 185         assertEquals(32, v.get());
 186         sci3.interpolate(TickCalculation.fromMillis(2000));
 187         assertEquals(60, v.get());
 188     }
 189 
 190     @Test
 191     public void test_TwoKeyFrames_ThreeKeyValues() {
 192         final IntegerProperty v1 = new SimpleIntegerProperty();
 193         final IntegerProperty v2 = new SimpleIntegerProperty();
 194         final IntegerProperty v3 = new SimpleIntegerProperty();
 195         final KeyFrame start1 = new KeyFrame(Duration.ZERO, new KeyValue(v2, 130), new KeyValue(v3, 230));
 196         final KeyFrame end1 = new KeyFrame(Duration.millis(1000), new KeyValue(v1, 40), new KeyValue(v2, 140));
 197         final KeyFrame end2 = new KeyFrame(Duration.millis(2000), new KeyValue(v1, 60), new KeyValue(v2, 160));
 198         
 199         final SimpleClipInterpolator sci1 = new SimpleClipInterpolator (start1, end1, 6000);
 200         v1.set(  0);
 201         v2.set(100);
 202         v3.set(200);
 203         sci1.validate(true);
 204         sci1.interpolate(TickCalculation.fromMillis(0));
 205         assertEquals(  0, v1.get());
 206         assertEquals(130, v2.get());
 207         assertEquals(200, v3.get());
 208         sci1.interpolate(TickCalculation.fromMillis(300));
 209         assertEquals( 12, v1.get());
 210         assertEquals(133, v2.get());
 211         assertEquals(200, v3.get());
 212         sci1.interpolate(TickCalculation.fromMillis(1000));
 213         assertEquals( 40, v1.get());
 214         assertEquals(140, v2.get());
 215         assertEquals(200, v3.get());
 216         
 217         // re-validate
 218         v1.set( 20);
 219         v2.set(120);
 220         v3.set(220);
 221         sci1.validate(true);
 222         sci1.interpolate(TickCalculation.fromMillis(0));
 223         assertEquals( 20, v1.get());
 224         assertEquals(130, v2.get());
 225         assertEquals(220, v3.get());
 226         sci1.interpolate(TickCalculation.fromMillis(800));
 227         assertEquals( 36, v1.get());
 228         assertEquals(138, v2.get());
 229         assertEquals(220, v3.get());
 230         sci1.interpolate(TickCalculation.fromMillis(1000));
 231         assertEquals( 40, v1.get());
 232         assertEquals(140, v2.get());
 233         assertEquals(220, v3.get());
 234         
 235         // change key frames
 236         sci1.setKeyFrames(new KeyFrame[]{start1, end2}, new long[] {0, 12000});
 237         v1.set(  0);
 238         v2.set(100);
 239         v3.set(200);
 240         sci1.interpolate(TickCalculation.fromMillis(0));
 241         assertEquals( 20, v1.get());
 242         assertEquals(130, v2.get());
 243         assertEquals(200, v3.get());
 244         sci1.interpolate(TickCalculation.fromMillis(300));
 245         assertEquals( 26, v1.get());
 246         assertEquals(133, v2.get());
 247         assertEquals(200, v3.get());
 248         sci1.interpolate(TickCalculation.fromMillis(1000));
 249         assertEquals( 40, v1.get());
 250         assertEquals(140, v2.get());
 251         assertEquals(200, v3.get());
 252         
 253         // validate new key frames
 254         v1.set( 20);
 255         v2.set(120);
 256         v3.set(220);
 257         sci1.validate(true);
 258         sci1.interpolate(TickCalculation.fromMillis(0));
 259         assertEquals( 20, v1.get());
 260         assertEquals(130, v2.get());
 261         assertEquals(220, v3.get());
 262         sci1.interpolate(TickCalculation.fromMillis(600));
 263         assertEquals( 32, v1.get());
 264         assertEquals(139, v2.get());
 265         assertEquals(220, v3.get());
 266         sci1.interpolate(TickCalculation.fromMillis(2000));
 267         assertEquals( 60, v1.get());
 268         assertEquals(160, v2.get());
 269         assertEquals(220, v3.get());
 270         
 271     }
 272 
 273     @Test
 274     public void test_OneKeyFrames_ThreeKeyValues() {
 275         final IntegerProperty v1 = new SimpleIntegerProperty();
 276         final IntegerProperty v2 = new SimpleIntegerProperty();
 277         final IntegerProperty v3 = new SimpleIntegerProperty();
 278         final KeyFrame end1 = new KeyFrame(Duration.millis(1000), new KeyValue(v1, 40), new KeyValue(v2, 140), new KeyValue(v3, 240));
 279         final KeyFrame end2 = new KeyFrame(Duration.millis(2000), new KeyValue(v1, 60), new KeyValue(v2, 160), new KeyValue(v3, 260));
 280 
 281         final SimpleClipInterpolator sci1 = new SimpleClipInterpolator (end1, 6000);
 282         v1.set(  0);
 283         v2.set(100);
 284         v3.set(200);
 285         sci1.validate(true);
 286         sci1.interpolate(TickCalculation.fromMillis(0));
 287         assertEquals(  0, v1.get());
 288         assertEquals(100, v2.get());
 289         assertEquals(200, v3.get());
 290         sci1.interpolate(TickCalculation.fromMillis(300));
 291         assertEquals( 12, v1.get());
 292         assertEquals(112, v2.get());
 293         assertEquals(212, v3.get());
 294         sci1.interpolate(TickCalculation.fromMillis(1000));
 295         assertEquals( 40, v1.get());
 296         assertEquals(140, v2.get());
 297         assertEquals(240, v3.get());
 298         
 299         // re-validate
 300         v1.set( 20);
 301         v2.set(120);
 302         v3.set(220);
 303         sci1.validate(true);
 304         sci1.interpolate(TickCalculation.fromMillis(0));
 305         assertEquals( 20, v1.get());
 306         assertEquals(120, v2.get());
 307         assertEquals(220, v3.get());
 308         sci1.interpolate(TickCalculation.fromMillis(800));
 309         assertEquals( 36, v1.get());
 310         assertEquals(136, v2.get());
 311         assertEquals(236, v3.get());
 312         sci1.interpolate(TickCalculation.fromMillis(1000));
 313         assertEquals( 40, v1.get());
 314         assertEquals(140, v2.get());
 315         assertEquals(240, v3.get());
 316         
 317         // change key frames
 318         sci1.setKeyFrames(new KeyFrame[]{end2}, new long[] {12000});
 319         v1.set(  0);
 320         v2.set(100);
 321         v3.set(200);
 322         sci1.interpolate(TickCalculation.fromMillis(0));
 323         assertEquals( 20, v1.get());
 324         assertEquals(120, v2.get());
 325         assertEquals(220, v3.get());
 326         sci1.interpolate(TickCalculation.fromMillis(300));
 327         assertEquals( 26, v1.get());
 328         assertEquals(126, v2.get());
 329         assertEquals(226, v3.get());
 330         sci1.interpolate(TickCalculation.fromMillis(1000));
 331         assertEquals( 40, v1.get());
 332         assertEquals(140, v2.get());
 333         assertEquals(240, v3.get());
 334         
 335         // validate new key frames
 336         v1.set( 20);
 337         v2.set(120);
 338         v3.set(220);
 339         sci1.validate(true);
 340         sci1.interpolate(TickCalculation.fromMillis(0));
 341         assertEquals( 20, v1.get());
 342         assertEquals(120, v2.get());
 343         assertEquals(220, v3.get());
 344         sci1.interpolate(TickCalculation.fromMillis(600));
 345         assertEquals( 32, v1.get());
 346         assertEquals(132, v2.get());
 347         assertEquals(232, v3.get());
 348         sci1.interpolate(TickCalculation.fromMillis(2000));
 349         assertEquals( 60, v1.get());
 350         assertEquals(160, v2.get());
 351         assertEquals(260, v3.get());
 352     }
 353 
 354     @Test
 355     public void test_DuplicateKeyValue() {
 356         final IntegerProperty v1 = new SimpleIntegerProperty();
 357         final IntegerProperty v2 = new SimpleIntegerProperty();
 358         final KeyFrame start1 = new KeyFrame(Duration.ZERO, new KeyValue(v1, 30), new KeyValue(v2, 0));
 359         final KeyFrame start2 = new KeyFrame(Duration.ZERO, new KeyValue(v1, 30), new KeyValue(v1, -30), new KeyValue(v2, 0));
 360         final KeyFrame end1 = new KeyFrame(Duration.millis(1000), new KeyValue(v1, 40), new KeyValue(v2, 100));
 361         final KeyFrame end2 = new KeyFrame(Duration.millis(1000), new KeyValue(v1, 40), new KeyValue(v1, -40), new KeyValue(v2, 100));
 362 
 363         // single value in start, duplicate value in end
 364         final SimpleClipInterpolator sci1 = new SimpleClipInterpolator (start1, end2, 6000);
 365         v1.set(0);
 366         v2.set(0);
 367         sci1.validate(true);
 368         sci1.interpolate(TickCalculation.fromMillis(0));
 369         assertEquals(30, v1.get());
 370         assertEquals(0, v2.get());
 371         sci1.interpolate(TickCalculation.fromMillis(300));
 372         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (9 == v1.get()));
 373         assertEquals(30, v2.get());
 374         sci1.interpolate(TickCalculation.fromMillis(1000));
 375         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 376         assertEquals(100, v2.get());
 377 
 378         // duplicate value in start, single value in end
 379         final SimpleClipInterpolator sci2 = new SimpleClipInterpolator (start2, end1, 6000);
 380         v1.set(0);
 381         v2.set(0);
 382         sci2.validate(true);
 383         sci2.interpolate(TickCalculation.fromMillis(0));
 384         assertTrue("v1.get(): " + v1.get(), (30 == v1.get()) || (-30 == v1.get()));
 385         assertEquals(0, v2.get());
 386         sci2.interpolate(TickCalculation.fromMillis(300));
 387         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (-9 == v1.get()));
 388         assertEquals(30, v2.get());
 389         sci2.interpolate(TickCalculation.fromMillis(1000));
 390         assertEquals(40, v1.get());
 391         assertEquals(100, v2.get());
 392 
 393         // duplicate value in start, duplicate value in end
 394         final SimpleClipInterpolator sci3 = new SimpleClipInterpolator (start2, end2, 6000);
 395         v1.set(0);
 396         v2.set(0);
 397         sci3.validate(true);
 398         sci3.interpolate(TickCalculation.fromMillis(0));
 399         assertTrue("v1.get(): " + v1.get(), (30 == v1.get()) || (-30 == v1.get()));
 400         assertEquals(0, v2.get());
 401         sci3.interpolate(TickCalculation.fromMillis(300));
 402         assertTrue("v1.get(): " + v1.get(), (33 == v1.get()) || (9 == v1.get()) || (-9 == v1.get()) || (-33 == v1.get()));
 403         assertEquals(30, v2.get());
 404         sci3.interpolate(TickCalculation.fromMillis(1000));
 405         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 406         assertEquals(100, v2.get());
 407 
 408         // no value in start, duplicate value in end
 409         final SimpleClipInterpolator sci4 = new SimpleClipInterpolator (end2, 6000);
 410         v1.set(0);
 411         v2.set(0);
 412         sci4.validate(true);
 413         sci4.interpolate(TickCalculation.fromMillis(0));
 414         assertEquals(0, v1.get());
 415         assertEquals(0, v2.get());
 416         sci4.interpolate(TickCalculation.fromMillis(400));
 417         assertTrue("v1.get(): " + v1.get(), (16 == v1.get()) || (-16 == v1.get()));
 418         assertEquals(40, v2.get());
 419         sci4.interpolate(TickCalculation.fromMillis(1000));
 420         assertTrue("v1.get(): " + v1.get(), (40 == v1.get()) || (-40 == v1.get()));
 421         assertEquals(100, v2.get());
 422     }
 423 
 424 }