Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 3af93a5

Browse files
committed
test(ngAnimate): add basic integration tests for JS/CSS $animate-based animations
1 parent bee14ed commit 3af93a5

File tree

1 file changed

+190
-0
lines changed

1 file changed

+190
-0
lines changed

test/ngAnimate/integrationSpec.js

+190
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
'use strict';
2+
3+
describe('ngAnimate integration tests', function() {
4+
5+
beforeEach(module('ngAnimate'));
6+
7+
var html, ss;
8+
beforeEach(module(function() {
9+
return function($rootElement, $document, $window, $animate) {
10+
$animate.enabled(true);
11+
12+
ss = createMockStyleSheet($document, $window);
13+
14+
var body = jqLite($document[0].body);
15+
html = function(element) {
16+
body.append($rootElement);
17+
$rootElement.append(element);
18+
};
19+
};
20+
}));
21+
22+
describe('CSS animations', function() {
23+
if (!browserSupportsCssAnimations()) return;
24+
25+
they('should render an $prop animation',
26+
['enter', 'leave', 'move', 'addClass', 'removeClass', 'setClass'], function(event) {
27+
28+
inject(function($animate, $compile, $rootScope, $rootElement, $$rAF) {
29+
var element = jqLite('<div class="animate-me"></div>');
30+
$compile(element)($rootScope);
31+
32+
var className = 'klass';
33+
var addClass, removeClass;
34+
var parent = jqLite('<div></div>');
35+
html(parent);
36+
37+
var setupClass, activeClass;
38+
var args;
39+
var classRuleSuffix = '';
40+
41+
switch (event) {
42+
case 'enter':
43+
case 'move':
44+
setupClass = 'ng-' + event;
45+
activeClass = 'ng-' + event + '-active';
46+
args = [element, parent];
47+
break;
48+
49+
case 'leave':
50+
parent.append(element);
51+
setupClass = 'ng-' + event;
52+
activeClass = 'ng-' + event + '-active';
53+
args = [element];
54+
break;
55+
56+
case 'addClass':
57+
parent.append(element);
58+
classRuleSuffix = '.add';
59+
setupClass = className + '-add';
60+
activeClass = className + '-add-active';
61+
addClass = className;
62+
args = [element, className];
63+
break;
64+
65+
case 'removeClass':
66+
parent.append(element);
67+
setupClass = className + '-remove';
68+
activeClass = className + '-remove-active';
69+
element.addClass(className);
70+
args = [element, className];
71+
break;
72+
73+
case 'setClass':
74+
parent.append(element);
75+
addClass = className;
76+
removeClass = 'removing-class';
77+
setupClass = addClass + '-add ' + removeClass + '-remove';
78+
activeClass = addClass + '-add-active ' + removeClass + '-remove-active';
79+
element.addClass(removeClass);
80+
args = [element, addClass, removeClass];
81+
break;
82+
}
83+
84+
ss.addRule('.animate-me', 'transition:2s linear all;');
85+
86+
var runner = $animate[event].apply($animate, args);
87+
$rootScope.$digest();
88+
89+
var animationCompleted = false;
90+
runner.then(function() {
91+
animationCompleted = true;
92+
});
93+
94+
expect(element).toHaveClass(setupClass);
95+
$$rAF.flush();
96+
expect(element).toHaveClass(activeClass);
97+
98+
browserTrigger(element, 'transitionend', { timeStamp: Date.now(), elapsedTime: 2 });
99+
100+
expect(element).not.toHaveClass(setupClass);
101+
expect(element).not.toHaveClass(activeClass);
102+
103+
$rootScope.$digest();
104+
105+
expect(animationCompleted).toBe(true);
106+
});
107+
});
108+
});
109+
110+
describe('JS animations', function() {
111+
they('should render an $prop animation',
112+
['enter', 'leave', 'move', 'addClass', 'removeClass', 'setClass'], function(event) {
113+
114+
var endAnimation;
115+
var animateCompleteCallbackFired = true;
116+
117+
module(function($animateProvider) {
118+
$animateProvider.register('.animate-me', function() {
119+
var animateFactory = {};
120+
animateFactory[event] = function(element, addClass, removeClass, done) {
121+
endAnimation = arguments[arguments.length - 2]; // the done method is the 2nd last one
122+
return function(status) {
123+
animateCompleteCallbackFired = status === false;
124+
};
125+
};
126+
return animateFactory;
127+
});
128+
});
129+
130+
inject(function($animate, $compile, $rootScope, $rootElement, $$rAF) {
131+
var element = jqLite('<div class="animate-me"></div>');
132+
$compile(element)($rootScope);
133+
134+
var className = 'klass';
135+
var addClass, removeClass;
136+
var parent = jqLite('<div></div>');
137+
html(parent);
138+
139+
var args;
140+
switch (event) {
141+
case 'enter':
142+
case 'move':
143+
args = [element, parent];
144+
break;
145+
146+
case 'leave':
147+
parent.append(element);
148+
args = [element];
149+
break;
150+
151+
case 'addClass':
152+
parent.append(element);
153+
args = [element, className];
154+
break;
155+
156+
case 'removeClass':
157+
parent.append(element);
158+
element.addClass(className);
159+
args = [element, className];
160+
break;
161+
162+
case 'setClass':
163+
parent.append(element);
164+
addClass = className;
165+
removeClass = 'removing-class';
166+
element.addClass(removeClass);
167+
args = [element, addClass, removeClass];
168+
break;
169+
}
170+
171+
var runner = $animate[event].apply($animate, args);
172+
var animationCompleted = false;
173+
runner.then(function() {
174+
animationCompleted = true;
175+
});
176+
177+
$rootScope.$digest();
178+
179+
expect(isFunction(endAnimation)).toBe(true);
180+
181+
endAnimation();
182+
$$rAF.flush();
183+
expect(animateCompleteCallbackFired).toBe(true);
184+
185+
$rootScope.$digest();
186+
expect(animationCompleted).toBe(true);
187+
});
188+
});
189+
});
190+
});

0 commit comments

Comments
 (0)