aboutsummaryrefslogtreecommitdiff
path: root/robolectric/src/test/java/org/robolectric/android/ResourceLoaderTest.java
blob: 15ca52c68e5a5d6d918cc0b6919bcc0a284230e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package org.robolectric.android;

import static android.os.Build.VERSION_CODES.O;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.TruthJUnit.assume;
import static org.robolectric.shadows.ShadowAssetManager.useLegacy;

import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.os.Build.VERSION_CODES;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import java.util.Locale;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.R;
import org.robolectric.Robolectric;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.res.ResName;
import org.robolectric.res.ResourceTable;

@RunWith(AndroidJUnit4.class)
public class ResourceLoaderTest {

  private String optsForO;

  @Before
  public void setUp() {
    assume().that(useLegacy()).isTrue();

    optsForO = RuntimeEnvironment.getApiLevel() >= O
        ? "nowidecg-lowdr-"
        : "";
  }

  @Test
  @Config(qualifiers="w0dp")
  public void checkDefaultBooleanValue() throws Exception {
    assertThat(
            ApplicationProvider.getApplicationContext()
                .getResources()
                .getBoolean(R.bool.different_resource_boolean))
        .isEqualTo(false);
  }

  @Test
  @Config(qualifiers="w820dp")
  public void checkQualifiedBooleanValue() throws Exception {
    assertThat(
            ApplicationProvider.getApplicationContext()
                .getResources()
                .getBoolean(R.bool.different_resource_boolean))
        .isEqualTo(true);
  }
  
  @Test
  public void checkForPollution1() throws Exception {
    checkForPollutionHelper();
  }

  @Test
  public void checkForPollution2() throws Exception {
    checkForPollutionHelper();
  }

  private void checkForPollutionHelper() {
    assertThat(RuntimeEnvironment.getQualifiers())
        .isEqualTo(
            "en-rUS-ldltr-sw320dp-w320dp-h470dp-normal-notlong-notround-"
                + optsForO
                + "port-notnight-mdpi-finger-keyssoft-nokeys-navhidden-nonav-v"
                + Build.VERSION.RESOURCES_SDK_INT);

    View view =
        LayoutInflater.from(ApplicationProvider.getApplicationContext())
            .inflate(R.layout.different_screen_sizes, null);
    TextView textView = view.findViewById(android.R.id.text1);
    assertThat(textView.getText().toString()).isEqualTo("default");
    RuntimeEnvironment.setQualifiers("fr-land"); // testing if this pollutes the other test
    Configuration configuration = Resources.getSystem().getConfiguration();
    if (RuntimeEnvironment.getApiLevel() <= VERSION_CODES.JELLY_BEAN) {
      configuration.locale = new Locale("fr", "FR");
    } else {
      configuration.setLocale(new Locale("fr", "FR"));
    }
    configuration.orientation = Configuration.ORIENTATION_LANDSCAPE;
    Resources.getSystem().updateConfiguration(configuration, null);
  }

  @Test
  public void shouldMakeInternalResourcesAvailable() throws Exception {
    ResourceTable resourceProvider = RuntimeEnvironment.getSystemResourceTable();
    ResName internalResource = new ResName("android", "string", "badPin");
    Integer resId = resourceProvider.getResourceId(internalResource);
    assertThat(resId).isNotNull();
    assertThat(resourceProvider.getResName(resId)).isEqualTo(internalResource);

    Class<?> internalRIdClass =
        Robolectric.class
            .getClassLoader()
            .loadClass("com.android.internal.R$" + internalResource.type);
    int internalResourceId;
    internalResourceId = (Integer) internalRIdClass.getDeclaredField(internalResource.name).get(null);
    assertThat(resId).isEqualTo(internalResourceId);

    assertThat(ApplicationProvider.getApplicationContext().getResources().getString(resId))
        .isEqualTo("The old PIN you typed isn't correct.");
  }
}