package org.robolectric;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.internal.Instrument;
import org.robolectric.internal.SandboxTestRunner;
import org.robolectric.internal.bytecode.SandboxConfig;
import org.robolectric.internal.bytecode.RobolectricInternals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@RunWith(SandboxTestRunner.class)
public class StaticInitializerTest {
@Test
public void whenClassIsUnshadowed_shouldPerformStaticInitialization() throws Exception {
assertEquals("Floyd", ClassWithStaticInitializerA.name);
}
@Instrument
public static class ClassWithStaticInitializerA {
static String name = "Floyd";
}
@Test
@SandboxConfig(shadows = {ShadowClassWithoutStaticInitializerOverride.class})
public void whenClassHasShadowWithoutOverrideMethod_shouldPerformStaticInitialization() throws Exception {
assertEquals("Floyd", ClassWithStaticInitializerB.name);
RobolectricInternals.performStaticInitialization(ClassWithStaticInitializerB.class);
assertEquals("Floyd", ClassWithStaticInitializerB.name);
}
@Instrument public static class ClassWithStaticInitializerB {
public static String name = "Floyd";
}
@Implements(ClassWithStaticInitializerB.class) public static class ShadowClassWithoutStaticInitializerOverride {
}
@Test
@SandboxConfig(shadows = {ShadowClassWithStaticInitializerOverride.class})
public void whenClassHasShadowWithOverrideMethod_shouldDeferStaticInitialization() throws Exception {
assertFalse(ShadowClassWithStaticInitializerOverride.initialized);
assertEquals(null, ClassWithStaticInitializerC.name);
assertTrue(ShadowClassWithStaticInitializerOverride.initialized);
RobolectricInternals.performStaticInitialization(ClassWithStaticInitializerC.class);
assertEquals("Floyd", ClassWithStaticInitializerC.name);
}
@Instrument public static class ClassWithStaticInitializerC {
public static String name = "Floyd";
}
@Implements(ClassWithStaticInitializerC.class)
public static class ShadowClassWithStaticInitializerOverride {
public static boolean initialized = false;
@SuppressWarnings("UnusedDeclaration")
public static void __staticInitializer__() {
initialized = true;
}
}
}