1 /**
2 * Copyright (c) 2013-2023, jcabi.com
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met: 1) Redistributions of source code must retain the above
8 * copyright notice, this list of conditions and the following
9 * disclaimer. 2) Redistributions in binary form must reproduce the above
10 * copyright notice, this list of conditions and the following
11 * disclaimer in the documentation and/or other materials provided
12 * with the distribution. 3) Neither the name of the jcabi.com nor
13 * the names of its contributors may be used to endorse or promote
14 * products derived from this software without specific prior written
15 * permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
19 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21 * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28 * OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 package com.jcabi.github;
31
32 import com.google.common.collect.ImmutableSet;
33 import com.google.common.collect.Iterables;
34 import com.jcabi.aspects.Immutable;
35 import java.util.Set;
36 import org.hamcrest.CustomTypeSafeMatcher;
37 import org.hamcrest.MatcherAssert;
38 import org.hamcrest.Matchers;
39 import org.junit.Rule;
40 import org.junit.Test;
41
42 /**
43 * Test for immutability.
44 * Checks that all classes in package {@code com.jcabi.github }
45 * have {@code @Immutable} annotation.
46 *
47 * @author Paul Polishchuk (ppol@ua.fm)
48 * @version $Id: 4249ab11b100a8ca452aa5b4084f94dcdba1b2ef $
49 */
50 public final class ImmutabilityTest {
51
52 /**
53 * ClasspathRule.
54 * @checkstyle VisibilityModifierCheck (3 lines)
55 */
56 @Rule
57 public final transient ClasspathRule classpath = new ClasspathRule();
58
59 /**
60 * Test for immutability.
61 * Checks that all classes in package {@code com.jcabi.github }
62 * have {@code @Immutable} annotation.
63 *
64 */
65 @Test
66 public void checkImmutability() {
67 MatcherAssert.assertThat(
68 Iterables.filter(
69 this.classpath.allTypes(),
70 input -> !ImmutabilityTest.skip().contains(
71 input.getName()
72 )
73 ),
74 Matchers.everyItem(
75 new CustomTypeSafeMatcher<Class<?>>("annotated type") {
76 @Override
77 protected boolean matchesSafely(final Class<?> item) {
78 return item.isAnnotationPresent(Immutable.class);
79 }
80 }
81 )
82 );
83 }
84
85 /**
86 * Get set of class names to be skipped.
87 * @return Set
88 */
89 private static Set<String> skip() {
90 return ImmutableSet.<String>builder()
91 .add("com.jcabi.github.mock.JsonNode")
92 .add("com.jcabi.github.Bulk")
93 .add("com.jcabi.github.Smarts")
94 .build();
95 }
96 }