/*******************************************************************************
* 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.recorder;
import android.content.res.Configuration;
import android.media.MediaPlayer;
import android.test.ActivityInstrumentationTestCase2;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import android.widget.TextView;
import com.jayway.android.robotium.solo.Solo;
import org.catrobat.musicdroid.MainActivity;
import org.catrobat.musicdroid.R;
import org.catrobat.musicdroid.recorder.AudioHandler;
import org.catrobat.musicdroid.tools.FileExtensionMethods;
import org.catrobat.musicdroid.types.SoundType;
import java.io.File;
public class RecorderUITest extends ActivityInstrumentationTestCase2<MainActivity> {
private static final String TAG = RecorderUITest.class.getSimpleName();
protected Solo solo = null;
protected String testFilename = "testfile.mp3";
protected MediaPlayer mediaPlayer = null;
public RecorderUITest() {
super(MainActivity.class);
}
@Override
protected void setUp() {
solo = new Solo(getInstrumentation(), getActivity());
//delete file if exists, stop overwrite warning from showing
File f = new File(AudioHandler.getInstance().getFilenameFullPath());
if (f.exists()) {
f.delete();
}
File fTest = new File(AudioHandler.getInstance().getPath() + "/" + testFilename);
if (fTest.exists()) {
fTest.delete();
}
solo.clickOnView(getActivity().findViewById(R.id.btn_add));
solo.waitForText(solo.getString(R.string.dialog_add_sound_title), 1, 10000, true);
solo.sleep(100);
solo.clickOnText(solo.getString(SoundType.MIC.getNameResource()));
solo.sleep(2000);
}
@Override
protected void tearDown() {
solo.finishOpenedActivities();
}
public void testOrientation() {
assertEquals("Not in Landscape mode!", Configuration.ORIENTATION_LANDSCAPE, solo.getCurrentActivity()
.getResources().getConfiguration().orientation);
}
public void testPlayerBoxGoneAtStart() {
RelativeLayout progressBarBox = (RelativeLayout) solo.getCurrentActivity().findViewById(
R.id.microphone_progress_bar_box);
assertEquals("Progress Bar Box is Visible", progressBarBox.getVisibility(), View.GONE);
View progressBar = solo.getCurrentActivity().findViewById(R.id.microphone_progress_bar);
assertEquals("Progress Bar is Visible", progressBar.getVisibility(), View.GONE);
ImageButton playButton = (ImageButton) solo.getCurrentActivity().findViewById(R.id.microphone_play_button);
assertEquals("Play Button is Visible", playButton.getVisibility(), View.GONE);
}
public void testImportButtonInvisibleAtStart() {
RelativeLayout addBox = (RelativeLayout) solo.getCurrentActivity().findViewById(
R.id.microphone_add_to_sound_mixer_box);
assertEquals("Add Box is Visible", addBox.getVisibility(), View.INVISIBLE);
}
public void testAmplitudeAnimation() {
ImageButton recordButton = (ImageButton) solo.getCurrentActivity().findViewById(R.id.microphone_record_button);
solo.clickOnView(recordButton);
solo.sleep(1000);
checkForOverwriteDialogAndContinue();
playSound();
ImageView equalizer = (ImageView) solo.getCurrentActivity().findViewById(R.id.microphone_equalizer);
int oldHeight = 0;
for (int i = 0; i < 100; i++) {
LayoutParams layoutParameters = (LayoutParams) equalizer.getLayoutParams();
if (layoutParameters.height > oldHeight) {
assertTrue(true);
solo.clickOnView(recordButton);
stopSound();
solo.sleep(1000);
break;
}
try {
Thread.sleep(250);
} catch (InterruptedException e) {
Log.e(TAG, Log.getStackTraceString(e));
}
}
//assertTrue("Height did not change", false);
}
public void testOverwriteWarning() {
ImageButton recordButton = (ImageButton) solo.getCurrentActivity().findViewById(R.id.microphone_record_button);
solo.clickOnView(recordButton);
solo.sleep(1000);
assertFalse(checkForOverwriteDialog());
solo.clickOnView(recordButton);
solo.sleep(1000);
solo.clickOnView(recordButton);
assertTrue(checkForOverwriteDialog());
}
public void testDoNotRecordAtDialogAbort() {
ImageButton recordButton = (ImageButton) solo.getCurrentActivity().findViewById(R.id.microphone_record_button);
solo.clickOnView(recordButton);
solo.sleep(1000);
assertFalse(checkForOverwriteDialog());
solo.clickOnView(recordButton); //stop recording
solo.sleep(1000);
File f = new File(AudioHandler.getInstance().getFilenameFullPath());
long modified = 0;
if (f.exists()) {
modified = f.lastModified();
}
solo.clickOnView(recordButton);
checkForOverwriteDialogAndAbort();
f = new File(AudioHandler.getInstance().getFilenameFullPath());
if (f.exists()) {
assertEquals(modified, f.lastModified());
}
}
public void testRecordAtDialogContinue() {
ImageButton recordButton = (ImageButton) solo.getCurrentActivity().findViewById(R.id.microphone_record_button);
solo.clickOnView(recordButton);
solo.sleep(1000);
assertFalse(checkForOverwriteDialog());
solo.clickOnView(recordButton); //stop recording
solo.sleep(1000);
File f = new File(AudioHandler.getInstance().getFilenameFullPath());
long modified = 0;
if (f.exists()) {
modified = f.lastModified();
}
solo.clickOnView(recordButton);
checkForOverwriteDialogAndContinue();
solo.sleep(2000);
f = new File(AudioHandler.getInstance().getFilenameFullPath());
if (f.exists()) {
Log.i("AASD", "Modified" + modified);
assertTrue(modified < f.lastModified());
}
}
public void testChangeLayoutOnStopRecording() {
ImageButton recordButton = (ImageButton) solo.getCurrentActivity().findViewById(R.id.microphone_record_button);
solo.clickOnView(recordButton);
solo.sleep(1000);
checkForOverwriteDialogAndContinue();
solo.clickOnView(recordButton);
solo.sleep(1000);
RelativeLayout progressBarBox = (RelativeLayout) solo.getCurrentActivity().findViewById(
R.id.microphone_progress_bar_box);
assertEquals("Progress Bar Box is Visible", progressBarBox.getVisibility(), View.VISIBLE);
View progressBar = solo.getCurrentActivity().findViewById(R.id.microphone_progress_bar);
assertEquals("Progress Bar is Visible", progressBar.getVisibility(), View.VISIBLE);
ImageButton playButton = (ImageButton) solo.getCurrentActivity().findViewById(R.id.microphone_play_button);
assertEquals("Play Button is Visible", playButton.getVisibility(), View.VISIBLE);
RelativeLayout addBox = (RelativeLayout) solo.getCurrentActivity().findViewById(
R.id.microphone_add_to_sound_mixer_box);
assertEquals("Add Box is Visible", addBox.getVisibility(), View.VISIBLE);
}
public void testChangeFilename() {
TextView filenameTextView = (TextView) solo.getCurrentActivity().findViewById(R.id.microphone_filename);
solo.clickLongOnView(filenameTextView);
solo.sleep(1000);
String filename = AudioHandler.getInstance().getFilename();
filename = FileExtensionMethods.removeFileEnding(filename);
//solo.clickOnText(filename);
solo.sleep(1000);
solo.clearEditText(0);
solo.sleep(1000);
solo.enterText(0, FileExtensionMethods.removeFileEnding(testFilename));
solo.sleep(1000);
solo.clickOnText(getActivity().getResources().getString(R.string.settings_button_apply));
ImageButton recordButton = (ImageButton) solo.getCurrentActivity().findViewById(R.id.microphone_record_button);
solo.clickOnView(recordButton);
solo.sleep(1000);
assertFalse(checkForOverwriteDialog());
solo.clickOnView(recordButton);
solo.sleep(1000);
File f = new File(AudioHandler.getInstance().getPath() + "/" + testFilename);
assertTrue(f.exists());
}
public void testFilenameUnchangedAtDialogDiscard() {
TextView filenameTextView = (TextView) solo.getCurrentActivity().findViewById(R.id.microphone_filename);
solo.clickLongOnView(filenameTextView);
solo.sleep(1000);
String filename = AudioHandler.getInstance().getFilename();
filename = FileExtensionMethods.removeFileEnding(filename);
//solo.clickOnText(filename);
solo.sleep(1000);
solo.clearEditText(0);
solo.sleep(1000);
solo.enterText(0, FileExtensionMethods.removeFileEnding(testFilename));
solo.sleep(1000);
solo.clickOnText(getActivity().getResources().getString(R.string.settings_button_discard));
ImageButton recordButton = (ImageButton) solo.getCurrentActivity().findViewById(R.id.microphone_record_button);
solo.clickOnView(recordButton);
solo.sleep(1000);
assertFalse(checkForOverwriteDialog());
solo.clickOnView(recordButton);
solo.sleep(1000);
File f = new File(AudioHandler.getInstance().getPath() + "/" + testFilename);
assertFalse(f.exists());
}
private void playSound() {
int resID = getActivity().getResources().getIdentifier("test_wav", "raw", getActivity().getPackageName());
mediaPlayer = MediaPlayer.create(solo.getCurrentActivity(), resID);
mediaPlayer.start();
}
private void stopSound() {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
}
private void checkForOverwriteDialogAndContinue() {
if (solo.searchText(solo.getCurrentActivity().getString(R.string.dialog_continue))) {
solo.clickOnButton(solo.getCurrentActivity().getString(R.string.dialog_continue));
}
}
private void checkForOverwriteDialogAndAbort() {
if (solo.searchText(solo.getCurrentActivity().getString(R.string.dialog_abort))) {
solo.clickOnButton(solo.getCurrentActivity().getString(R.string.dialog_abort));
}
}
private boolean checkForOverwriteDialog() {
if (solo.searchText(solo.getCurrentActivity().getString(R.string.dialog_continue))) {
return true;
} else {
return false;
}
}
}