package samples.powermockito.junit4.bugs.github510;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.assertj.core.api.Assertions.assertThat;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.powermock.api.mockito.PowerMockito.whenNew;

/**
 *
 */
@RunWith(PowerMockRunner.class)
@PrepareForTest({InterfaceWithStatic.class, ConstructorObject.class})
public class Github510Test {

    public ClassUsesInterface classUsesInterface;

    @Before
    public void setUp() throws Exception {
        classUsesInterface = new ClassUsesInterface();
    }

    @Test
    public void testSaySomething() throws Exception {
        final String value = "Hi Man";

        mockStatic(InterfaceWithStatic.class);
        when(InterfaceWithStatic.sayHello()).thenReturn(value);

        assertThat(classUsesInterface.saySomething()).isEqualTo(value);
    }

    @Test
    public void testInterfaceStaticCallsConstructor() throws Exception {
        final String value = "Hi Man";

        ConstructorObject constructorObject = mock(ConstructorObject.class);
        when(constructorObject.sayHello()).thenReturn(value);


        whenNew(ConstructorObject.class).withNoArguments().thenReturn(constructorObject);

        assertThat(classUsesInterface.createAndSay()).isEqualTo(value);
    }
}