1770847c0c8424175f0619026615b11fef50ca269Dake Gu/*
2770847c0c8424175f0619026615b11fef50ca269Dake Gu * Copyright (C) 2016 The Android Open Source Project
3770847c0c8424175f0619026615b11fef50ca269Dake Gu *
4770847c0c8424175f0619026615b11fef50ca269Dake Gu * Licensed under the Apache License, Version 2.0 (the "License");
5770847c0c8424175f0619026615b11fef50ca269Dake Gu * you may not use this file except in compliance with the License.
6770847c0c8424175f0619026615b11fef50ca269Dake Gu * You may obtain a copy of the License at
7770847c0c8424175f0619026615b11fef50ca269Dake Gu *
8770847c0c8424175f0619026615b11fef50ca269Dake Gu *      http://www.apache.org/licenses/LICENSE-2.0
9770847c0c8424175f0619026615b11fef50ca269Dake Gu *
10770847c0c8424175f0619026615b11fef50ca269Dake Gu * Unless required by applicable law or agreed to in writing, software
11770847c0c8424175f0619026615b11fef50ca269Dake Gu * distributed under the License is distributed on an "AS IS" BASIS,
12770847c0c8424175f0619026615b11fef50ca269Dake Gu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13770847c0c8424175f0619026615b11fef50ca269Dake Gu * See the License for the specific language governing permissions and
14770847c0c8424175f0619026615b11fef50ca269Dake Gu * limitations under the License.
15770847c0c8424175f0619026615b11fef50ca269Dake Gu */
16770847c0c8424175f0619026615b11fef50ca269Dake Gu
17770847c0c8424175f0619026615b11fef50ca269Dake Gupackage android.support.v17.leanback.widget;
18770847c0c8424175f0619026615b11fef50ca269Dake Gu
19bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Guimport static junit.framework.Assert.assertEquals;
20bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu
21754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.mockito.Mockito.times;
22754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport static org.mockito.Mockito.verify;
23754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikas
24754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.filters.SmallTest;
25754cb29c50f09a83251dd4bb633ba445b2411adbAurimas Liutikasimport android.support.test.runner.AndroidJUnit4;
26bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Guimport android.util.Property;
27770847c0c8424175f0619026615b11fef50ca269Dake Gu
28770847c0c8424175f0619026615b11fef50ca269Dake Guimport org.junit.Before;
29770847c0c8424175f0619026615b11fef50ca269Dake Guimport org.junit.Test;
30770847c0c8424175f0619026615b11fef50ca269Dake Guimport org.junit.runner.RunWith;
31770847c0c8424175f0619026615b11fef50ca269Dake Guimport org.mockito.Mock;
32770847c0c8424175f0619026615b11fef50ca269Dake Guimport org.mockito.Mockito;
33770847c0c8424175f0619026615b11fef50ca269Dake Guimport org.mockito.MockitoAnnotations;
34770847c0c8424175f0619026615b11fef50ca269Dake Gu
35770847c0c8424175f0619026615b11fef50ca269Dake Gu@RunWith(AndroidJUnit4.class)
36770847c0c8424175f0619026615b11fef50ca269Dake Gu@SmallTest
37770847c0c8424175f0619026615b11fef50ca269Dake Gupublic class ParallaxIntEffectTest {
38770847c0c8424175f0619026615b11fef50ca269Dake Gu
39bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu    Parallax<Parallax.IntProperty> mSource;
40e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu    int mScreenMax;
41e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu    ParallaxEffect.IntEffect mEffect;
42e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu    @Mock ParallaxTarget mTarget;
43770847c0c8424175f0619026615b11fef50ca269Dake Gu
44bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu    static void assertFloatEquals(float expected, float actual) {
45bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        org.junit.Assert.assertEquals((double) expected, (double) actual, 0.0001d);
46bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu    }
47bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu
48770847c0c8424175f0619026615b11fef50ca269Dake Gu    @Before
49770847c0c8424175f0619026615b11fef50ca269Dake Gu    public void setUp() throws Exception {
50770847c0c8424175f0619026615b11fef50ca269Dake Gu        MockitoAnnotations.initMocks(this);
51bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        mSource = new Parallax<Parallax.IntProperty>() {
52770847c0c8424175f0619026615b11fef50ca269Dake Gu
53e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas            @Override
54bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            public float getMaxValue() {
55e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu                return mScreenMax;
56770847c0c8424175f0619026615b11fef50ca269Dake Gu            }
573778c4eaa62895085d33965ee391c8b21783cffaDake Gu
583778c4eaa62895085d33965ee391c8b21783cffaDake Gu            @Override
593778c4eaa62895085d33965ee391c8b21783cffaDake Gu            public IntProperty createProperty(String name, int index) {
603778c4eaa62895085d33965ee391c8b21783cffaDake Gu                return new IntProperty(name, index);
613778c4eaa62895085d33965ee391c8b21783cffaDake Gu            }
62770847c0c8424175f0619026615b11fef50ca269Dake Gu        };
63e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect = new ParallaxEffect.IntEffect();
64770847c0c8424175f0619026615b11fef50ca269Dake Gu    }
65770847c0c8424175f0619026615b11fef50ca269Dake Gu
66770847c0c8424175f0619026615b11fef50ca269Dake Gu    @Test
67770847c0c8424175f0619026615b11fef50ca269Dake Gu    public void testOneVariable() {
68e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mScreenMax = 1080;
69e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Parallax.IntProperty var1 = mSource.addProperty("var1");
70770847c0c8424175f0619026615b11fef50ca269Dake Gu
71e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.setPropertyRanges(var1.atAbsolute(540), var1.atAbsolute(0));
72e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.target(mTarget);
73770847c0c8424175f0619026615b11fef50ca269Dake Gu
74770847c0c8424175f0619026615b11fef50ca269Dake Gu        // start
75bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, 540);
76e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
77e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(0f);
78e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
79770847c0c8424175f0619026615b11fef50ca269Dake Gu
8046ae6eb27de10f019258fe197c794cf2234abe5dsusnata        // 25% complete
81bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, 405);
82e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
83e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(0.25f);
84e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
8546ae6eb27de10f019258fe197c794cf2234abe5dsusnata
86770847c0c8424175f0619026615b11fef50ca269Dake Gu        // middle
87bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, 270);
88e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
89e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(.5f);
90e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
91770847c0c8424175f0619026615b11fef50ca269Dake Gu
9246ae6eb27de10f019258fe197c794cf2234abe5dsusnata        // 75% complete
93bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, 135);
94e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
95e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(0.75f);
96e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
9746ae6eb27de10f019258fe197c794cf2234abe5dsusnata
98770847c0c8424175f0619026615b11fef50ca269Dake Gu        // end
99bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, 0);
100e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
101e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(1f);
102e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
103770847c0c8424175f0619026615b11fef50ca269Dake Gu
104770847c0c8424175f0619026615b11fef50ca269Dake Gu        // after end
105bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, -1000);
106e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
107e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(1f);
108e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
109770847c0c8424175f0619026615b11fef50ca269Dake Gu
110770847c0c8424175f0619026615b11fef50ca269Dake Gu        // before start
111bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, 1000);
112e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
113e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(0f);
114e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
115770847c0c8424175f0619026615b11fef50ca269Dake Gu
116770847c0c8424175f0619026615b11fef50ca269Dake Gu        // unknown_before
117bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, Parallax.IntProperty.UNKNOWN_BEFORE);
118e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
119e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(1f);
120e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
121770847c0c8424175f0619026615b11fef50ca269Dake Gu
122770847c0c8424175f0619026615b11fef50ca269Dake Gu        // unknown_after
123bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, Parallax.IntProperty.UNKNOWN_AFTER);
124e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
125e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(0f);
126e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
127770847c0c8424175f0619026615b11fef50ca269Dake Gu    }
128770847c0c8424175f0619026615b11fef50ca269Dake Gu
129770847c0c8424175f0619026615b11fef50ca269Dake Gu    @Test(expected=IllegalStateException.class)
130770847c0c8424175f0619026615b11fef50ca269Dake Gu    public void testVerifyKeyValueOfSameVariableInDesendantOrder() {
131e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mScreenMax = 1080;
132e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Parallax.IntProperty var1 = mSource.addProperty("var1");
133770847c0c8424175f0619026615b11fef50ca269Dake Gu
134e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.setPropertyRanges(var1.atAbsolute(540), var1.atAbsolute(550));
135e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.target(mTarget);
136bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, 0);
137e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
138770847c0c8424175f0619026615b11fef50ca269Dake Gu    }
139770847c0c8424175f0619026615b11fef50ca269Dake Gu
140770847c0c8424175f0619026615b11fef50ca269Dake Gu    @Test
141770847c0c8424175f0619026615b11fef50ca269Dake Gu    public void testTwoVariable() {
142e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mScreenMax = 1080;
143e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Parallax.IntProperty var1 = mSource.addProperty("var1");
144e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Parallax.IntProperty var2 = mSource.addProperty("var2");
1453778c4eaa62895085d33965ee391c8b21783cffaDake Gu
146e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.setPropertyRanges(var1.atAbsolute(540), var2.atAbsolute(540));
147e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.target(mTarget);
148770847c0c8424175f0619026615b11fef50ca269Dake Gu
149770847c0c8424175f0619026615b11fef50ca269Dake Gu        // start
150bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, 540);
151bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var2.setValue(mSource, 840);
152e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
153e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(0f);
154e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
155770847c0c8424175f0619026615b11fef50ca269Dake Gu
156770847c0c8424175f0619026615b11fef50ca269Dake Gu        // middle
157bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, 390);
158bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var2.setValue(mSource, 690);
159e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
160e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(.5f);
161e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
162770847c0c8424175f0619026615b11fef50ca269Dake Gu
163770847c0c8424175f0619026615b11fef50ca269Dake Gu        // end
164bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, 240);
165bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var2.setValue(mSource, 540);
166e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
167e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(1f);
168e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
169770847c0c8424175f0619026615b11fef50ca269Dake Gu
170770847c0c8424175f0619026615b11fef50ca269Dake Gu        // after end
171bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, 200);
172bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var2.setValue(mSource, 500);
173e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
174e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(1f);
175e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
176770847c0c8424175f0619026615b11fef50ca269Dake Gu
177770847c0c8424175f0619026615b11fef50ca269Dake Gu        // before start
178bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, 1000);
179bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var2.setValue(mSource, 1300);
180e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
181e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(0f);
182e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
183770847c0c8424175f0619026615b11fef50ca269Dake Gu
184770847c0c8424175f0619026615b11fef50ca269Dake Gu        // unknown_before
185bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, Parallax.IntProperty.UNKNOWN_BEFORE);
186bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var2.setValue(mSource, Parallax.IntProperty.UNKNOWN_BEFORE);
187e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
188e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(1f);
189e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
190770847c0c8424175f0619026615b11fef50ca269Dake Gu
191770847c0c8424175f0619026615b11fef50ca269Dake Gu        // unknown_before
192bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, Parallax.IntProperty.UNKNOWN_BEFORE);
193bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var2.setValue(mSource, -1000);
194e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
195e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(1f);
196e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
197770847c0c8424175f0619026615b11fef50ca269Dake Gu
198770847c0c8424175f0619026615b11fef50ca269Dake Gu        // unknown_after
199bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, Parallax.IntProperty.UNKNOWN_AFTER);
200bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var2.setValue(mSource, Parallax.IntProperty.UNKNOWN_AFTER);
201e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
202e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(0f);
203e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
204770847c0c8424175f0619026615b11fef50ca269Dake Gu
205770847c0c8424175f0619026615b11fef50ca269Dake Gu        // unknown_after
206bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, 1000);
207bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var2.setValue(mSource, Parallax.IntProperty.UNKNOWN_AFTER);
208e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
209e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(0f);
210e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
211770847c0c8424175f0619026615b11fef50ca269Dake Gu
212770847c0c8424175f0619026615b11fef50ca269Dake Gu        // unknown_before and less
213bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, Parallax.IntProperty.UNKNOWN_BEFORE);
214bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var2.setValue(mSource, 500);
215e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
216e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(1f);
217e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
218770847c0c8424175f0619026615b11fef50ca269Dake Gu
219770847c0c8424175f0619026615b11fef50ca269Dake Gu        // unknown_before and hit second
220bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, Parallax.IntProperty.UNKNOWN_BEFORE);
221bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var2.setValue(mSource, 540);
222e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
223e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(1f);
224e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
225770847c0c8424175f0619026615b11fef50ca269Dake Gu
226770847c0c8424175f0619026615b11fef50ca269Dake Gu        // unknown_before with estimation
227bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, Parallax.IntProperty.UNKNOWN_BEFORE);
228bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var2.setValue(mSource, 1080);
229e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
230e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(0.5f);
231e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
232770847c0c8424175f0619026615b11fef50ca269Dake Gu
233770847c0c8424175f0619026615b11fef50ca269Dake Gu        // unknown_after with estimation
234bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, 0);
235bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var2.setValue(mSource, Parallax.IntProperty.UNKNOWN_AFTER);
236e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        mEffect.performMapping(mSource);
237e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        verify(mTarget, times(1)).update(0.5f);
238e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu        Mockito.reset(mTarget);
239770847c0c8424175f0619026615b11fef50ca269Dake Gu    }
240770847c0c8424175f0619026615b11fef50ca269Dake Gu
241bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu    @Test
242bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu    public void testDirectMapping() {
243bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        mScreenMax = 1080;
244bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        Parallax.IntProperty var1 = mSource.addProperty("var1");
245bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu
246bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        mEffect.setPropertyRanges(var1.atAbsolute((int) 540.45), var1.atAbsolute((int) 0.22));
247bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        Object object = new Object();
248bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        final int[] properValue = new int[1];
249bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        Property<Object, Integer> property = new Property<Object, Integer>(Integer.class, "attr") {
250bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            @Override
251bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            public void set(Object object, Integer value) {
252bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu                properValue[0] = value;
253bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            }
254bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu
255bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            @Override
256bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            public Integer get(Object o) {
257bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu                return properValue[0];
258bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu            }
259bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        };
260bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        mTarget = new ParallaxTarget.DirectPropertyTarget<>(object, property);
261bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        mEffect.target(mTarget);
262bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu
263bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, (int) 540.45);
264bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        mEffect.performMapping(mSource);
265bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        assertEquals((int) 540.45, properValue[0]);
266bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu
267bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, (int) 405.85);
268bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        mEffect.performMapping(mSource);
269bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        assertEquals((int) 405.85, properValue[0]);
270bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu
271bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, 2000);
272bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        mEffect.performMapping(mSource);
273bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        assertEquals((int) 540.45, properValue[0]);
274bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu
275bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, (int) 0.22);
276bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        mEffect.performMapping(mSource);
277bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        assertEquals((int) 0.22, properValue[0]);
278bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu
279bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        var1.setValue(mSource, (int) 0.12);
280bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        mEffect.performMapping(mSource);
281bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu        assertEquals((int) 0.22, properValue[0]);
282bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu    }
283770847c0c8424175f0619026615b11fef50ca269Dake Gu}
284