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 }