1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.support.transition;
18
19import static junit.framework.TestCase.assertFalse;
20
21import static org.junit.Assert.assertEquals;
22import static org.junit.Assert.assertNotNull;
23import static org.junit.Assert.assertTrue;
24import static org.junit.Assert.fail;
25
26import android.content.Context;
27import android.graphics.Path;
28import android.graphics.PathMeasure;
29import android.support.annotation.NonNull;
30import android.support.test.filters.MediumTest;
31import android.support.transition.test.R;
32import android.util.AttributeSet;
33import android.view.Gravity;
34import android.widget.ImageView;
35import android.widget.TextView;
36
37import org.junit.Test;
38
39import java.util.List;
40
41@MediumTest
42public class TransitionInflaterTest extends BaseTest {
43
44    @Test
45    public void testInflationConstructors() throws Throwable {
46        TransitionInflater inflater = TransitionInflater.from(rule.getActivity());
47        Transition transition = inflater.inflateTransition(R.transition.transition_constructors);
48        assertTrue(transition instanceof TransitionSet);
49        TransitionSet set = (TransitionSet) transition;
50        assertEquals(10, set.getTransitionCount());
51    }
52
53    @Test
54    public void testInflation() {
55        TransitionInflater inflater = TransitionInflater.from(rule.getActivity());
56        verifyFadeProperties(inflater.inflateTransition(R.transition.fade));
57        verifyChangeBoundsProperties(inflater.inflateTransition(R.transition.change_bounds));
58        verifySlideProperties(inflater.inflateTransition(R.transition.slide));
59        verifyExplodeProperties(inflater.inflateTransition(R.transition.explode));
60        verifyChangeImageTransformProperties(
61                inflater.inflateTransition(R.transition.change_image_transform));
62        verifyChangeTransformProperties(inflater.inflateTransition(R.transition.change_transform));
63        verifyChangeClipBoundsProperties(
64                inflater.inflateTransition(R.transition.change_clip_bounds));
65        verifyAutoTransitionProperties(inflater.inflateTransition(R.transition.auto_transition));
66        verifyChangeScrollProperties(inflater.inflateTransition(R.transition.change_scroll));
67        verifyTransitionSetProperties(inflater.inflateTransition(R.transition.transition_set));
68        verifyCustomTransitionProperties(
69                inflater.inflateTransition(R.transition.custom_transition));
70        verifyTargetIds(inflater.inflateTransition(R.transition.target_ids));
71        verifyTargetNames(inflater.inflateTransition(R.transition.target_names));
72        verifyTargetClass(inflater.inflateTransition(R.transition.target_classes));
73        verifyArcMotion(inflater.inflateTransition(R.transition.arc_motion));
74        verifyCustomPathMotion(inflater.inflateTransition(R.transition.custom_path_motion));
75        verifyPatternPathMotion(inflater.inflateTransition(R.transition.pattern_path_motion));
76    }
77
78    // TODO: Add test for TransitionManager
79
80    private void verifyFadeProperties(Transition transition) {
81        assertTrue(transition instanceof Fade);
82        Fade fade = (Fade) transition;
83        assertEquals(Fade.OUT, fade.getMode());
84    }
85
86    private void verifyChangeBoundsProperties(Transition transition) {
87        assertTrue(transition instanceof ChangeBounds);
88        ChangeBounds changeBounds = (ChangeBounds) transition;
89        assertTrue(changeBounds.getResizeClip());
90    }
91
92    private void verifySlideProperties(Transition transition) {
93        assertTrue(transition instanceof Slide);
94        Slide slide = (Slide) transition;
95        assertEquals(Gravity.TOP, slide.getSlideEdge());
96    }
97
98    private void verifyExplodeProperties(Transition transition) {
99        assertTrue(transition instanceof Explode);
100        Visibility visibility = (Visibility) transition;
101        assertEquals(Visibility.MODE_IN, visibility.getMode());
102    }
103
104    private void verifyChangeImageTransformProperties(Transition transition) {
105        assertTrue(transition instanceof ChangeImageTransform);
106    }
107
108    private void verifyChangeTransformProperties(Transition transition) {
109        assertTrue(transition instanceof ChangeTransform);
110        ChangeTransform changeTransform = (ChangeTransform) transition;
111        assertFalse(changeTransform.getReparent());
112        assertFalse(changeTransform.getReparentWithOverlay());
113    }
114
115    private void verifyChangeClipBoundsProperties(Transition transition) {
116        assertTrue(transition instanceof ChangeClipBounds);
117    }
118
119    private void verifyAutoTransitionProperties(Transition transition) {
120        assertTrue(transition instanceof AutoTransition);
121    }
122
123    private void verifyChangeScrollProperties(Transition transition) {
124        assertTrue(transition instanceof ChangeScroll);
125    }
126
127    private void verifyTransitionSetProperties(Transition transition) {
128        assertTrue(transition instanceof TransitionSet);
129        TransitionSet set = (TransitionSet) transition;
130        assertEquals(TransitionSet.ORDERING_SEQUENTIAL, set.getOrdering());
131        assertEquals(2, set.getTransitionCount());
132        assertTrue(set.getTransitionAt(0) instanceof ChangeBounds);
133        assertTrue(set.getTransitionAt(1) instanceof Fade);
134    }
135
136    private void verifyCustomTransitionProperties(Transition transition) {
137        assertTrue(transition instanceof CustomTransition);
138    }
139
140    private void verifyTargetIds(Transition transition) {
141        List<Integer> targets = transition.getTargetIds();
142        assertNotNull(targets);
143        assertEquals(2, targets.size());
144        assertEquals(R.id.hello, (int) targets.get(0));
145        assertEquals(R.id.world, (int) targets.get(1));
146    }
147
148    private void verifyTargetNames(Transition transition) {
149        List<String> targets = transition.getTargetNames();
150        assertNotNull(targets);
151        assertEquals(2, targets.size());
152        assertEquals("hello", targets.get(0));
153        assertEquals("world", targets.get(1));
154    }
155
156    private void verifyTargetClass(Transition transition) {
157        List<Class> targets = transition.getTargetTypes();
158        assertNotNull(targets);
159        assertEquals(2, targets.size());
160        assertEquals(TextView.class, targets.get(0));
161        assertEquals(ImageView.class, targets.get(1));
162    }
163
164    private void verifyArcMotion(Transition transition) {
165        assertNotNull(transition);
166        PathMotion motion = transition.getPathMotion();
167        assertNotNull(motion);
168        assertTrue(motion instanceof ArcMotion);
169        ArcMotion arcMotion = (ArcMotion) motion;
170        assertEquals(1f, arcMotion.getMinimumVerticalAngle(), 0.01f);
171        assertEquals(2f, arcMotion.getMinimumHorizontalAngle(), 0.01f);
172        assertEquals(53f, arcMotion.getMaximumAngle(), 0.01f);
173    }
174
175    private void verifyCustomPathMotion(Transition transition) {
176        assertNotNull(transition);
177        PathMotion motion = transition.getPathMotion();
178        assertNotNull(motion);
179        assertTrue(motion instanceof CustomPathMotion);
180    }
181
182    private void verifyPatternPathMotion(Transition transition) {
183        assertNotNull(transition);
184        PathMotion motion = transition.getPathMotion();
185        assertNotNull(motion);
186        assertTrue(motion instanceof PatternPathMotion);
187        PatternPathMotion pattern = (PatternPathMotion) motion;
188        Path path = pattern.getPatternPath();
189        PathMeasure measure = new PathMeasure(path, false);
190        assertEquals(200f, measure.getLength(), 0.1f);
191    }
192
193    public static class CustomTransition extends Transition {
194        public CustomTransition() {
195            fail("Default constructor was not expected");
196        }
197
198        @SuppressWarnings("unused") // This constructor is used in XML
199        public CustomTransition(Context context, AttributeSet attrs) {
200            super(context, attrs);
201        }
202
203        @Override
204        public void captureStartValues(@NonNull TransitionValues transitionValues) {
205        }
206
207        @Override
208        public void captureEndValues(@NonNull TransitionValues transitionValues) {
209        }
210    }
211
212    public static class CustomPathMotion extends PathMotion {
213        public CustomPathMotion() {
214            fail("default constructor shouldn't be called.");
215        }
216
217        public CustomPathMotion(Context context, AttributeSet attrs) {
218            super(context, attrs);
219        }
220
221        @Override
222        public Path getPath(float startX, float startY, float endX, float endY) {
223            return null;
224        }
225    }
226
227    public static class InflationFade extends Fade {
228        public InflationFade(Context context, AttributeSet attrs) {
229            super(context, attrs);
230        }
231    }
232
233    public static class InflationChangeBounds extends ChangeBounds {
234        public InflationChangeBounds(Context context, AttributeSet attrs) {
235            super(context, attrs);
236        }
237    }
238
239    public static class InflationSlide extends Slide {
240        public InflationSlide(Context context, AttributeSet attrs) {
241            super(context, attrs);
242        }
243    }
244
245    public static class InflationTransitionSet extends TransitionSet {
246        public InflationTransitionSet(Context context, AttributeSet attrs) {
247            super(context, attrs);
248        }
249    }
250
251    public static class InflationChangeImageTransform extends ChangeImageTransform {
252        public InflationChangeImageTransform(Context context, AttributeSet attrs) {
253            super(context, attrs);
254        }
255    }
256
257    public static class InflationChangeTransform extends ChangeTransform {
258        public InflationChangeTransform(Context context, AttributeSet attrs) {
259            super(context, attrs);
260        }
261    }
262
263    public static class InflationAutoTransition extends AutoTransition {
264        public InflationAutoTransition(Context context, AttributeSet attrs) {
265            super(context, attrs);
266        }
267    }
268
269    public static class InflationChangeClipBounds extends ChangeClipBounds {
270        public InflationChangeClipBounds(Context context, AttributeSet attrs) {
271            super(context, attrs);
272        }
273    }
274
275    public static class InflationChangeScroll extends ChangeScroll {
276        public InflationChangeScroll(Context context, AttributeSet attrs) {
277            super(context, attrs);
278        }
279    }
280
281    public static class InflationExplode extends Explode {
282        public InflationExplode(Context context, AttributeSet attrs) {
283            super(context, attrs);
284        }
285    }
286
287}
288