79 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
/**
 | 
						|
 * @license
 | 
						|
 * Copyright Google Inc. All Rights Reserved.
 | 
						|
 *
 | 
						|
 * Use of this source code is governed by an MIT-style license that can be
 | 
						|
 * found in the LICENSE file at https://angular.io/license
 | 
						|
 */
 | 
						|
import {DOMAnimation} from '../../src/render/web_animations/dom_animation';
 | 
						|
import {WebAnimationsPlayer} from '../../src/render/web_animations/web_animations_player';
 | 
						|
 | 
						|
export function main() {
 | 
						|
  describe('WebAnimationsPlayer', function() {
 | 
						|
    // these tests are only mean't to be run within the DOM
 | 
						|
    if (typeof Element == 'undefined') return;
 | 
						|
 | 
						|
    let element: any;
 | 
						|
    beforeEach(() => {
 | 
						|
      element = document.createElement('div');
 | 
						|
      document.body.appendChild(element);
 | 
						|
    });
 | 
						|
 | 
						|
    afterEach(() => { document.body.removeChild(element); });
 | 
						|
 | 
						|
    it('should properly balance any previous player styles into the animation keyframes', () => {
 | 
						|
      element.style.height = '666px';
 | 
						|
      element.style.width = '333px';
 | 
						|
 | 
						|
      const prevPlayer1 = new MockWebAnimationsPlayer(
 | 
						|
          element, [{width: '0px', offset: 0}, {width: '200px', offset: 1}], {});
 | 
						|
      prevPlayer1.play();
 | 
						|
      prevPlayer1.finish();
 | 
						|
 | 
						|
      const prevPlayer2 = new MockWebAnimationsPlayer(
 | 
						|
          element, [{height: '0px', offset: 0}, {height: '200px', offset: 1}], {});
 | 
						|
      prevPlayer2.play();
 | 
						|
      prevPlayer2.finish();
 | 
						|
 | 
						|
      // what needs to happen here is the player below should
 | 
						|
      // examine which styles are present in the provided previous
 | 
						|
      // players and use them as input data for the keyframes of
 | 
						|
      // the new player. Given that the players are in their finished
 | 
						|
      // state, the styles are copied over as the starting keyframe
 | 
						|
      // for the animation and if the styles are missing in later keyframes
 | 
						|
      // then the styling is resolved by computing the styles
 | 
						|
      const player = new MockWebAnimationsPlayer(
 | 
						|
          element, [{width: '100px', offset: 0}, {width: '500px', offset: 1}], {},
 | 
						|
          [prevPlayer1, prevPlayer2]);
 | 
						|
 | 
						|
      player.init();
 | 
						|
      expect(player.capturedKeyframes).toEqual([
 | 
						|
        {height: '200px', width: '200px', offset: 0},
 | 
						|
        {height: '666px', width: '500px', offset: 1}
 | 
						|
      ]);
 | 
						|
    });
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
class MockWebAnimationsPlayer extends WebAnimationsPlayer {
 | 
						|
  capturedKeyframes: any[];
 | 
						|
 | 
						|
  _triggerWebAnimation(element: any, keyframes: any[], options: any): any {
 | 
						|
    this.capturedKeyframes = keyframes;
 | 
						|
    return new MockDOMAnimation();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
class MockDOMAnimation implements DOMAnimation {
 | 
						|
  onfinish = (callback: (e: any) => any) => {};
 | 
						|
  position = 0;
 | 
						|
  currentTime = 0;
 | 
						|
 | 
						|
  cancel(): void {}
 | 
						|
  play(): void {}
 | 
						|
  pause(): void {}
 | 
						|
  finish(): void {}
 | 
						|
  addEventListener(eventName: string, handler: (event: any) => any): any { return null; }
 | 
						|
  dispatchEvent(eventName: string): any { return null; }
 | 
						|
}
 |