/******************************************************************************* * Copyright 2013 Comcast Cable Communications Management, LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package com.comcast.freeflow.core; import java.util.HashMap; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import com.comcast.freeflow.helpers.DefaultSectionAdapter; import com.comcast.freeflow.layouts.FreeFlowLayout; import com.comcast.freeflow.layouts.VLayout; import com.comcast.freeflow.teststub.MainActivity; import android.app.Activity; import android.graphics.Rect; import android.test.ActivityInstrumentationTestCase2; import android.view.ViewTreeObserver.OnPreDrawListener; public class FreeFlowContainerTest extends ActivityInstrumentationTestCase2<MainActivity> { Activity main ; public FreeFlowContainerTest() { super(MainActivity.class); } protected void setUp() throws Exception { super.setUp(); main = getActivity(); } protected void tearDown() throws Exception { super.tearDown(); } /** * Tests that changing an attached layout cannot change * the internal map of the item proxies insode a container * * @throws InterruptedException */ public void testSourceCannotModifyFreeFlowContainerReferences() throws InterruptedException{ final CountDownLatch lock = new CountDownLatch(1); main.runOnUiThread(new Runnable() { @Override public void run() { final FreeFlowContainer container = new FreeFlowContainer(main); final VLayout vLayout = new VLayout(); vLayout.setLayoutParams(new VLayout.LayoutParams(300, 200, 10)); container.setLayout(vLayout); final DefaultSectionAdapter adapter = new DefaultSectionAdapter(main, 1, 2); container.setAdapter(adapter); main.setContentView(container); container.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() { @Override public boolean onPreDraw() { int frameCount = container.getFrames().size(); adapter.setData(5, 10); // setItems will force new frames to be generated, but not set vLayout.setAdapter(adapter); vLayout.prepareLayout() ; //assertEquals("Layout frames did not generate as expected", 5*(10+1), vLayout.getAllProxies().size()); assertEquals("FreeFlowContainer frames changed unexpectedly with data", frameCount, container.getFrames().size()); lock.countDown(); return false; } }); } }); lock.await(5000, TimeUnit.MILLISECONDS); } /** * Tests that all items are generated by the time predraw kicks in * * @throws InterruptedException */ public void testAllViewsAreGeneratedByFirstLayout() throws InterruptedException{ final CountDownLatch lock = new CountDownLatch(1); main.runOnUiThread(new Runnable() { @Override public void run() { final FreeFlowContainer container = new FreeFlowContainer(main); DefaultSectionAdapter adapter = new DefaultSectionAdapter(main, 1, 2); container.setAdapter(adapter); VLayout vLayout = new VLayout(); vLayout.setLayoutParams(new VLayout.LayoutParams(300, 200, 10)); container.setLayout(vLayout); container.addFreeFlowEventListener( new FreeFlowEventListener() { @Override public void onLayoutChanging(FreeFlowLayout oldLayout, FreeFlowLayout newLayout) { } @Override public void layoutComputed() { } @Override public void layoutComplete(boolean areTransitionAnimationsPlaying) { assertEquals("Correct number of children were not created", 3, container.getChildCount()); } @Override public void dataChanged() { } @Override public void animationsStarted() { } @Override public void layoutChangeAnimationsComplete() { } } ); main.setContentView(container); } }); lock.await(5000, TimeUnit.MILLISECONDS); } /** * Tests if a view is within the viewport and is moved, */ public void testViewChangesWhenViewMovesWithinViewport(){ HashMap<Object, FreeFlowItem> oldMap = new HashMap<Object, FreeFlowItem>(); HashMap<Object, FreeFlowItem> newMap = new HashMap<Object, FreeFlowItem>(); String one = "one"; FreeFlowItem proxy = new FreeFlowItem(); proxy.data = one; proxy.frame = new Rect(0,0, 20, 20); oldMap.put(one, proxy); FreeFlowItem proxy2 = new FreeFlowItem(); proxy.data = one; proxy.frame = new Rect(20,20,20+40,20+40); newMap.put(one, proxy2); FreeFlowContainer container = new FreeFlowContainer(getActivity()); LayoutChangeset changes = container.getViewChanges(oldMap, newMap); assertTrue(changes.getMoved().size() == 1); assertTrue(changes.getAdded().size() == 0); assertTrue(changes.getRemoved().size() == 0); } // public void testAsync(){ // FreeFlowContainer c = new FreeFlowContainer(getActivity()); // c.setLayoutParams(new LayoutParams(400,400)); // // } }