1317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki/* 2317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki * Copyright (C) 2017 The Android Open Source Project 3317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki * 4317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki * Licensed under the Apache License, Version 2.0 (the "License"); 5317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki * you may not use this file except in compliance with the License. 6317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki * You may obtain a copy of the License at 7317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki * 8317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki * http://www.apache.org/licenses/LICENSE-2.0 9317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki * 10317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki * Unless required by applicable law or agreed to in writing, software 11317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki * distributed under the License is distributed on an "AS IS" BASIS, 12317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki * See the License for the specific language governing permissions and 14317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki * limitations under the License. 15317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki */ 16317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki 17317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Arakipackage android.support.transition; 18317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki 19317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Arakiimport static org.junit.Assert.assertEquals; 20ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Arakiimport static org.junit.Assert.assertFalse; 21317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki 22317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Arakiimport android.graphics.Path; 23317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Arakiimport android.graphics.PathMeasure; 24317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki 25317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Arakipublic abstract class PathMotionTest { 26317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki 27317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki public static void assertPathMatches(Path expectedPath, Path path) { 28317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki PathMeasure expectedMeasure = new PathMeasure(expectedPath, false); 29317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki PathMeasure pathMeasure = new PathMeasure(path, false); 30317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki 31ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki boolean expectedNextContour; 32ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki boolean pathNextContour; 33ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki int contourIndex = 0; 34ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki do { 35ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki float expectedLength = expectedMeasure.getLength(); 36ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki assertEquals("Lengths differ", expectedLength, pathMeasure.getLength(), 0.01f); 37ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki 38ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki float minLength = Math.min(expectedLength, pathMeasure.getLength()); 39ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki 40ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki float[] pos = new float[2]; 41ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki 42ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki float increment = minLength / 5f; 43ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki for (float along = 0; along <= minLength; along += increment) { 44ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki expectedMeasure.getPosTan(along, pos, null); 45ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki float expectedX = pos[0]; 46ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki float expectedY = pos[1]; 47ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki 48ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki pathMeasure.getPosTan(along, pos, null); 49ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki assertEquals("Failed at " + increment + " in contour " + contourIndex, 50ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki expectedX, pos[0], 0.01f); 51ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki assertEquals("Failed at " + increment + " in contour " + contourIndex, 52ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki expectedY, pos[1], 0.01f); 53ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki } 54ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki expectedNextContour = expectedMeasure.nextContour(); 55ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki pathNextContour = pathMeasure.nextContour(); 56ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki contourIndex++; 57ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki } while (expectedNextContour && pathNextContour); 58ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki assertFalse(expectedNextContour); 59ac85f7b6d316ff689fc0c30716bd40ef4666ba7dYuichi Araki assertFalse(pathNextContour); 60317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki } 61317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki 62317d4bb802dbd80c9ddf1382e037769e58dff919Yuichi Araki} 63