1 package org.robolectric.android; 2 3 import static org.assertj.core.api.Assertions.assertThat; 4 5 import android.content.res.Configuration; 6 import android.util.DisplayMetrics; 7 import org.junit.Before; 8 import org.junit.Test; 9 import org.junit.runner.RunWith; 10 import org.robolectric.RobolectricTestRunner; 11 import org.robolectric.RuntimeEnvironment; 12 import org.robolectric.annotation.Config; 13 import org.robolectric.res.Qualifiers; 14 15 @RunWith(RobolectricTestRunner.class) 16 @Config(sdk = 26) 17 public class DeviceConfigTest { 18 19 private Configuration configuration; 20 private DisplayMetrics displayMetrics; 21 private int apiLevel; 22 23 @Before 24 public void setUp() throws Exception { 25 configuration = new Configuration(); 26 displayMetrics = new DisplayMetrics(); 27 apiLevel = RuntimeEnvironment.getApiLevel(); 28 } 29 30 @Test 31 public void applyToConfiguration() throws Exception { 32 applyQualifiers("en-rUS-w400dp-h800dp-notround"); 33 assertThat(asQualifierString()) 34 .isEqualTo("en-rUS-ldltr-w400dp-h800dp-notround"); 35 } 36 37 @Test 38 public void applyToConfiguration_isCumulative() throws Exception { 39 applyQualifiers("en-rUS-ldltr-sw400dp-w400dp-h800dp-normal-notlong-notround-port-notnight-mdpi-finger-keyssoft-nokeys-navhidden-nonav"); 40 assertThat(asQualifierString()) 41 .isEqualTo("en-rUS-ldltr-sw400dp-w400dp-h800dp-normal-notlong-notround-port-notnight-mdpi-finger-keyssoft-nokeys-navhidden-nonav"); 42 43 applyQualifiers("fr-land"); 44 assertThat(asQualifierString()) 45 .isEqualTo("fr-ldltr-sw400dp-w400dp-h800dp-normal-notlong-notround-land-notnight-mdpi-finger-keyssoft-nokeys-navhidden-nonav"); 46 47 applyQualifiers("w500dp-large-television-night-xxhdpi-notouch-keyshidden"); 48 assertThat(asQualifierString()) 49 .isEqualTo("fr-ldltr-sw400dp-w500dp-large-notlong-notround-land-television-night-xxhdpi-notouch-keyshidden-nokeys-navhidden-nonav"); 50 51 applyQualifiers("long"); 52 assertThat(asQualifierString()) 53 .isEqualTo("fr-ldltr-sw400dp-w500dp-large-long-notround-land-television-night-xxhdpi-notouch-keyshidden-nokeys-navhidden-nonav"); 54 55 applyQualifiers("round"); 56 assertThat(asQualifierString()) 57 .isEqualTo("fr-ldltr-sw400dp-w500dp-large-long-round-land-television-night-xxhdpi-notouch-keyshidden-nokeys-navhidden-nonav"); 58 } 59 60 @Test 61 public void applyRules_defaults() throws Exception { 62 DeviceConfig.applyRules(configuration, displayMetrics, apiLevel); 63 64 assertThat(asQualifierString()) 65 .isEqualTo("en-rUS-ldltr-sw320dp-w320dp-h470dp-normal-notlong-notround-port-notnight-mdpi-finger-keyssoft-nokeys-navhidden-nonav"); 66 } 67 68 @Test 69 public void applyRules_rtlScript() throws Exception { 70 applyQualifiers("he"); 71 DeviceConfig.applyRules(configuration, displayMetrics, apiLevel); 72 73 assertThat(asQualifierString()) 74 .isEqualTo("iw-ldrtl-sw320dp-w320dp-h470dp-normal-notlong-notround-port-notnight-mdpi-finger-keyssoft-nokeys-navhidden-nonav"); 75 } 76 77 @Test 78 public void applyRules_heightWidth() throws Exception { 79 applyQualifiers("w800dp-h400dp"); 80 DeviceConfig.applyRules(configuration, displayMetrics, apiLevel); 81 82 assertThat(asQualifierString()) 83 .isEqualTo("en-rUS-ldltr-sw400dp-w800dp-h400dp-normal-long-notround-land-notnight-mdpi-finger-keyssoft-nokeys-navhidden-nonav"); 84 } 85 86 @Test 87 public void applyRules_heightWidthOrientation() throws Exception { 88 applyQualifiers("w800dp-h400dp-port"); 89 DeviceConfig.applyRules(configuration, displayMetrics, apiLevel); 90 91 assertThat(asQualifierString()) 92 .isEqualTo("en-rUS-ldltr-sw400dp-w400dp-h800dp-normal-long-notround-port-notnight-mdpi-finger-keyssoft-nokeys-navhidden-nonav"); 93 } 94 95 @Test 96 public void applyRules_sizeToDimens() throws Exception { 97 applyQualifiers("large-land"); 98 DeviceConfig.applyRules(configuration, displayMetrics, apiLevel); 99 100 assertThat(asQualifierString()) 101 .isEqualTo("en-rUS-ldltr-sw480dp-w640dp-h480dp-large-notlong-notround-land-notnight-mdpi-finger-keyssoft-nokeys-navhidden-nonav"); 102 } 103 104 @Test 105 public void applyRules_sizeFromDimens() throws Exception { 106 applyQualifiers("w800dp-h640dp"); 107 DeviceConfig.applyRules(configuration, displayMetrics, apiLevel); 108 109 assertThat(asQualifierString()) 110 .isEqualTo("en-rUS-ldltr-sw640dp-w800dp-h640dp-large-notlong-notround-land-notnight-mdpi-finger-keyssoft-nokeys-navhidden-nonav"); 111 } 112 113 @Test 114 public void applyRules_longIncreasesHeight() throws Exception { 115 applyQualifiers("long"); 116 DeviceConfig.applyRules(configuration, displayMetrics, apiLevel); 117 118 assertThat(asQualifierString()) 119 .isEqualTo("en-rUS-ldltr-sw320dp-w320dp-h587dp-normal-long-notround-port-notnight-mdpi-finger-keyssoft-nokeys-navhidden-nonav"); 120 } 121 122 @Test 123 public void applyRules_greatHeightTriggersLong() throws Exception { 124 applyQualifiers("h590dp"); 125 DeviceConfig.applyRules(configuration, displayMetrics, apiLevel); 126 127 assertThat(asQualifierString()) 128 .isEqualTo("en-rUS-ldltr-sw320dp-w320dp-h590dp-normal-long-notround-port-notnight-mdpi-finger-keyssoft-nokeys-navhidden-nonav"); 129 } 130 131 ////////////////////////// 132 133 private void applyQualifiers(String qualifiers) { 134 DeviceConfig.applyToConfiguration(Qualifiers.parse(qualifiers), 135 apiLevel, configuration, displayMetrics); 136 } 137 138 private String asQualifierString() { 139 return ConfigurationV25.resourceQualifierString(configuration, displayMetrics, false); 140 } 141 } 142