/*
* JBoss, Home of Professional Open Source.
* Copyright 2014, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.ee;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.file.FileSystems;
import java.security.AllPermission;
import java.time.DayOfWeek;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;
import java.time.MonthDay;
import java.time.Period;
import java.time.Year;
import java.time.YearMonth;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DecimalStyle;
import java.time.temporal.ValueRange;
import java.time.temporal.WeekFields;
import java.time.zone.ZoneOffsetTransitionRule;
import java.time.zone.ZoneOffsetTransitionRule.TimeDefinition;
import java.time.zone.ZoneRules;
import java.util.Arrays;
import java.util.Collections;
import java.util.Currency;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Predicate;
import org.junit.Test;
/**
* Unit test for {@link Immutability}
*
* @author Paul Ferraro
*/
public class ImmutabilityTestCase {
@Test
public void test() throws Exception {
this.test(Immutability.INSTANCE);
}
protected void test(Predicate<Object> immutability) throws Exception {
assertFalse(immutability.test(new Object()));
assertFalse(immutability.test(new Date()));
assertFalse(immutability.test(new AtomicInteger()));
assertFalse(immutability.test(new AtomicLong()));
assertTrue(immutability.test(null));
assertTrue(immutability.test(Collections.emptyEnumeration()));
assertTrue(immutability.test(Collections.emptyIterator()));
assertTrue(immutability.test(Collections.emptyList()));
assertTrue(immutability.test(Collections.emptyListIterator()));
assertTrue(immutability.test(Collections.emptyMap()));
assertTrue(immutability.test(Collections.emptyNavigableMap()));
assertTrue(immutability.test(Collections.emptyNavigableSet()));
assertTrue(immutability.test(Collections.emptySet()));
assertTrue(immutability.test(Collections.emptySortedMap()));
assertTrue(immutability.test(Collections.emptySortedSet()));
assertTrue(immutability.test(Boolean.TRUE));
assertTrue(immutability.test(Character.valueOf('a')));
assertTrue(immutability.test(this.getClass()));
assertTrue(immutability.test(Currency.getInstance(Locale.US)));
assertTrue(immutability.test(Locale.getDefault()));
assertTrue(immutability.test(Byte.valueOf(Integer.valueOf(1).byteValue())));
assertTrue(immutability.test(Short.valueOf(Integer.valueOf(1).shortValue())));
assertTrue(immutability.test(Integer.valueOf(1)));
assertTrue(immutability.test(Long.valueOf(1)));
assertTrue(immutability.test(Float.valueOf(1)));
assertTrue(immutability.test(Double.valueOf(1)));
assertTrue(immutability.test(BigInteger.valueOf(1)));
assertTrue(immutability.test(BigDecimal.valueOf(1)));
assertTrue(immutability.test(InetAddress.getLocalHost()));
assertTrue(immutability.test(new InetSocketAddress(InetAddress.getLocalHost(), 80)));
assertTrue(immutability.test(MathContext.UNLIMITED));
assertTrue(immutability.test("test"));
assertTrue(immutability.test(TimeZone.getDefault()));
assertTrue(immutability.test(UUID.randomUUID()));
assertTrue(immutability.test(TimeUnit.DAYS));
File file = new File(System.getProperty("user.home"));
assertTrue(immutability.test(file));
assertTrue(immutability.test(file.toURI()));
assertTrue(immutability.test(file.toURI().toURL()));
assertTrue(immutability.test(FileSystems.getDefault().getRootDirectories().iterator().next()));
assertTrue(immutability.test(new AllPermission()));
assertTrue(immutability.test(DateTimeFormatter.BASIC_ISO_DATE));
assertTrue(immutability.test(DecimalStyle.STANDARD));
assertTrue(immutability.test(Duration.ZERO));
assertTrue(immutability.test(Instant.now()));
assertTrue(immutability.test(LocalDate.now()));
assertTrue(immutability.test(LocalDateTime.now()));
assertTrue(immutability.test(LocalTime.now()));
assertTrue(immutability.test(MonthDay.now()));
assertTrue(immutability.test(Period.ZERO));
assertTrue(immutability.test(ValueRange.of(0L, 10L)));
assertTrue(immutability.test(WeekFields.ISO));
assertTrue(immutability.test(Year.now()));
assertTrue(immutability.test(YearMonth.now()));
assertTrue(immutability.test(ZoneOffset.UTC));
assertTrue(immutability.test(ZoneRules.of(ZoneOffset.UTC).nextTransition(Instant.now())));
assertTrue(immutability.test(ZoneOffsetTransitionRule.of(Month.JANUARY, 1, DayOfWeek.SUNDAY, LocalTime.MIDNIGHT, true, TimeDefinition.STANDARD, ZoneOffset.UTC, ZoneOffset.ofHours(1), ZoneOffset.ofHours(2))));
assertTrue(immutability.test(ZoneRules.of(ZoneOffset.UTC)));
assertTrue(immutability.test(ZonedDateTime.now()));
assertTrue(immutability.test(new JCIPImmutableObject()));
assertTrue(immutability.test(Collections.singleton("1")));
assertTrue(immutability.test(Collections.singletonList("1")));
assertTrue(immutability.test(Collections.singletonMap("1", "2")));
assertTrue(immutability.test(Collections.singleton(new JCIPImmutableObject())));
assertTrue(immutability.test(Collections.singletonList(new JCIPImmutableObject())));
assertTrue(immutability.test(Collections.singletonMap("1", new JCIPImmutableObject())));
assertTrue(immutability.test(Collections.unmodifiableCollection(Arrays.asList("1", "2"))));
assertTrue(immutability.test(Collections.unmodifiableList(Arrays.asList("1", "2"))));
assertTrue(immutability.test(Collections.unmodifiableMap(Collections.singletonMap("1", "2"))));
assertTrue(immutability.test(Collections.unmodifiableNavigableMap(new TreeMap<>(Collections.singletonMap("1", "2")))));
assertTrue(immutability.test(Collections.unmodifiableNavigableSet(new TreeSet<>(Collections.singleton("1")))));
assertTrue(immutability.test(Collections.unmodifiableSet(Collections.singleton("1"))));
assertTrue(immutability.test(Collections.unmodifiableSortedMap(new TreeMap<>(Collections.singletonMap("1", "2")))));
assertTrue(immutability.test(Collections.unmodifiableSortedSet(new TreeSet<>(Collections.singleton("1")))));
Object mutableObject = new AtomicInteger();
assertFalse(immutability.test(Collections.singletonList(mutableObject)));
assertFalse(immutability.test(Collections.singletonMap("1", mutableObject)));
}
@net.jcip.annotations.Immutable
static class JCIPImmutableObject {
}
}