Skip to content

Commit

Permalink
fix(animations): implement getPosition in browser animation builder
Browse files Browse the repository at this point in the history
Forward `getPosition` to `animation_group_player`.
  • Loading branch information
literalpie committed Dec 2, 2020
1 parent a55e01b commit 2c00466
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 7 deletions.
13 changes: 7 additions & 6 deletions packages/animations/src/players/animation_group_player.ts
Expand Up @@ -148,12 +148,13 @@ export class AnimationGroupPlayer implements AnimationPlayer {
}

getPosition(): number {
let min = 0;
this.players.forEach(player => {
const p = player.getPosition();
min = Math.min(p, min);
});
return min;
const longestPlayer =
this.players.reduce((longestSoFar: AnimationPlayer|undefined, player: AnimationPlayer) => {
const newPlayerIsLongest =
longestSoFar === undefined || player.totalTime > longestSoFar!.totalTime;
return newPlayerIsLongest ? player : longestSoFar;
}, undefined);
return longestPlayer != undefined ? longestPlayer.getPosition() / longestPlayer.totalTime : 0;
}

beforeDestroy(): void {
Expand Down
42 changes: 42 additions & 0 deletions packages/animations/test/animation_group_player_spec.ts
@@ -0,0 +1,42 @@
/**
* @license
* Copyright Google LLC 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 {fakeAsync} from '@angular/core/testing';
import {NoopAnimationPlayer} from '../src/animations';
import {AnimationGroupPlayer} from '../src/players/animation_group_player';

{
describe('AnimationGroupPlayer', function() {
it('should getPosition of an empty group', fakeAsync(() => {
const players: NoopAnimationPlayer[] = [];
const groupPlayer = new AnimationGroupPlayer(players);
expect(groupPlayer.getPosition()).toBe(0);
}));

it('should getPosition of a single player in a group', fakeAsync(() => {
const player = new NoopAnimationPlayer(5, 5);
player.getPosition = () => 2;
const players = [player];
const groupPlayer = new AnimationGroupPlayer(players);
expect(groupPlayer.getPosition()).toBe(0.2);
}));

it('should getPosition based on the longest player in the group', fakeAsync(() => {
const longestPlayer = new NoopAnimationPlayer(5, 5);
longestPlayer.getPosition = () => 2;
const players = [
new NoopAnimationPlayer(1, 4),
new NoopAnimationPlayer(4, 1),
new NoopAnimationPlayer(7, 0),
longestPlayer,
new NoopAnimationPlayer(1, 1),
];
const groupPlayer = new AnimationGroupPlayer(players);
expect(groupPlayer.getPosition()).toBe(0.2);
}));
});
}
Expand Up @@ -111,7 +111,7 @@ export class RendererAnimationPlayer implements AnimationPlayer {
}

getPosition(): number {
return 0;
return this._renderer.engine.players[+this.id].getPosition();
}

public totalTime = 0;
Expand Down

0 comments on commit 2c00466

Please sign in to comment.