001/*
002 * ModeShape (http://www.modeshape.org)
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *       http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.modeshape.common.collection;
017
018import static org.hamcrest.core.Is.is;
019import static org.junit.Assert.assertThat;
020import java.util.Iterator;
021import org.modeshape.common.CommonI18n;
022import org.modeshape.common.collection.Problem.Status;
023import org.modeshape.common.i18n.I18n;
024import org.junit.Before;
025import org.junit.Test;
026
027/**
028 * @author Randall Hauch
029 */
030public abstract class AbstractProblemsTest {
031
032    private Problems problems;
033    private Problem error;
034    private Problem warning;
035    private Problem info;
036    private I18n message;
037    private Throwable throwable;
038    private String location;
039    private String resource;
040
041    @Before
042    public void beforeEach() throws Exception {
043        problems = createProblems();
044        message = CommonI18n.argumentMayNotBeNull;
045        error = new Problem(Status.ERROR, 1, message, new Object[] {"error msg"}, null, null, null);
046        warning = new Problem(Status.WARNING, 1, message, new Object[] {"warning msg"}, null, null, null);
047        info = new Problem(Status.INFO, 1, message, new Object[] {"info msg"}, null, null, null);
048        throwable = new IllegalArgumentException(message.text("throwable"));
049        resource = "SomeResource";
050        location = "/Meaningless/location";
051    }
052
053    protected abstract Problems createProblems();
054
055    @Test
056    public void shouldBeEmptyImmediatelyAfterInstantiation() {
057        assertThat(problems.isEmpty(), is(true));
058        assertThat(problems.size(), is(0));
059    }
060
061    @Test
062    public void shouldAddErrorByMessageAndParametersUsingDefaultCode() {
063        error = new Problem(Status.ERROR, Problem.DEFAULT_CODE, message, new Object[] {"error msg"}, null, null, null);
064        problems.addError(error.getMessage(), error.getParameters());
065        assertThat(problems.iterator().next(), is(error));
066        assertThat(problems.isEmpty(), is(false));
067        assertThat(problems.size(), is(1));
068    }
069
070    @Test
071    public void shouldAddErrorByCodeAndMesssageAndParameters() {
072        problems.addError(error.getCode(), error.getMessage(), error.getParameters());
073        assertThat(problems.iterator().next(), is(error));
074        assertThat(problems.isEmpty(), is(false));
075        assertThat(problems.size(), is(1));
076    }
077
078    @Test
079    public void shouldAddErrorByThrowableAndMessageAndParametersUsingDefaultCode() {
080        error = new Problem(Status.ERROR, Problem.DEFAULT_CODE, message, new Object[] {"error msg"}, null, null, throwable);
081        problems.addError(error.getThrowable(), error.getMessage(), error.getParameters());
082        assertThat(problems.iterator().next(), is(error));
083        assertThat(problems.isEmpty(), is(false));
084        assertThat(problems.size(), is(1));
085    }
086
087    @Test
088    public void shouldAddErrorByThrowableAndCodeAndMessageAndParameters() {
089        error = new Problem(Status.ERROR, 1, message, new Object[] {"error msg"}, null, null, throwable);
090        problems.addError(error.getThrowable(), error.getCode(), error.getMessage(), error.getParameters());
091        assertThat(problems.iterator().next(), is(error));
092        assertThat(problems.isEmpty(), is(false));
093        assertThat(problems.size(), is(1));
094    }
095
096    @Test
097    public void shouldAddErrorByMessageAndResourceAndLocationAndParametersUsingDefaultCode() {
098        error = new Problem(Status.ERROR, Problem.DEFAULT_CODE, message, new Object[] {"error msg"}, resource, location, null);
099        problems.addError(error.getResource(), error.getLocation(), error.getMessage(), error.getParameters());
100        assertThat(problems.iterator().next(), is(error));
101        assertThat(problems.isEmpty(), is(false));
102        assertThat(problems.size(), is(1));
103    }
104
105    @Test
106    public void shouldAddErrorByCodeAndMesssageAndResourceAndLocationAndParameters() {
107        error = new Problem(Status.ERROR, 1, message, new Object[] {"error msg"}, resource, location, null);
108        problems.addError(error.getCode(), error.getResource(), error.getLocation(), error.getMessage(), error.getParameters());
109        assertThat(problems.iterator().next(), is(error));
110        assertThat(problems.isEmpty(), is(false));
111        assertThat(problems.size(), is(1));
112    }
113
114    @Test
115    public void shouldAddErrorByThrowableAndMessageAndResourceAndLocationAndParametersUsingDefaultCode() {
116        error = new Problem(Status.ERROR, Problem.DEFAULT_CODE, message, new Object[] {"error msg"}, resource, location,
117                            throwable);
118        problems.addError(error.getThrowable(),
119                          error.getResource(),
120                          error.getLocation(),
121                          error.getMessage(),
122                          error.getParameters());
123        assertThat(problems.iterator().next(), is(error));
124        assertThat(problems.isEmpty(), is(false));
125        assertThat(problems.size(), is(1));
126    }
127
128    @Test
129    public void shouldAddErrorByThrowableAndCodeAndMessageAndResourceAndLocationAndParameters() {
130        error = new Problem(Status.ERROR, 1, message, new Object[] {"error msg"}, resource, location, throwable);
131        problems.addError(error.getThrowable(),
132                          error.getCode(),
133                          error.getResource(),
134                          error.getLocation(),
135                          error.getMessage(),
136                          error.getParameters());
137        assertThat(problems.iterator().next(), is(error));
138        assertThat(problems.isEmpty(), is(false));
139        assertThat(problems.size(), is(1));
140    }
141
142    @Test
143    public void shouldAddWarningByMessageAndParametersUsingDefaultCode() {
144        warning = new Problem(Status.WARNING, Problem.DEFAULT_CODE, message, new Object[] {"warning msg"}, null, null, null);
145        problems.addWarning(warning.getMessage(), warning.getParameters());
146        assertThat(problems.iterator().next(), is(warning));
147        assertThat(problems.isEmpty(), is(false));
148        assertThat(problems.size(), is(1));
149    }
150
151    @Test
152    public void shouldAddWarningByCodeAndMesssageAndParameters() {
153        problems.addWarning(warning.getCode(), warning.getMessage(), warning.getParameters());
154        assertThat(problems.iterator().next(), is(warning));
155        assertThat(problems.isEmpty(), is(false));
156        assertThat(problems.size(), is(1));
157    }
158
159    @Test
160    public void shouldAddWarningByThrowableAndMessageAndParametersUsingDefaultCode() {
161        warning = new Problem(Status.WARNING, Problem.DEFAULT_CODE, message, new Object[] {"warning msg"}, null, null, throwable);
162        problems.addWarning(warning.getThrowable(), warning.getMessage(), warning.getParameters());
163        assertThat(problems.iterator().next(), is(warning));
164        assertThat(problems.isEmpty(), is(false));
165        assertThat(problems.size(), is(1));
166    }
167
168    @Test
169    public void shouldAddWarningByThrowableAndCodeAndMessageAndParameters() {
170        warning = new Problem(Status.WARNING, 1, message, new Object[] {"warning msg"}, null, null, throwable);
171        problems.addWarning(warning.getThrowable(), warning.getCode(), warning.getMessage(), warning.getParameters());
172        assertThat(problems.iterator().next(), is(warning));
173        assertThat(problems.isEmpty(), is(false));
174        assertThat(problems.size(), is(1));
175    }
176
177    @Test
178    public void shouldAddWarningByMessageAndResourceAndLocationAndParametersUsingDefaultCode() {
179        warning = new Problem(Status.WARNING, Problem.DEFAULT_CODE, message, new Object[] {"warning msg"}, resource, location,
180                              null);
181        problems.addWarning(warning.getResource(), warning.getLocation(), warning.getMessage(), warning.getParameters());
182        assertThat(problems.iterator().next(), is(warning));
183        assertThat(problems.isEmpty(), is(false));
184        assertThat(problems.size(), is(1));
185    }
186
187    @Test
188    public void shouldAddWarningByCodeAndMesssageAndResourceAndLocationAndParameters() {
189        warning = new Problem(Status.WARNING, 1, message, new Object[] {"warning msg"}, resource, location, null);
190        problems.addWarning(warning.getCode(),
191                            warning.getResource(),
192                            warning.getLocation(),
193                            warning.getMessage(),
194                            warning.getParameters());
195        assertThat(problems.iterator().next(), is(warning));
196        assertThat(problems.isEmpty(), is(false));
197        assertThat(problems.size(), is(1));
198    }
199
200    @Test
201    public void shouldAddWarningByThrowableAndMessageAndResourceAndLocationAndParametersUsingDefaultCode() {
202        warning = new Problem(Status.WARNING, Problem.DEFAULT_CODE, message, new Object[] {"warning msg"}, resource, location,
203                              throwable);
204        problems.addWarning(warning.getThrowable(),
205                            warning.getResource(),
206                            warning.getLocation(),
207                            warning.getMessage(),
208                            warning.getParameters());
209        assertThat(problems.iterator().next(), is(warning));
210        assertThat(problems.isEmpty(), is(false));
211        assertThat(problems.size(), is(1));
212    }
213
214    @Test
215    public void shouldAddWarningByThrowableAndCodeAndMessageAndResourceAndLocationAndParameters() {
216        warning = new Problem(Status.WARNING, 1, message, new Object[] {"warning msg"}, resource, location, throwable);
217        problems.addWarning(warning.getThrowable(),
218                            warning.getCode(),
219                            warning.getResource(),
220                            warning.getLocation(),
221                            warning.getMessage(),
222                            warning.getParameters());
223        assertThat(problems.iterator().next(), is(warning));
224        assertThat(problems.isEmpty(), is(false));
225        assertThat(problems.size(), is(1));
226    }
227
228    @Test
229    public void shouldAddInfoByMessageAndParametersUsingDefaultCode() {
230        info = new Problem(Status.INFO, Problem.DEFAULT_CODE, message, new Object[] {"info msg"}, null, null, null);
231        problems.addInfo(info.getMessage(), info.getParameters());
232        assertThat(problems.iterator().next(), is(info));
233        assertThat(problems.isEmpty(), is(false));
234        assertThat(problems.size(), is(1));
235    }
236
237    @Test
238    public void shouldAddInfoByCodeAndMesssageAndParameters() {
239        problems.addInfo(info.getCode(), info.getMessage(), info.getParameters());
240        assertThat(problems.iterator().next(), is(info));
241        assertThat(problems.isEmpty(), is(false));
242        assertThat(problems.size(), is(1));
243    }
244
245    @Test
246    public void shouldAddInfoByThrowableAndMessageAndParametersUsingDefaultCode() {
247        info = new Problem(Status.INFO, Problem.DEFAULT_CODE, message, new Object[] {"info msg"}, null, null, throwable);
248        problems.addInfo(info.getThrowable(), info.getMessage(), info.getParameters());
249        assertThat(problems.iterator().next(), is(info));
250        assertThat(problems.isEmpty(), is(false));
251        assertThat(problems.size(), is(1));
252    }
253
254    @Test
255    public void shouldAddInfoByThrowableAndCodeAndMessageAndParameters() {
256        info = new Problem(Status.INFO, 1, message, new Object[] {"info msg"}, null, null, throwable);
257        problems.addInfo(info.getThrowable(), info.getCode(), info.getMessage(), info.getParameters());
258        assertThat(problems.iterator().next(), is(info));
259        assertThat(problems.isEmpty(), is(false));
260        assertThat(problems.size(), is(1));
261    }
262
263    @Test
264    public void shouldAddInfoByMessageAndResourceAndLocationAndParametersUsingDefaultCode() {
265        info = new Problem(Status.INFO, Problem.DEFAULT_CODE, message, new Object[] {"info msg"}, resource, location, null);
266        problems.addInfo(info.getResource(), info.getLocation(), info.getMessage(), info.getParameters());
267        assertThat(problems.iterator().next(), is(info));
268        assertThat(problems.isEmpty(), is(false));
269        assertThat(problems.size(), is(1));
270    }
271
272    @Test
273    public void shouldAddInfoByCodeAndMesssageAndResourceAndLocationAndParameters() {
274        info = new Problem(Status.INFO, 1, message, new Object[] {"info msg"}, resource, location, null);
275        problems.addInfo(info.getCode(), info.getResource(), info.getLocation(), info.getMessage(), info.getParameters());
276        assertThat(problems.iterator().next(), is(info));
277        assertThat(problems.isEmpty(), is(false));
278        assertThat(problems.size(), is(1));
279    }
280
281    @Test
282    public void shouldAddInfoByThrowableAndMessageAndResourceAndLocationAndParametersUsingDefaultCode() {
283        info = new Problem(Status.INFO, Problem.DEFAULT_CODE, message, new Object[] {"info msg"}, resource, location, throwable);
284        problems.addInfo(info.getThrowable(), info.getResource(), info.getLocation(), info.getMessage(), info.getParameters());
285        assertThat(problems.iterator().next(), is(info));
286        assertThat(problems.isEmpty(), is(false));
287        assertThat(problems.size(), is(1));
288    }
289
290    @Test
291    public void shouldAddInfoByThrowableAndCodeAndMessageAndResourceAndLocationAndParameters() {
292        info = new Problem(Status.INFO, 1, message, new Object[] {"info msg"}, resource, location, throwable);
293        problems.addInfo(info.getThrowable(),
294                         info.getCode(),
295                         info.getResource(),
296                         info.getLocation(),
297                         info.getMessage(),
298                         info.getParameters());
299        assertThat(problems.iterator().next(), is(info));
300        assertThat(problems.isEmpty(), is(false));
301        assertThat(problems.size(), is(1));
302    }
303
304    @Test
305    public void shouldAddProblemsAndMaintainOrder() {
306        assertThat(problems.hasErrors(), is(false));
307        assertThat(problems.hasWarnings(), is(false));
308        assertThat(problems.hasInfo(), is(false));
309        assertThat(problems.isEmpty(), is(true));
310        assertThat(problems.size(), is(0));
311        problems.addWarning(warning.getThrowable(),
312                            warning.getCode(),
313                            warning.getResource(),
314                            warning.getLocation(),
315                            warning.getMessage(),
316                            warning.getParameters());
317        assertThat(problems.hasErrors(), is(false));
318        assertThat(problems.hasWarnings(), is(true));
319        assertThat(problems.hasInfo(), is(false));
320        assertThat(problems.isEmpty(), is(false));
321        assertThat(problems.size(), is(1));
322        problems.addError(error.getThrowable(),
323                          error.getCode(),
324                          error.getResource(),
325                          error.getLocation(),
326                          error.getMessage(),
327                          error.getParameters());
328        assertThat(problems.hasErrors(), is(true));
329        assertThat(problems.hasWarnings(), is(true));
330        assertThat(problems.hasInfo(), is(false));
331        assertThat(problems.isEmpty(), is(false));
332        assertThat(problems.size(), is(2));
333        problems.addInfo(info.getThrowable(),
334                         info.getCode(),
335                         info.getResource(),
336                         info.getLocation(),
337                         info.getMessage(),
338                         info.getParameters());
339        assertThat(problems.hasErrors(), is(true));
340        assertThat(problems.hasWarnings(), is(true));
341        assertThat(problems.hasInfo(), is(true));
342        assertThat(problems.isEmpty(), is(false));
343        assertThat(problems.size(), is(3));
344        problems.addWarning(warning.getThrowable(),
345                            warning.getCode(),
346                            warning.getResource(),
347                            warning.getLocation(),
348                            warning.getMessage(),
349                            warning.getParameters());
350        problems.addError(error.getThrowable(),
351                          error.getCode(),
352                          error.getResource(),
353                          error.getLocation(),
354                          error.getMessage(),
355                          error.getParameters());
356        problems.addWarning(warning.getThrowable(),
357                            warning.getCode(),
358                            warning.getResource(),
359                            warning.getLocation(),
360                            warning.getMessage(),
361                            warning.getParameters());
362        problems.addError(error.getThrowable(),
363                          error.getCode(),
364                          error.getResource(),
365                          error.getLocation(),
366                          error.getMessage(),
367                          error.getParameters());
368        assertThat(problems.hasErrors(), is(true));
369        assertThat(problems.hasWarnings(), is(true));
370        assertThat(problems.hasInfo(), is(true));
371        assertThat(problems.isEmpty(), is(false));
372        assertThat(problems.size(), is(7));
373        Iterator<Problem> iter = problems.iterator();
374        assertThat(iter.next(), is(warning));
375        assertThat(iter.next(), is(error));
376        assertThat(iter.next(), is(info));
377        assertThat(iter.next(), is(warning));
378        assertThat(iter.next(), is(error));
379        assertThat(iter.next(), is(warning));
380        assertThat(iter.next(), is(error));
381        assertThat(iter.hasNext(), is(false));
382        assertThat(problems.size(), is(7));
383        assertThat(problems.hasErrors(), is(true));
384        assertThat(problems.hasWarnings(), is(true));
385        assertThat(problems.hasInfo(), is(true));
386        assertThat(problems.isEmpty(), is(false));
387    }
388
389}