1/*
2 * Copyright (c) 2007 Mockito contributors
3 * This program is made available under the terms of the MIT License.
4 */
5package org.mockito.internal.debugging;
6
7
8import org.junit.Test;
9import org.mockito.internal.invocation.InvocationBuilder;
10import org.mockitoutil.TestBase;
11
12import static junit.framework.TestCase.assertEquals;
13
14public class LoggingListenerTest extends TestBase {
15
16    @Test
17    public void may_not_have_any_information() {
18        //given
19        LoggingListener listener = new LoggingListener(true);
20
21        //expect
22        assertEquals("", listener.getStubbingInfo());
23    }
24
25    @Test
26    public void informs_about_unused_stubs() {
27        //given
28        LoggingListener listener = new LoggingListener(false);
29
30        //when
31        listener.foundUnusedStub(invocationAt("at com.FooTest:30"));
32        listener.foundUnusedStub(invocationAt("at com.FooTest:32"));
33
34        //then
35        assertEquals(
36            "[Mockito] Additional stubbing information (see javadoc for StubbingInfo class):\n" +
37            "[Mockito]\n" +
38            "[Mockito] Unused stubbing (perhaps can be removed from the test?):\n" +
39            "[Mockito]\n" +
40            "[Mockito] 1. at com.FooTest:30\n" +
41            "[Mockito] 2. at com.FooTest:32", listener.getStubbingInfo());
42    }
43
44    @Test
45    public void calculates_indexes_for_clean_output() {
46        assertEquals(1, LoggingListener.indexOfNextPair(0));
47        assertEquals(2, LoggingListener.indexOfNextPair(2));
48        assertEquals(3, LoggingListener.indexOfNextPair(4));
49        assertEquals(4, LoggingListener.indexOfNextPair(6));
50    }
51
52    @Test
53    public void informs_about_unused_stubs_due_arg_mismatch() {
54        //given
55        LoggingListener listener = new LoggingListener(false);
56
57        //when
58        listener.foundStubCalledWithDifferentArgs(invocationAt("at com.FooTest:20"), invocationMatcherAt("at com.Foo:100"));
59        listener.foundStubCalledWithDifferentArgs(invocationAt("at com.FooTest:21"), invocationMatcherAt("at com.Foo:121"));
60
61        //then
62        assertEquals(
63            "[Mockito] Additional stubbing information (see javadoc for StubbingInfo class):\n" +
64            "[Mockito]\n" +
65            "[Mockito] Argument mismatch between stubbing and actual invocation (is stubbing correct in the test?):\n" +
66            "[Mockito]\n" +
67            "[Mockito] 1. Stubbed at com.FooTest:20\n" +
68            "[Mockito]    Invoked at com.Foo:100\n" +
69            "[Mockito] 2. Stubbed at com.FooTest:21\n" +
70            "[Mockito]    Invoked at com.Foo:121", listener.getStubbingInfo());
71    }
72
73    @Test
74    public void informs_about_various_kinds_of_stubs() {
75        //given
76        LoggingListener listener = new LoggingListener(true);
77
78        //when
79        listener.foundUnusedStub(invocationAt("at com.FooTest:30"));
80        listener.foundStubCalledWithDifferentArgs(invocationAt("at com.FooTest:20"), invocationMatcherAt("at com.Foo:100"));
81        listener.foundUnstubbed(invocationMatcherAt("at com.Foo:96"));
82
83        //then
84        assertEquals(
85            "[Mockito] Additional stubbing information (see javadoc for StubbingInfo class):\n" +
86            "[Mockito]\n" +
87            "[Mockito] Argument mismatch between stubbing and actual invocation (is stubbing correct in the test?):\n" +
88            "[Mockito]\n" +
89            "[Mockito] 1. Stubbed at com.FooTest:20\n" +
90            "[Mockito]    Invoked at com.Foo:100\n" +
91            "[Mockito]\n" +
92            "[Mockito] Unused stubbing (perhaps can be removed from the test?):\n" +
93            "[Mockito]\n" +
94            "[Mockito] 1. at com.FooTest:30\n" +
95            "[Mockito]\n" +
96            "[Mockito] Unstubbed method invocations (perhaps missing stubbing in the test?):\n" +
97            "[Mockito]\n" +
98            "[Mockito] 1. at com.Foo:96", listener.getStubbingInfo());
99    }
100
101    @Test
102    public void hides_unstubbed() {
103        //given
104        LoggingListener listener = new LoggingListener(false);
105
106        //when
107        listener.foundUnstubbed(new InvocationBuilder().toInvocationMatcher());
108
109        //then
110        assertEquals("", listener.getStubbingInfo());
111    }
112
113    @Test
114    public void informs_about_unstubbed() {
115        //given
116        LoggingListener listener = new LoggingListener(true);
117
118        //when
119        listener.foundUnstubbed(invocationMatcherAt("com.Foo:20"));
120
121        //then
122        assertEquals(
123                "[Mockito] Additional stubbing information (see javadoc for StubbingInfo class):\n" +
124                "[Mockito]\n" +
125                "[Mockito] Unstubbed method invocations (perhaps missing stubbing in the test?):\n" +
126                "[Mockito]\n" +
127                "[Mockito] 1. com.Foo:20", listener.getStubbingInfo());
128    }
129}
130