1 /*
   2  * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package test.javafx.animation;
  27 
  28 import javafx.animation.AnimationShim;
  29 import javafx.animation.FadeTransition;
  30 import javafx.animation.Interpolator;
  31 import javafx.animation.ParallelTransition;
  32 import javafx.animation.TransitionShim;
  33 import static org.junit.Assert.assertEquals;
  34 import static org.junit.Assert.assertFalse;
  35 import static org.junit.Assert.assertNull;
  36 import static org.junit.Assert.assertTrue;
  37 import javafx.scene.Node;
  38 import javafx.scene.shape.Rectangle;
  39 import javafx.util.Duration;
  40 
  41 import org.junit.Before;
  42 import org.junit.Test;
  43 
  44 public class FadeTransitionTest {
  45 
  46     private static Duration DEFAULT_DURATION = Duration.millis(400);
  47     private static Interpolator DEFAULT_INTERPOLATOR = Interpolator.EASE_BOTH;
  48 
  49     private static double EPSILON = 1e-12;
  50     private static Duration ONE_SEC = Duration.millis(1000);
  51     private static Duration TWO_SECS = Duration.millis(2000);
  52 
  53     private Node node;
  54 
  55     @Before
  56     public void setUp() {
  57         node = new Rectangle();
  58     }
  59 
  60     @Test
  61     public void testDefaultValues() {
  62         // empty ctor
  63         final FadeTransition t0 = new FadeTransition();
  64         assertEquals(DEFAULT_DURATION, t0.getDuration());
  65         assertEquals(DEFAULT_DURATION, t0.getCycleDuration());
  66         assertTrue(Double.isNaN(t0.getFromValue()));
  67         assertTrue(Double.isNaN(t0.getToValue()));
  68         assertEquals(0.0, t0.getByValue(), EPSILON);
  69         assertNull(t0.getNode());
  70         assertEquals(DEFAULT_INTERPOLATOR, t0.getInterpolator());
  71         assertNull(t0.getOnFinished());
  72 
  73         // duration only
  74         final FadeTransition t1 = new FadeTransition(ONE_SEC);
  75         assertEquals(ONE_SEC, t1.getDuration());
  76         assertTrue(Double.isNaN(t1.getFromValue()));
  77         assertTrue(Double.isNaN(t1.getToValue()));
  78         assertEquals(0.0, t1.getByValue(), EPSILON);
  79         assertNull(t1.getNode());
  80         assertEquals(DEFAULT_INTERPOLATOR, t1.getInterpolator());
  81         assertNull(t1.getOnFinished());
  82 
  83         // duration and node
  84         final FadeTransition t2 = new FadeTransition(TWO_SECS, node);
  85         assertEquals(TWO_SECS, t2.getDuration());
  86         assertTrue(Double.isNaN(t2.getFromValue()));
  87         assertTrue(Double.isNaN(t2.getToValue()));
  88         assertEquals(0.0, t2.getByValue(), EPSILON);
  89         assertEquals(node, t2.getNode());
  90         assertEquals(DEFAULT_INTERPOLATOR, t2.getInterpolator());
  91         assertNull(t2.getOnFinished());
  92     }
  93 
  94     @Test
  95     public void testDefaultValuesFromProperties() {
  96         // empty ctor
  97         final FadeTransition t0 = new FadeTransition();
  98         assertEquals(DEFAULT_DURATION, t0.durationProperty().get());
  99         assertTrue(Double.isNaN(t0.fromValueProperty().get()));
 100         assertTrue(Double.isNaN(t0.toValueProperty().get()));
 101         assertEquals(0.0, t0.byValueProperty().get(), EPSILON);
 102         assertNull(t0.nodeProperty().get());
 103         assertEquals(DEFAULT_INTERPOLATOR, t0.interpolatorProperty().get());
 104         assertNull(t0.onFinishedProperty().get());
 105 
 106         // duration only
 107         final FadeTransition t1 = new FadeTransition(ONE_SEC);
 108         assertEquals(ONE_SEC, t1.durationProperty().get());
 109         assertTrue(Double.isNaN(t1.fromValueProperty().get()));
 110         assertTrue(Double.isNaN(t1.toValueProperty().get()));
 111         assertEquals(0.0, t1.byValueProperty().get(), EPSILON);
 112         assertNull(t1.nodeProperty().get());
 113         assertEquals(DEFAULT_INTERPOLATOR, t1.interpolatorProperty().get());
 114         assertNull(t1.onFinishedProperty().get());
 115 
 116         // duration and node
 117         final FadeTransition t2 = new FadeTransition(TWO_SECS, node);
 118         assertEquals(TWO_SECS, t2.durationProperty().get());
 119         assertTrue(Double.isNaN(t2.fromValueProperty().get()));
 120         assertTrue(Double.isNaN(t2.toValueProperty().get()));
 121         assertEquals(0.0, t2.byValueProperty().get(), EPSILON);
 122         assertEquals(node, t2.nodeProperty().get());
 123         assertEquals(DEFAULT_INTERPOLATOR, t2.interpolatorProperty().get());
 124         assertNull(t2.onFinishedProperty().get());
 125     }
 126 
 127     @Test
 128     public void testInterpolate() {
 129         final FadeTransition t0 = new FadeTransition(ONE_SEC, node);
 130         t0.setFromValue(0.5);
 131         t0.setToValue(1.0);
 132 
 133         assertTrue(AnimationShim.impl_startable(t0,true));
 134         AnimationShim.impl_start(t0,true);
 135         TransitionShim.interpolate(t0,0.0);
 136         assertEquals(0.5, node.getOpacity(), EPSILON);
 137         TransitionShim.interpolate(t0,0.4);
 138         assertEquals(0.7, node.getOpacity(), EPSILON);
 139         TransitionShim.interpolate(t0,1.0);
 140         assertEquals(1.0, node.getOpacity(), EPSILON);
 141                 AnimationShim.impl_finished(t0);
 142     }
 143 
 144     @Test
 145     public void testValueCombinations() {
 146         final FadeTransition t0 = new FadeTransition(ONE_SEC, node);
 147         final double originalValue = 0.6;
 148         final double fromValue = 0.4;
 149         final double toValue = 0.9;
 150         final double byValue = -0.2;
 151 
 152         // no value set
 153         node.setOpacity(originalValue);
 154         t0.setFromValue(Double.NaN);
 155         t0.setToValue(Double.NaN);
 156         t0.setByValue(0.0);
 157         assertTrue(AnimationShim.impl_startable(t0,true));
 158         AnimationShim.impl_start(t0,true);
 159         TransitionShim.interpolate(t0,0.0);
 160         assertEquals(originalValue, node.getOpacity(), EPSILON);
 161         TransitionShim.interpolate(t0,1.0);
 162         assertEquals(originalValue, node.getOpacity(), EPSILON);
 163         AnimationShim.impl_finished(t0);
 164 
 165         // only from-value set
 166         node.setOpacity(originalValue);
 167         t0.setFromValue(fromValue);
 168         t0.setToValue(Double.NaN);
 169         t0.setByValue(0.0);
 170         assertTrue(AnimationShim.impl_startable(t0,true));
 171         AnimationShim.impl_start(t0,true);
 172         TransitionShim.interpolate(t0,0.0);
 173         assertEquals(fromValue, node.getOpacity(), EPSILON);
 174         TransitionShim.interpolate(t0,1.0);
 175         assertEquals(fromValue, node.getOpacity(), EPSILON);
 176         AnimationShim.impl_finished(t0);
 177 
 178         // only to-value set
 179         node.setOpacity(originalValue);
 180         t0.setFromValue(Double.NaN);
 181         t0.setToValue(toValue);
 182         t0.setByValue(0.0);
 183         assertTrue(AnimationShim.impl_startable(t0,true));
 184         AnimationShim.impl_start(t0,true);
 185         TransitionShim.interpolate(t0,0.0);
 186         assertEquals(originalValue, node.getOpacity(), EPSILON);
 187         TransitionShim.interpolate(t0,1.0);
 188         assertEquals(toValue, node.getOpacity(), EPSILON);
 189         AnimationShim.impl_finished(t0);
 190 
 191         // only by-value set
 192         node.setOpacity(originalValue);
 193         t0.setFromValue(Double.NaN);
 194         t0.setToValue(Double.NaN);
 195         t0.setByValue(byValue);
 196         assertTrue(AnimationShim.impl_startable(t0,true));
 197         AnimationShim.impl_start(t0,true);
 198         TransitionShim.interpolate(t0,0.0);
 199         assertEquals(originalValue, node.getOpacity(), EPSILON);
 200         TransitionShim.interpolate(t0,1.0);
 201         assertEquals(originalValue + byValue, node.getOpacity(), EPSILON);
 202         AnimationShim.impl_finished(t0);
 203 
 204         // from- and to-values set
 205         node.setOpacity(originalValue);
 206         t0.setFromValue(fromValue);
 207         t0.setToValue(toValue);
 208         t0.setByValue(0.0);
 209         assertTrue(AnimationShim.impl_startable(t0,true));
 210         AnimationShim.impl_start(t0,true);
 211         TransitionShim.interpolate(t0,0.0);
 212         assertEquals(fromValue, node.getOpacity(), EPSILON);
 213         TransitionShim.interpolate(t0,1.0);
 214         assertEquals(toValue, node.getOpacity(), EPSILON);
 215         AnimationShim.impl_finished(t0);
 216 
 217         // from- and by-values set
 218         node.setOpacity(originalValue);
 219         t0.setFromValue(fromValue);
 220         t0.setToValue(Double.NaN);
 221         t0.setByValue(byValue);
 222         assertTrue(AnimationShim.impl_startable(t0,true));
 223         AnimationShim.impl_start(t0,true);
 224         TransitionShim.interpolate(t0,0.0);
 225         assertEquals(fromValue, node.getOpacity(), EPSILON);
 226         TransitionShim.interpolate(t0,1.0);
 227         assertEquals(fromValue + byValue, node.getOpacity(), EPSILON);
 228         AnimationShim.impl_finished(t0);
 229 
 230         // to- and by-values set
 231         node.setOpacity(originalValue);
 232         t0.setFromValue(Double.NaN);
 233         t0.setToValue(toValue);
 234         t0.setByValue(byValue);
 235         assertTrue(AnimationShim.impl_startable(t0,true));
 236         AnimationShim.impl_start(t0,true);
 237         TransitionShim.interpolate(t0,0.0);
 238         assertEquals(originalValue, node.getOpacity(), EPSILON);
 239         TransitionShim.interpolate(t0,1.0);
 240         assertEquals(toValue, node.getOpacity(), EPSILON);
 241         AnimationShim.impl_finished(t0);
 242 
 243         // all values set
 244         node.setOpacity(originalValue);
 245         t0.setFromValue(fromValue);
 246         t0.setToValue(toValue);
 247         t0.setByValue(byValue);
 248         assertTrue(AnimationShim.impl_startable(t0,true));
 249         AnimationShim.impl_start(t0,true);
 250         TransitionShim.interpolate(t0,0.0);
 251         assertEquals(fromValue, node.getOpacity(), EPSILON);
 252         TransitionShim.interpolate(t0,1.0);
 253         assertEquals(toValue, node.getOpacity(), EPSILON);
 254         AnimationShim.impl_finished(t0);
 255     }
 256 
 257     @Test
 258     public void testOutOfBoundValues() {
 259         final FadeTransition t0 = new FadeTransition(ONE_SEC, node);
 260         t0.setInterpolator(Interpolator.LINEAR);
 261 
 262         // start < 0.0
 263         t0.setFromValue(-0.4);
 264         t0.setToValue(0.6);
 265         assertTrue(AnimationShim.impl_startable(t0,true));
 266         AnimationShim.impl_start(t0,true);
 267         TransitionShim.interpolate(t0,0.0);
 268         assertEquals(0.0, node.getOpacity(), EPSILON);
 269         TransitionShim.interpolate(t0,0.5);
 270         assertEquals(0.3, node.getOpacity(), EPSILON);
 271         TransitionShim.interpolate(t0,1.0);
 272         assertEquals(0.6, node.getOpacity(), EPSILON);
 273         AnimationShim.impl_finished(t0);
 274 
 275         // start > 1.0
 276         t0.setFromValue(1.3);
 277         t0.setToValue(0.3);
 278         assertTrue(AnimationShim.impl_startable(t0,true));
 279         AnimationShim.impl_start(t0,true);
 280         TransitionShim.interpolate(t0,0.0);
 281         assertEquals(1.0, node.getOpacity(), EPSILON);
 282         TransitionShim.interpolate(t0,0.5);
 283         assertEquals(0.65, node.getOpacity(), EPSILON);
 284         TransitionShim.interpolate(t0,1.0);
 285         assertEquals(0.3, node.getOpacity(), EPSILON);
 286         AnimationShim.impl_finished(t0);
 287 
 288         // end < 0.0
 289         t0.setFromValue(0.2);
 290         t0.setToValue(-1.2);
 291         assertTrue(AnimationShim.impl_startable(t0,true));
 292         AnimationShim.impl_start(t0,true);
 293         TransitionShim.interpolate(t0,0.0);
 294         assertEquals(0.2, node.getOpacity(), EPSILON);
 295         TransitionShim.interpolate(t0,0.5);
 296         assertEquals(0.1, node.getOpacity(), EPSILON);
 297         TransitionShim.interpolate(t0,1.0);
 298         assertEquals(0.0, node.getOpacity(), EPSILON);
 299         AnimationShim.impl_finished(t0);
 300 
 301         // end > 1.0
 302         t0.setFromValue(0.9);
 303         t0.setToValue(1.9);
 304         assertTrue(AnimationShim.impl_startable(t0,true));
 305         AnimationShim.impl_start(t0,true);
 306         TransitionShim.interpolate(t0,0.0);
 307         assertEquals(0.9, node.getOpacity(), EPSILON);
 308         TransitionShim.interpolate(t0,0.5);
 309         assertEquals(0.95, node.getOpacity(), EPSILON);
 310         TransitionShim.interpolate(t0,1.0);
 311         assertEquals(1.0, node.getOpacity(), EPSILON);
 312         AnimationShim.impl_finished(t0);
 313     }
 314 
 315     @Test
 316     public void testGetTargetNode() {
 317         final FadeTransition ft = new FadeTransition(ONE_SEC, node);
 318         ft.setInterpolator(Interpolator.LINEAR);
 319         ft.setFromValue(0.5);
 320         ft.setToValue(1.0);
 321         final Rectangle node2 = new Rectangle();
 322         final ParallelTransition pt = new ParallelTransition();
 323         pt.getChildren().add(ft);
 324         pt.setNode(node2);
 325 
 326         // node set, parent set
 327         assertTrue(AnimationShim.impl_startable(ft,true));
 328         AnimationShim.impl_start(ft,true);
 329         TransitionShim.interpolate(ft,0.5);
 330         assertEquals(0.75, node.getOpacity(), EPSILON);
 331         assertEquals(1.0, node2.getOpacity(), EPSILON);
 332         AnimationShim.impl_finished(ft);
 333 
 334         // node null, parent set
 335         ft.setNode(null);
 336         assertTrue(AnimationShim.impl_startable(ft,true));
 337         AnimationShim.impl_start(ft,true);
 338         TransitionShim.interpolate(ft,0.4);
 339         assertEquals(0.75, node.getOpacity(), EPSILON);
 340         assertEquals(0.7, node2.getOpacity(), EPSILON);
 341         AnimationShim.impl_finished(ft);
 342 
 343         // node null, parent null
 344         pt.setNode(null);
 345         assertFalse(AnimationShim.impl_startable(ft,true));
 346     }
 347 
 348     @Test
 349     public void testCachedValues() {
 350         final FadeTransition ft = new FadeTransition(ONE_SEC, node);
 351         ft.setInterpolator(Interpolator.LINEAR);
 352         ft.setFromValue(0.5);
 353         ft.setToValue(1.0);
 354 
 355         // start
 356         assertTrue(AnimationShim.impl_startable(ft,true));
 357         AnimationShim.impl_start(ft,true);
 358         ft.setFromValue(0.0);
 359         TransitionShim.interpolate(ft,0.5);
 360         assertEquals(0.75, node.getOpacity(), EPSILON);
 361         AnimationShim.impl_finished(ft);
 362         ft.setFromValue(0.5);
 363 
 364         // end
 365         assertTrue(AnimationShim.impl_startable(ft,true));
 366         AnimationShim.impl_start(ft,true);
 367         ft.setToValue(0.0);
 368         TransitionShim.interpolate(ft,0.2);
 369         assertEquals(0.6, node.getOpacity(), EPSILON);
 370         AnimationShim.impl_finished(ft);
 371         ft.setToValue(1.0);
 372 
 373         // node
 374         assertTrue(AnimationShim.impl_startable(ft,true));
 375         AnimationShim.impl_start(ft,true);
 376         ft.setNode(null);
 377         TransitionShim.interpolate(ft,0.7);
 378         assertEquals(0.85, node.getOpacity(), EPSILON);
 379         AnimationShim.impl_finished(ft);
 380         ft.setNode(node);
 381 
 382         // interpolator
 383         assertTrue(AnimationShim.impl_startable(ft,true));
 384         AnimationShim.impl_start(ft,true);
 385         ft.setInterpolator(null);
 386         TransitionShim.interpolate(ft,0.1);
 387         assertEquals(0.55, node.getOpacity(), EPSILON);
 388         AnimationShim.impl_finished(ft);
 389         ft.setInterpolator(Interpolator.LINEAR);
 390     }
 391 
 392     @Test
 393     public void testStartable() {
 394         final FadeTransition t0 = new FadeTransition(Duration.ONE, node);
 395         assertTrue(AnimationShim.impl_startable(t0,true));
 396 
 397         // duration is 0
 398         t0.setDuration(Duration.ZERO);
 399         assertFalse(AnimationShim.impl_startable(t0,true));
 400         t0.setDuration(Duration.ONE);
 401         assertTrue(AnimationShim.impl_startable(t0,true));
 402 
 403         // node is null
 404         t0.setNode(null);
 405         assertFalse(AnimationShim.impl_startable(t0,true));
 406         t0.setNode(node);
 407         assertTrue(AnimationShim.impl_startable(t0,true));
 408 
 409         // interpolator is null
 410         t0.setInterpolator(null);
 411         assertFalse(AnimationShim.impl_startable(t0,true));
 412         t0.setInterpolator(Interpolator.LINEAR);
 413         assertTrue(AnimationShim.impl_startable(t0,true));
 414     }
 415 
 416     @Test
 417     public void testEvaluateStartValue() {
 418         final FadeTransition t0 = new FadeTransition(Duration.INDEFINITE, node);
 419 
 420         // first run
 421         node.setOpacity(0.6);
 422         assertTrue(AnimationShim.impl_startable(t0,true));
 423         AnimationShim.impl_start(t0,true);
 424         node.setOpacity(0.8);
 425         TransitionShim.interpolate(t0,0.0);
 426         assertEquals(0.6, node.getOpacity(), EPSILON);
 427         AnimationShim.impl_finished(t0);
 428 
 429         // second run
 430         node.setOpacity(0.2);
 431         assertTrue(AnimationShim.impl_startable(t0,true));
 432         AnimationShim.impl_start(t0,true);
 433         node.setOpacity(0.8);
 434         TransitionShim.interpolate(t0,0.0);
 435         assertEquals(0.2, node.getOpacity(), EPSILON);
 436         AnimationShim.impl_finished(t0);
 437     }
 438 
 439 }