/*
 * Copyright (c) 2007 Mockito contributors
 * This program is made available under the terms of the MIT License.
 */

package org.mockitousage.misuse;

import org.junit.After;
import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.exceptions.base.MockitoException;
import org.mockitoutil.TestBase;

import java.util.List;

import static junit.framework.TestCase.fail;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.verify;

public class RestrictedObjectMethodsTest extends TestBase {

    @Mock List<?> mock;

    @After
    public void after() {
        this.resetState();
    }

    @Test
    public void shouldScreamWhenVerifyToString() {
        try {
            verify(mock).toString();
            fail();
        } catch (MockitoException e) {
            assertThat(e).hasMessageContaining("cannot verify");
        }
    }

    @Test
    public void shouldBeSilentWhenVerifyHashCode() {
        //because it leads to really wierd behavior sometimes
        //it's because cglib & my code can occasionelly call those methods
        // and when user has verification started at that time there will be a mess
        verify(mock).hashCode();
    }

    @Test
    public void shouldBeSilentWhenVerifyEquals() {
        //because it leads to really wierd behavior sometimes
        //it's because cglib & my code can occasionelly call those methods
        // and when user has verification started at that time there will be a mess
        verify(mock).equals(null);
    }

    @Test
    public void shouldBeSilentWhenVerifyEqualsInOrder() {
        //because it leads to really wierd behavior sometimes
        //it's because cglib & my code can occasionelly call those methods
        // and when user has verification started at that time there will be a mess
        InOrder inOrder = inOrder(mock);
        inOrder.verify(mock).equals(null);
    }
}
