/******************************************************************************* * Catroid: An on-device visual programming system for Android devices * Copyright (C) 2010-2013 The Catrobat Team * (<http://developer.catrobat.org/credits>) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * An additional term exception under section 7 of the GNU Affero * General Public License, version 3, is available at * http://www.catroid.org/catroid/licenseadditionalterm * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package org.catrobat.musicdroid.uitest.menutest; import android.test.ActivityInstrumentationTestCase2; import android.util.Log; import android.view.View; import android.widget.ImageButton; import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; import com.jayway.android.robotium.solo.Solo; import org.catrobat.musicdroid.MainActivity; import org.catrobat.musicdroid.R; import org.catrobat.musicdroid.soundmixer.SoundMixer; import org.catrobat.musicdroid.soundmixer.timeline.Timeline; import org.catrobat.musicdroid.soundmixer.timeline.TimelineProgressBar; import org.catrobat.musicdroid.tools.DeviceInfo; import org.catrobat.musicdroid.types.SoundType; import org.catrobat.musicdroid.uitest.utils.UiTestHelper; public class TimelineTest extends ActivityInstrumentationTestCase2<MainActivity> { protected Solo solo = null; protected SoundMixer mixer = null; protected Timeline timeline = null; protected UiTestHelper helper; protected ImageButton playImageButton = null; protected TimelineProgressBar timelineProgressBar = null; public TimelineTest() { super(MainActivity.class); } @Override protected void setUp() { solo = new Solo(getInstrumentation(), getActivity()); mixer = SoundMixer.getInstance(); timeline = (Timeline) getActivity().findViewById(R.id.timeline); playImageButton = (ImageButton) getActivity().findViewById(R.id.btn_play); timelineProgressBar = (TimelineProgressBar) timeline.findViewById(R.id.timeline_progressBar); } @Override protected void tearDown() { solo.finishOpenedActivities(); } public void testTrackLengthSettings() { int numTextViewsTopBegin = ((RelativeLayout) timeline.getChildAt(0)).getChildCount(); int numViewsBottomBegin = ((RelativeLayout) timeline.getChildAt(1)).getChildCount(); solo.clickOnView(getActivity().findViewById(R.id.btn_settings)); solo.waitForText(getActivity().getString(R.string.soundmixer_context_title)); solo.clickOnView(getActivity().findViewById(R.id.soundmixer_context_length)); solo.sleep(1000); solo.drag(DeviceInfo.getScreenWidth(solo.getCurrentActivity()) / 2 - 50, DeviceInfo.getScreenHeight(solo.getCurrentActivity()) / 2, DeviceInfo.getScreenWidth(solo.getCurrentActivity()) / 2 - 50, DeviceInfo.getScreenHeight(solo.getCurrentActivity()) / 3, 1); solo.sleep(1000); solo.clickOnText(getActivity().getString(R.string.settings_button_apply)); solo.sleep(1000); assertTrue("SoundMixer is not scrollable", UiTestHelper.scrollToSide(solo, timeline)); int numTextViewsTopEnd = ((RelativeLayout) timeline.getChildAt(0)).getChildCount(); int numViewsBottomEnd = ((RelativeLayout) timeline.getChildAt(1)).getChildCount(); Log.i("Begin: " + numTextViewsTopBegin, "End: " + numTextViewsTopEnd); Log.i("Begin: " + numViewsBottomBegin, "End: " + numViewsBottomEnd); assertFalse(numTextViewsTopBegin == numTextViewsTopEnd); assertFalse(numViewsBottomBegin == numViewsBottomEnd); //add one View for each second but only one TextView each 5 seconds assertTrue(numViewsBottomBegin >= numTextViewsTopBegin * 5); assertTrue(numViewsBottomEnd >= numTextViewsTopEnd * 5); } public void startEndMarkerTest() { int[] timelineLocation = { 0, 0 }; timeline.getLocationOnScreen(timelineLocation); int clickXPosition = timelineLocation[0] + 200; UiTestHelper.addTimelineMarker(solo, clickXPosition, timelineLocation[1], getActivity().getString(R.string.timeline_menu_entry_start_point)); View startMarker = timeline.findViewById(R.id.timeline_start_point); int margin = ((RelativeLayout.LayoutParams) startMarker.getLayoutParams()).leftMargin; int pixelPerSecond = SoundMixer.getInstance().getPixelPerSecond(); Log.i("StartEndMarkerTest", "Margin: " + margin + " ClickX: " + clickXPosition + " PpS: " + pixelPerSecond); assertTrue(margin >= clickXPosition - pixelPerSecond * 2 && margin <= clickXPosition + pixelPerSecond * 2); //End Marker clickXPosition = timelineLocation[0] + 600; UiTestHelper.addTimelineMarker(solo, clickXPosition, timelineLocation[1], getActivity().getString(R.string.timeline_menu_entry_end_point)); View endMarker = timeline.findViewById(R.id.timeline_end_point); int marginEnd = ((RelativeLayout.LayoutParams) endMarker.getLayoutParams()).leftMargin; Log.i("StartEndMarkerTest", "Margin: " + marginEnd + " ClickX: " + clickXPosition + " PpS: " + pixelPerSecond); assertTrue(marginEnd >= clickXPosition - pixelPerSecond && marginEnd <= clickXPosition + pixelPerSecond); } public void testStartMarkerBeforeEndMarker() { int[] timelineLocation = { 0, 0 }; timeline.getLocationOnScreen(timelineLocation); int clickXPosition = timelineLocation[0] + 200; UiTestHelper.addTimelineMarker(solo, clickXPosition, timelineLocation[1], getActivity().getString(R.string.timeline_menu_entry_start_point)); View startMarker = timeline.findViewById(R.id.timeline_start_point); //place endMarker before startMarker - will fail clickXPosition = timelineLocation[0] + 100; UiTestHelper.addTimelineMarker(solo, clickXPosition, timelineLocation[1], getActivity().getString(R.string.timeline_menu_entry_end_point)); View endMarker = timeline.findViewById(R.id.timeline_end_point); assertTrue(endMarker.getVisibility() == View.GONE); //place endMarker behind startMarker clickXPosition = timelineLocation[0] + 400; UiTestHelper.addTimelineMarker(solo, clickXPosition, timelineLocation[1], getActivity().getString(R.string.timeline_menu_entry_end_point)); //place startMarker behind endMarker - will fail int oldMarginStartMarker = ((RelativeLayout.LayoutParams) startMarker.getLayoutParams()).leftMargin; clickXPosition = timelineLocation[0] + 600; UiTestHelper.addTimelineMarker(solo, clickXPosition, timelineLocation[1], getActivity().getString(R.string.timeline_menu_entry_start_point)); int newMarginStartMarker = ((RelativeLayout.LayoutParams) startMarker.getLayoutParams()).leftMargin; assertTrue(oldMarginStartMarker == newMarginStartMarker); } public void testMoveMarker() { int[] timelineLocation = { 0, 0 }; timeline.getLocationOnScreen(timelineLocation); int clickXPosition = timelineLocation[0] + 200; UiTestHelper.addTimelineMarker(solo, clickXPosition, timelineLocation[1], getActivity().getString(R.string.timeline_menu_entry_start_point)); View startMarker = timeline.findViewById(R.id.timeline_start_point); clickXPosition = timelineLocation[0] + 400; UiTestHelper.addTimelineMarker(solo, clickXPosition, timelineLocation[1], getActivity().getString(R.string.timeline_menu_entry_end_point)); View endMarker = timeline.findViewById(R.id.timeline_end_point); int[] startMarkerLocation = { 0, 0 }; startMarker.getLocationOnScreen(startMarkerLocation); int startMargin = ((RelativeLayout.LayoutParams) startMarker.getLayoutParams()).leftMargin; int endMargin = ((RelativeLayout.LayoutParams) endMarker.getLayoutParams()).leftMargin; int drag = endMargin - startMargin; solo.drag(startMarkerLocation[0], startMarkerLocation[0] + drag + 10, startMarkerLocation[1], startMarkerLocation[1], 20); solo.sleep(1000); assertTrue(((RelativeLayout.LayoutParams) startMarker.getLayoutParams()).leftMargin < ((RelativeLayout.LayoutParams) endMarker .getLayoutParams()).leftMargin); } public void testTimelineProgressBar() { LayoutParams lp = (LayoutParams) timelineProgressBar.getLayoutParams(); assertTrue(lp.width == 0); UiTestHelper.addTrack(solo, SoundType.DRUMS); solo.clickOnView(playImageButton); solo.sleep(5000); lp = (LayoutParams) timelineProgressBar.getLayoutParams(); assertTrue(lp.width >= SoundMixer.getInstance().getPixelPerSecond() * 4); //assert progressbar remains unchanged after pressing stop button solo.clickOnView(playImageButton); lp = (LayoutParams) timelineProgressBar.getLayoutParams(); assertTrue(lp.width >= SoundMixer.getInstance().getPixelPerSecond() * 5); } public void testTimelineProgessBarResetOnRewind() { testTimelineProgressBar(); ImageButton rewindImageButton = (ImageButton) getActivity().findViewById(R.id.btn_rewind); solo.clickOnView(rewindImageButton); LayoutParams lp = (LayoutParams) timelineProgressBar.getLayoutParams(); assertTrue(lp.width == 0); } public void testTimelineProgressBarUnchangedOnPause() { testTimelineProgressBar(); LayoutParams lp = (LayoutParams) timelineProgressBar.getLayoutParams(); int startWidth = lp.width; solo.clickOnView(playImageButton); solo.sleep(1000); lp = (LayoutParams) timelineProgressBar.getLayoutParams(); assertTrue(lp.width >= startWidth + SoundMixer.getInstance().getPixelPerSecond()); solo.clickOnView(playImageButton); } }