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