1/**
2 * Copyright (c) 2004-2011 QOS.ch
3 * All rights reserved.
4 *
5 * Permission is hereby granted, free  of charge, to any person obtaining
6 * a  copy  of this  software  and  associated  documentation files  (the
7 * "Software"), to  deal in  the Software without  restriction, including
8 * without limitation  the rights to  use, copy, modify,  merge, publish,
9 * distribute,  sublicense, and/or sell  copies of  the Software,  and to
10 * permit persons to whom the Software  is furnished to do so, subject to
11 * the following conditions:
12 *
13 * The  above  copyright  notice  and  this permission  notice  shall  be
14 * included in all copies or substantial portions of the Software.
15 *
16 * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
17 * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
18 * MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 * OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
22 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 *
24 */
25package org.slf4j;
26
27import java.util.Iterator;
28
29import junit.framework.TestCase;
30
31import org.slf4j.helpers.BasicMarkerFactory;
32
33/**
34 * Unit test BasicMarker
35 *
36 * @author Ceki Gülcü
37 * @author Joern Huxhorn
38 */
39public class BasicMarkerTest extends TestCase {
40    static final String BLUE_STR = "BLUE";
41    static final String RED_STR = "RED";
42    static final String GREEN_STR = "GREEN";
43    static final String COMP_STR = "COMP";
44    static final String MULTI_COMP_STR = "MULTI_COMP";
45    static final String PARENT_MARKER_STR = "PARENT_MARKER";
46    static final String CHILD_MARKER_STR = "CHILD_MARKER";
47    static final String NOT_CONTAINED_MARKER_STR = "NOT_CONTAINED";
48
49    final IMarkerFactory factory;
50    final Marker blue;
51    final Marker red;
52    final Marker green;
53    final Marker comp;
54    final Marker multiComp;
55
56    short diff = Differentiator.getDiffentiator();
57
58    public BasicMarkerTest() {
59        factory = new BasicMarkerFactory();
60
61        blue = factory.getMarker(BLUE_STR);
62        red = factory.getMarker(RED_STR);
63        green = factory.getMarker(GREEN_STR);
64        comp = factory.getMarker(COMP_STR);
65        comp.add(blue);
66
67        multiComp = factory.getMarker(MULTI_COMP_STR);
68        multiComp.add(green);
69        multiComp.add(comp);
70    }
71
72    public void testPrimitive() {
73        assertEquals(BLUE_STR, blue.getName());
74        assertTrue(blue.contains(blue));
75
76        Marker blue2 = factory.getMarker(BLUE_STR);
77        assertEquals(BLUE_STR, blue2.getName());
78        assertEquals(blue, blue2);
79        assertTrue(blue.contains(blue2));
80        assertTrue(blue2.contains(blue));
81    }
82
83    public void testPrimitiveByName() {
84        assertTrue(blue.contains(BLUE_STR));
85    }
86
87    public void testComposite() {
88        assertTrue(comp.contains(comp));
89        assertTrue(comp.contains(blue));
90    }
91
92    public void testCompositeByName() {
93        assertTrue(comp.contains(COMP_STR));
94        assertTrue(comp.contains(BLUE_STR));
95    }
96
97    public void testMultiComposite() {
98        assertTrue(multiComp.contains(comp));
99        assertTrue(multiComp.contains(blue));
100        assertTrue(multiComp.contains(green));
101        assertFalse(multiComp.contains(red));
102    }
103
104    public void testMultiCompositeByName() {
105        assertTrue(multiComp.contains(COMP_STR));
106        assertTrue(multiComp.contains(BLUE_STR));
107        assertTrue(multiComp.contains(GREEN_STR));
108        assertFalse(multiComp.contains(RED_STR));
109    }
110
111    public void testMultiAdd() {
112        Marker parent = factory.getMarker(PARENT_MARKER_STR);
113        Marker child = factory.getMarker(CHILD_MARKER_STR);
114        for (int i = 0; i < 10; i++) {
115            parent.add(child);
116        }
117
118        // check that the child was added once and only once
119        Iterator<Marker> iterator = parent.iterator();
120        assertTrue(iterator.hasNext());
121        assertEquals(CHILD_MARKER_STR, iterator.next().toString());
122        assertFalse(iterator.hasNext());
123    }
124
125    public void testAddRemove() {
126        final String NEW_PREFIX = "NEW_";
127        Marker parent = factory.getMarker(NEW_PREFIX + PARENT_MARKER_STR);
128        Marker child = factory.getMarker(NEW_PREFIX + CHILD_MARKER_STR);
129        assertFalse(parent.contains(child));
130        assertFalse(parent.contains(NEW_PREFIX + CHILD_MARKER_STR));
131        assertFalse(parent.remove(child));
132
133        parent.add(child);
134
135        assertTrue(parent.contains(child));
136        assertTrue(parent.contains(NEW_PREFIX + CHILD_MARKER_STR));
137
138        assertTrue(parent.remove(child));
139
140        assertFalse(parent.contains(child));
141        assertFalse(parent.contains(NEW_PREFIX + CHILD_MARKER_STR));
142        assertFalse(parent.remove(child));
143    }
144
145    public void testSelfRecursion() {
146        final String diffPrefix = "NEW_" + diff;
147        final String PARENT_NAME = diffPrefix + PARENT_MARKER_STR;
148        final String NOT_CONTAINED_NAME = diffPrefix + NOT_CONTAINED_MARKER_STR;
149        Marker parent = factory.getMarker(PARENT_NAME);
150        Marker notContained = factory.getMarker(NOT_CONTAINED_NAME);
151        parent.add(parent);
152        assertTrue(parent.contains(parent));
153        assertTrue(parent.contains(PARENT_NAME));
154        assertFalse(parent.contains(notContained));
155        assertFalse(parent.contains(NOT_CONTAINED_MARKER_STR));
156    }
157
158    public void testIndirectRecursion() {
159        final String diffPrefix = "NEW_" + diff;
160        final String PARENT_NAME = diffPrefix + PARENT_MARKER_STR;
161        final String CHILD_NAME = diffPrefix + CHILD_MARKER_STR;
162        final String NOT_CONTAINED_NAME = diffPrefix + NOT_CONTAINED_MARKER_STR;
163
164        Marker parent = factory.getMarker(PARENT_NAME);
165        Marker child = factory.getMarker(CHILD_NAME);
166        Marker notContained = factory.getMarker(NOT_CONTAINED_NAME);
167
168        parent.add(child);
169        child.add(parent);
170        assertTrue(parent.contains(parent));
171        assertTrue(parent.contains(child));
172        assertTrue(parent.contains(PARENT_NAME));
173        assertTrue(parent.contains(CHILD_NAME));
174        assertFalse(parent.contains(notContained));
175        assertFalse(parent.contains(NOT_CONTAINED_MARKER_STR));
176    }
177
178    public void testHomonyms() {
179        final String diffPrefix = "homonym" + diff;
180        final String PARENT_NAME = diffPrefix + PARENT_MARKER_STR;
181        final String CHILD_NAME = diffPrefix + CHILD_MARKER_STR;
182        Marker parent = factory.getMarker(PARENT_NAME);
183        Marker child = factory.getMarker(CHILD_NAME);
184        parent.add(child);
185
186        IMarkerFactory otherFactory = new BasicMarkerFactory();
187        Marker otherParent = otherFactory.getMarker(PARENT_NAME);
188        Marker otherChild = otherFactory.getMarker(CHILD_NAME);
189
190        assertTrue(parent.contains(otherParent));
191        assertTrue(parent.contains(otherChild));
192
193        assertTrue(parent.remove(otherChild));
194    }
195
196}
197