/*
* Copyright (C) 2014 Haruki Hasegawa
*
* 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.h6ah4i.android.media.openslmediaplayer.classtest;
import com.h6ah4i.android.media.IBasicMediaPlayer;
import com.h6ah4i.android.media.IMediaPlayerFactory;
import com.h6ah4i.android.media.audiofx.IAudioEffect;
import com.h6ah4i.android.media.audiofx.IPresetReverb;
import com.h6ah4i.android.media.openslmediaplayer.base.BasicMediaPlayerTestCaseBase;
import com.h6ah4i.android.media.openslmediaplayer.testing.ParameterizedTestArgs;
import com.h6ah4i.android.media.openslmediaplayer.testing.ParameterizedTestSuiteBuilder;
import junit.framework.TestSuite;
import java.util.ArrayList;
import java.util.List;
public class PresetReverbTestCase
extends BasicMediaPlayerTestCaseBase {
private static final class TestParams extends BasicTestParams {
private final boolean mEnabled;
public TestParams(
Class<? extends IMediaPlayerFactory> factoryClass,
boolean enabled) {
super(factoryClass);
mEnabled = enabled;
}
public boolean getPreconditionEnabled() {
return mEnabled;
}
@Override
public String toString() {
return super.toString() + ", " + mEnabled;
}
}
public static TestSuite buildTestSuite(
Class<? extends IMediaPlayerFactory> factoryClazz) {
TestSuite suite = new TestSuite();
String[] testsWithoutPreconditionEnabled = new String[] {
"testSetAndGetEnabled",
"testHasControl",
"testMultiInstanceBehavior",
"testAfterReleased",
};
// use TestParam.getPreconditionEnabled()
{
ParameterizedTestSuiteBuilder.Filter filter =
ParameterizedTestSuiteBuilder.notMatches(
testsWithoutPreconditionEnabled);
List<TestParams> params = new ArrayList<TestParams>();
params.add(new TestParams(factoryClazz, false));
params.add(new TestParams(factoryClazz, true));
suite.addTest(ParameterizedTestSuiteBuilder.buildDetail(
PresetReverbTestCase.class, params, filter, false));
}
// don't use TestParam.getPreconditionEnabled()
{
ParameterizedTestSuiteBuilder.Filter filter =
ParameterizedTestSuiteBuilder.matches(
testsWithoutPreconditionEnabled);
List<TestParams> params = new ArrayList<TestParams>();
params.add(new TestParams(factoryClazz, false));
suite.addTest(ParameterizedTestSuiteBuilder.buildDetail(
PresetReverbTestCase.class, params, filter, false));
}
return suite;
}
public PresetReverbTestCase(ParameterizedTestArgs args) {
super(args);
}
private static final short[] PRESETS = new short[] {
IPresetReverb.PRESET_NONE,
IPresetReverb.PRESET_SMALLROOM,
IPresetReverb.PRESET_MEDIUMROOM,
IPresetReverb.PRESET_LARGEROOM,
IPresetReverb.PRESET_MEDIUMHALL,
IPresetReverb.PRESET_LARGEHALL,
IPresetReverb.PRESET_PLATE,
};
//
// Exposed test cases
//
public void testSetAndGetEnabled() {
IPresetReverb reverb = null;
try {
reverb = getFactory().createPresetReverb();
assertFalse(reverb.getEnabled());
assertEquals(IAudioEffect.SUCCESS, reverb.setEnabled(true));
assertTrue(reverb.getEnabled());
assertEquals(IAudioEffect.SUCCESS, reverb.setEnabled(false));
assertFalse(reverb.getEnabled());
} finally {
releaseQuietly(reverb);
}
}
public void testDefaultPreset() {
TestParams params = (TestParams) getTestParams();
IPresetReverb reverb = null;
try {
reverb = getFactory().createPresetReverb();
reverb.setEnabled(params.getPreconditionEnabled());
assertEquals(IPresetReverb.PRESET_NONE, reverb.getPreset());
assertEquals(IPresetReverb.PRESET_NONE, reverb.getProperties().preset);
} finally {
releaseQuietly(reverb);
}
}
public void testSetAndGetPreset() {
TestParams params = (TestParams) getTestParams();
IPresetReverb reverb = null;
try {
reverb = getFactory().createPresetReverb();
reverb.setEnabled(params.getPreconditionEnabled());
for (short preset : PRESETS) {
reverb.setPreset(preset);
assertEquals(preset, reverb.getPreset());
assertEquals(preset, reverb.getProperties().preset);
}
} finally {
releaseQuietly(reverb);
}
}
public void testSetInvalidPreset() {
TestParams params = (TestParams) getTestParams();
short[] INVALID_PRESETS = new short[] {
(short) -1,
(short) (IPresetReverb.PRESET_PLATE + 1),
};
IPresetReverb reverb = null;
try {
reverb = getFactory().createPresetReverb();
reverb.setEnabled(params.getPreconditionEnabled());
for (short preset : INVALID_PRESETS) {
try {
reverb.setPreset(preset);
fail();
} catch (IllegalArgumentException e) {
// expected
}
}
} finally {
releaseQuietly(reverb);
}
}
public void testSetAndGetPropertiesCompat() {
TestParams params = (TestParams) getTestParams();
IPresetReverb reverb = null;
try {
reverb = getFactory().createPresetReverb();
reverb.setEnabled(params.getPreconditionEnabled());
for (short preset : PRESETS) {
IPresetReverb.Settings settings = new IPresetReverb.Settings();
settings.preset = preset;
reverb.setProperties(settings);
assertEquals(preset, reverb.getPreset());
assertEquals(preset, reverb.getProperties().preset);
}
} finally {
releaseQuietly(reverb);
}
}
public void testGetId() {
TestParams params = (TestParams) getTestParams();
IPresetReverb reverb = null;
try {
reverb = getFactory().createPresetReverb();
reverb.setEnabled(params.getPreconditionEnabled());
assertNotEquals(0, reverb.getId());
} finally {
releaseQuietly(reverb);
}
}
public void testHasControl() {
IPresetReverb reverb1 = null, reverb2 = null, reverb3 = null;
try {
// create instance 1
// NOTE: [1]: has control, [2] not created, [3] not created
reverb1 = getFactory().createPresetReverb();
assertTrue(reverb1.hasControl());
// create instance 2
// NOTE: [1]: lost control, [2] has control, [3] not created
reverb2 = getFactory().createPresetReverb();
assertFalse(reverb1.hasControl());
assertTrue(reverb2.hasControl());
// create instance 3
// NOTE: [1]: lost control, [2] lost control, [3] not created
reverb3 = getFactory().createPresetReverb();
assertFalse(reverb1.hasControl());
assertFalse(reverb2.hasControl());
assertTrue(reverb3.hasControl());
// release instance 3
// NOTE: [1]: lost control, [2] has control, [3] released
reverb3.release();
reverb3 = null;
assertFalse(reverb1.hasControl());
assertTrue(reverb2.hasControl());
// release instance 2
// NOTE: [1]: lost control, [2] released, [3] released
reverb2.release();
reverb2 = null;
assertTrue(reverb1.hasControl());
} finally {
releaseQuietly(reverb1);
releaseQuietly(reverb2);
releaseQuietly(reverb3);
}
}
public void testMultiInstanceBehavior() {
IPresetReverb reverb1 = null, reverb2 = null;
try {
reverb1 = getFactory().createPresetReverb();
reverb2 = getFactory().createPresetReverb();
// check pre. conditions
assertFalse(reverb1.hasControl());
assertTrue(reverb2.hasControl());
assertFalse(reverb1.getEnabled());
assertFalse(reverb2.getEnabled());
assertEquals(IPresetReverb.PRESET_NONE, reverb1.getPreset());
assertEquals(IPresetReverb.PRESET_NONE, reverb2.getPreset());
// change states
assertEquals(IAudioEffect.SUCCESS, reverb2.setEnabled(true));
reverb2.setPreset(IPresetReverb.PRESET_SMALLROOM);
// check post conditions
assertFalse(reverb1.hasControl());
assertTrue(reverb2.hasControl());
assertTrue(reverb1.getEnabled());
assertTrue(reverb2.getEnabled());
assertEquals(IPresetReverb.PRESET_SMALLROOM, reverb1.getPreset());
assertEquals(IPresetReverb.PRESET_SMALLROOM, reverb2.getPreset());
// release effect 2
reverb2.release();
reverb2 = null;
// check effect 1 gains control
assertTrue(reverb1.hasControl());
assertEquals(IAudioEffect.SUCCESS, reverb1.setEnabled(false));
} finally {
releaseQuietly(reverb1);
releaseQuietly(reverb2);
}
}
public void testAfterReleased() {
try {
createReleasedPresetReverb().hasControl();
fail();
} catch (IllegalStateException e) {
// expected
}
try {
createReleasedPresetReverb().getEnabled();
fail();
} catch (IllegalStateException e) {
// expected
}
try {
createReleasedPresetReverb().setEnabled(false);
fail();
} catch (IllegalStateException e) {
// expected
}
try {
createReleasedPresetReverb().getId();
fail();
} catch (IllegalStateException e) {
// expected
}
try {
createReleasedPresetReverb().getPreset();
fail();
} catch (IllegalStateException e) {
// expected
}
try {
createReleasedPresetReverb().setPreset(IPresetReverb.PRESET_NONE);
fail();
} catch (IllegalStateException e) {
// expected
}
try {
createReleasedPresetReverb().getProperties();
fail();
} catch (IllegalStateException e) {
// expected
}
try {
IPresetReverb.Settings settings = new IPresetReverb.Settings();
settings.preset = IPresetReverb.PRESET_NONE;
createReleasedPresetReverb().setProperties(settings);
fail();
} catch (IllegalStateException e) {
// expected
}
}
public void testReleaseAfterAttachedPlayerReleased() throws Exception {
TestParams params = (TestParams) getTestParams();
IBasicMediaPlayer player = null;
IPresetReverb reverb = null;
try {
player = createWrappedPlayerInstance();
reverb = getFactory().createPresetReverb();
reverb.setEnabled(params.getPreconditionEnabled());
transitStateToPrepared(player, null);
// attach the effect
int effectId = reverb.getId();
assertNotEquals(0, effectId);
player.attachAuxEffect(effectId);
// release player
player.release();
// release reverb
reverb.release();
} finally {
releaseQuietly(player);
releaseQuietly(reverb);
}
}
public void testReleaseBeforeAttachedPlayerReleased() throws Exception {
TestParams params = (TestParams) getTestParams();
IBasicMediaPlayer player = null;
IPresetReverb reverb = null;
try {
player = createWrappedPlayerInstance();
reverb = getFactory().createPresetReverb();
reverb.setEnabled(params.getPreconditionEnabled());
transitStateToPrepared(player, null);
// attach the effect
int effectId = reverb.getId();
assertNotEquals(0, effectId);
player.attachAuxEffect(effectId);
// release reverb
reverb.release();
// release player
player.release();
} finally {
releaseQuietly(player);
releaseQuietly(reverb);
}
}
public void testReleaseAfterFactoryReleased() throws Exception {
IPresetReverb reverb = null;
try {
reverb = getFactory().createPresetReverb();
IPresetReverb.Settings origSettings = reverb.getProperties();
getFactory().release();
// NOTE: The reverb object is still usable
assertTrue(reverb.hasControl());
assertFalse(reverb.getEnabled());
assertNotEquals(0, reverb.getId());
reverb.getPreset();
reverb.setPreset(IPresetReverb.PRESET_NONE);
reverb.getProperties();
reverb.setProperties(origSettings);
reverb.release();
reverb = null;
} finally {
releaseQuietly(reverb);
}
}
//
// Utilities
//
static void assertEquals(IPresetReverb.Settings expected, IPresetReverb.Settings actual) {
assertEquals(expected.toString(), actual.toString());
}
IPresetReverb createReleasedPresetReverb() {
IPresetReverb reverb = getFactory().createPresetReverb();
reverb.release();
return reverb;
}
}