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