package org.robolectric;
import javax.annotation.Nonnull;
import org.junit.Test;
import org.robolectric.annotation.Config;
import java.util.Arrays;
import java.util.Properties;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import static org.robolectric.annotation.Config.DEFAULT_VALUE_INT;
public class ConfigTest {
@Test
public void testDefaults() throws Exception {
Config defaults = Config.Builder.defaults().build();
assertThat(defaults.manifest()).isEqualTo("AndroidManifest.xml");
assertThat(defaults.resourceDir()).isEqualTo("res");
assertThat(defaults.assetDir()).isEqualTo("assets");
}
@Test
public void withOverlay_withBaseSdk() throws Exception {
Config.Implementation base = new Config.Builder().setSdk(16, 17, 18).build();
assertThat(sdksIn(overlay(base, new Config.Builder().build())))
.isEqualTo("sdk=[16, 17, 18], minSdk=-1, maxSdk=-1");
assertThat(sdksIn(overlay(base, new Config.Builder().setSdk(16).build())))
.isEqualTo("sdk=[16], minSdk=-1, maxSdk=-1");
assertThat(sdksIn(overlay(base, new Config.Builder().setMinSdk(16).build())))
.isEqualTo("sdk=[], minSdk=16, maxSdk=-1");
assertThat(sdksIn(overlay(base, new Config.Builder().setMaxSdk(20).build())))
.isEqualTo("sdk=[], minSdk=-1, maxSdk=20");
assertThat(sdksIn(overlay(base, new Config.Builder().setMinSdk(16).setMaxSdk(18).build())))
.isEqualTo("sdk=[], minSdk=16, maxSdk=18");
}
@Test
public void withOverlay_withBaseMinSdk() throws Exception {
Config.Implementation base = new Config.Builder().setMinSdk(18).build();
assertThat(sdksIn(overlay(base, new Config.Builder().build())))
.isEqualTo("sdk=[], minSdk=18, maxSdk=-1");
assertThat(sdksIn(overlay(base, new Config.Builder().setSdk(16).build())))
.isEqualTo("sdk=[16], minSdk=-1, maxSdk=-1");
assertThat(sdksIn(overlay(base, new Config.Builder().setMinSdk(16).build())))
.isEqualTo("sdk=[], minSdk=16, maxSdk=-1");
assertThat(sdksIn(overlay(base, new Config.Builder().setMaxSdk(20).build())))
.isEqualTo("sdk=[], minSdk=18, maxSdk=20");
assertThat(sdksIn(overlay(base, new Config.Builder().setMinSdk(16).setMaxSdk(18).build())))
.isEqualTo("sdk=[], minSdk=16, maxSdk=18");
}
@Test
public void withOverlay_withBaseMaxSdk() throws Exception {
Config.Implementation base = new Config.Builder().setMaxSdk(18).build();
assertThat(sdksIn(overlay(base, new Config.Builder().build())))
.isEqualTo("sdk=[], minSdk=-1, maxSdk=18");
assertThat(sdksIn(overlay(base, new Config.Builder().setSdk(16).build())))
.isEqualTo("sdk=[16], minSdk=-1, maxSdk=-1");
assertThat(sdksIn(overlay(base, new Config.Builder().setMinSdk(16).build())))
.isEqualTo("sdk=[], minSdk=16, maxSdk=18");
assertThat(sdksIn(overlay(base, new Config.Builder().setMaxSdk(20).build())))
.isEqualTo("sdk=[], minSdk=-1, maxSdk=20");
assertThat(sdksIn(overlay(base, new Config.Builder().setMinSdk(16).setMaxSdk(18).build())))
.isEqualTo("sdk=[], minSdk=16, maxSdk=18");
}
@Test
public void withOverlay_withBaseMinAndMaxSdk() throws Exception {
Config.Implementation base = new Config.Builder().setMinSdk(17).setMaxSdk(18).build();
assertThat(sdksIn(overlay(base, new Config.Builder().build())))
.isEqualTo("sdk=[], minSdk=17, maxSdk=18");
assertThat(sdksIn(overlay(base, new Config.Builder().setSdk(16).build())))
.isEqualTo("sdk=[16], minSdk=-1, maxSdk=-1");
assertThat(sdksIn(overlay(base, new Config.Builder().setMinSdk(16).build())))
.isEqualTo("sdk=[], minSdk=16, maxSdk=18");
assertThat(sdksIn(overlay(base, new Config.Builder().setMaxSdk(20).build())))
.isEqualTo("sdk=[], minSdk=17, maxSdk=20");
assertThat(sdksIn(overlay(base, new Config.Builder().setMinSdk(16).setMaxSdk(18).build())))
.isEqualTo("sdk=[], minSdk=16, maxSdk=18");
}
@Test
public void sdksFromProperties() throws Exception {
Properties properties = new Properties();
properties.setProperty("sdk", "1, 2, ALL_SDKS, TARGET_SDK, OLDEST_SDK, NEWEST_SDK, 666");
Config config = Config.Implementation.fromProperties(properties);
assertThat(sdksIn(config))
.isEqualTo("sdk=[1, 2, -2, -3, -4, -5, 666], minSdk=-1, maxSdk=-1");
}
@Test
public void minMaxSdksFromProperties() throws Exception {
Properties properties = new Properties();
properties.setProperty("minSdk", "OLDEST_SDK");
properties.setProperty("maxSdk", "NEWEST_SDK");
Config config = Config.Implementation.fromProperties(properties);
assertThat(sdksIn(config))
.isEqualTo("sdk=[], minSdk=-4, maxSdk=-5");
}
@Test
public void testIllegalArguments_sdkMutualExclusion() throws Exception {
try {
new Config.Builder()
.setSdk(16, 17, 18).setMinSdk(16).setMaxSdk(18)
.build();
fail();
} catch (IllegalArgumentException e) {
assertThat(e.getMessage())
.isEqualTo("sdk and minSdk/maxSdk may not be specified together (sdk=[16, 17, 18], minSdk=16, maxSdk=18)");
}
}
@Test
public void testIllegalArguments_minMaxSdkRange() throws Exception {
try {
new Config.Builder()
.setMinSdk(18).setMaxSdk(16)
.build();
fail();
} catch (IllegalArgumentException e) {
assertThat(e.getMessage())
.isEqualTo("minSdk may not be larger than maxSdk (minSdk=18, maxSdk=16)");
}
}
//////////////////////////
private String sdksIn(Config config) {
return "sdk=" + Arrays.toString(config.sdk()) + ", minSdk=" + config.minSdk() + ", maxSdk=" + config.maxSdk();
}
@Nonnull
private Config overlay(Config.Implementation base, Config.Implementation build) {
return new Config.Builder(base).overlay(build).build();
}
}