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 }