package works.cirno.mocha; import org.junit.Assert; import org.junit.Test; /** * */ public class ComparableClassWrapperTest { private Class<?>[] classes = new Class<?>[] { Throwable.class, java.awt.AWTError.class, java.io.IOError.class, java.lang.AbstractMethodError.class, java.lang.annotation.AnnotationFormatError.class, java.lang.AssertionError.class, java.lang.BootstrapMethodError.class, java.lang.ClassCircularityError.class, java.lang.ClassFormatError.class, java.lang.Error.class, java.lang.ExceptionInInitializerError.class, java.lang.IllegalAccessError.class, java.lang.IncompatibleClassChangeError.class, java.lang.InstantiationError.class, java.lang.InternalError.class, java.lang.LinkageError.class, java.lang.NoClassDefFoundError.class, java.lang.NoSuchFieldError.class, java.lang.NoSuchMethodError.class, java.lang.OutOfMemoryError.class, java.lang.reflect.GenericSignatureFormatError.class, java.lang.StackOverflowError.class, java.lang.UnknownError.class, java.lang.UnsatisfiedLinkError.class, java.lang.UnsupportedClassVersionError.class, java.lang.VerifyError.class, java.lang.VirtualMachineError.class, java.nio.charset.CoderMalfunctionError.class, java.rmi.ServerError.class, java.util.ServiceConfigurationError.class, java.util.zip.ZipError.class, java.awt.AWTException.class, java.awt.color.CMMException.class, java.awt.color.ProfileDataException.class, java.awt.datatransfer.MimeTypeParseException.class, java.awt.datatransfer.UnsupportedFlavorException.class, java.awt.dnd.InvalidDnDOperationException.class, java.awt.FontFormatException.class, java.awt.geom.IllegalPathStateException.class, java.awt.geom.NoninvertibleTransformException.class, java.awt.HeadlessException.class, java.awt.IllegalComponentStateException.class, java.awt.image.ImagingOpException.class, java.awt.image.RasterFormatException.class, java.awt.print.PrinterAbortException.class, java.awt.print.PrinterException.class, java.awt.print.PrinterIOException.class, java.beans.IntrospectionException.class, java.beans.PropertyVetoException.class, java.io.CharConversionException.class, java.io.EOFException.class, java.io.FileNotFoundException.class, java.io.InterruptedIOException.class, java.io.InvalidClassException.class, java.io.InvalidObjectException.class, java.io.IOException.class, java.io.NotActiveException.class, java.io.NotSerializableException.class, java.io.ObjectStreamException.class, java.io.OptionalDataException.class, java.io.StreamCorruptedException.class, java.io.SyncFailedException.class, java.io.UnsupportedEncodingException.class, java.io.UTFDataFormatException.class, java.io.WriteAbortedException.class, java.lang.annotation.AnnotationTypeMismatchException.class, java.lang.annotation.IncompleteAnnotationException.class, java.lang.ArithmeticException.class, java.lang.ArrayIndexOutOfBoundsException.class, java.lang.ArrayStoreException.class, java.lang.ClassCastException.class, java.lang.ClassNotFoundException.class, java.lang.CloneNotSupportedException.class, java.lang.EnumConstantNotPresentException.class, java.lang.Exception.class, java.lang.IllegalAccessException.class, java.lang.IllegalArgumentException.class, java.lang.IllegalMonitorStateException.class, java.lang.IllegalStateException.class, java.lang.IllegalThreadStateException.class, java.lang.IndexOutOfBoundsException.class, java.lang.InstantiationException.class, java.lang.instrument.IllegalClassFormatException.class, java.lang.instrument.UnmodifiableClassException.class, java.lang.InterruptedException.class, java.lang.invoke.WrongMethodTypeException.class, java.lang.NegativeArraySizeException.class, java.lang.NoSuchFieldException.class, java.lang.NoSuchMethodException.class, java.lang.NullPointerException.class, java.lang.NumberFormatException.class, java.lang.reflect.InvocationTargetException.class, java.lang.reflect.MalformedParameterizedTypeException.class, java.lang.reflect.UndeclaredThrowableException.class, java.lang.ReflectiveOperationException.class, java.lang.RuntimeException.class, java.lang.SecurityException.class, java.lang.StringIndexOutOfBoundsException.class, java.lang.TypeNotPresentException.class, java.lang.UnsupportedOperationException.class, java.net.BindException.class, java.net.ConnectException.class, java.net.HttpRetryException.class, java.net.MalformedURLException.class, java.net.NoRouteToHostException.class, java.net.PortUnreachableException.class, java.net.ProtocolException.class, java.net.SocketException.class, java.net.SocketTimeoutException.class, java.net.UnknownHostException.class, java.net.UnknownServiceException.class, java.net.URISyntaxException.class, java.nio.BufferOverflowException.class, java.nio.BufferUnderflowException.class, java.nio.channels.AcceptPendingException.class, java.nio.channels.AlreadyBoundException.class, java.nio.channels.AlreadyConnectedException.class, java.nio.channels.AsynchronousCloseException.class, java.nio.channels.CancelledKeyException.class, java.nio.channels.ClosedByInterruptException.class, java.nio.channels.ClosedChannelException.class, java.nio.channels.ClosedSelectorException.class, java.nio.channels.ConnectionPendingException.class, java.nio.channels.FileLockInterruptionException.class, java.nio.channels.IllegalBlockingModeException.class, java.nio.channels.IllegalChannelGroupException.class, java.nio.channels.IllegalSelectorException.class, java.nio.channels.InterruptedByTimeoutException.class, java.nio.channels.NoConnectionPendingException.class, java.nio.channels.NonReadableChannelException.class, java.nio.channels.NonWritableChannelException.class, java.nio.channels.NotYetBoundException.class, java.nio.channels.NotYetConnectedException.class, java.nio.channels.OverlappingFileLockException.class, java.nio.channels.ReadPendingException.class, java.nio.channels.ShutdownChannelGroupException.class, java.nio.channels.UnresolvedAddressException.class, java.nio.channels.UnsupportedAddressTypeException.class, java.nio.channels.WritePendingException.class, java.nio.charset.CharacterCodingException.class, java.nio.charset.IllegalCharsetNameException.class, java.nio.charset.MalformedInputException.class, java.nio.charset.UnmappableCharacterException.class, java.nio.charset.UnsupportedCharsetException.class, java.nio.file.AccessDeniedException.class, java.nio.file.AtomicMoveNotSupportedException.class, java.nio.file.attribute.UserPrincipalNotFoundException.class, java.nio.file.ClosedDirectoryStreamException.class, java.nio.file.ClosedFileSystemException.class, java.nio.file.ClosedWatchServiceException.class, java.nio.file.DirectoryIteratorException.class, java.nio.file.DirectoryNotEmptyException.class, java.nio.file.FileAlreadyExistsException.class, java.nio.file.FileSystemAlreadyExistsException.class, java.nio.file.FileSystemException.class, java.nio.file.FileSystemLoopException.class, java.nio.file.FileSystemNotFoundException.class, java.nio.file.InvalidPathException.class, java.nio.file.NoSuchFileException.class, java.nio.file.NotDirectoryException.class, java.nio.file.NotLinkException.class, java.nio.file.ProviderMismatchException.class, java.nio.file.ProviderNotFoundException.class, java.nio.file.ReadOnlyFileSystemException.class, java.nio.InvalidMarkException.class, java.nio.ReadOnlyBufferException.class, java.rmi.AccessException.class, java.rmi.activation.ActivateFailedException.class, java.rmi.activation.ActivationException.class, java.rmi.activation.UnknownGroupException.class, java.rmi.activation.UnknownObjectException.class, java.rmi.AlreadyBoundException.class, java.rmi.ConnectException.class, java.rmi.ConnectIOException.class, java.rmi.MarshalException.class, java.rmi.NoSuchObjectException.class, java.rmi.NotBoundException.class, java.rmi.RemoteException.class, java.rmi.server.ExportException.class, java.rmi.server.ServerCloneException.class, java.rmi.server.ServerNotActiveException.class, java.rmi.ServerException.class, java.rmi.StubNotFoundException.class, java.rmi.UnexpectedException.class, java.rmi.UnknownHostException.class, java.rmi.UnmarshalException.class, java.security.AccessControlException.class, java.security.acl.AclNotFoundException.class, java.security.acl.LastOwnerException.class, java.security.acl.NotOwnerException.class, java.security.cert.CertificateEncodingException.class, java.security.cert.CertificateException.class, java.security.cert.CertificateExpiredException.class, java.security.cert.CertificateNotYetValidException.class, java.security.cert.CertificateParsingException.class, java.security.cert.CertificateRevokedException.class, java.security.cert.CertPathBuilderException.class, java.security.cert.CertPathValidatorException.class, java.security.cert.CertStoreException.class, java.security.cert.CRLException.class, java.security.DigestException.class, java.security.GeneralSecurityException.class, java.security.InvalidAlgorithmParameterException.class, java.security.InvalidKeyException.class, java.security.InvalidParameterException.class, java.security.KeyException.class, java.security.KeyManagementException.class, java.security.KeyStoreException.class, java.security.NoSuchAlgorithmException.class, java.security.NoSuchProviderException.class, java.security.PrivilegedActionException.class, java.security.ProviderException.class, java.security.SignatureException.class, java.security.spec.InvalidKeySpecException.class, java.security.spec.InvalidParameterSpecException.class, java.security.UnrecoverableEntryException.class, java.security.UnrecoverableKeyException.class, java.sql.BatchUpdateException.class, java.sql.SQLClientInfoException.class, java.sql.SQLDataException.class, java.sql.SQLException.class, java.sql.SQLFeatureNotSupportedException.class, java.sql.SQLIntegrityConstraintViolationException.class, java.sql.SQLInvalidAuthorizationSpecException.class, java.sql.SQLNonTransientConnectionException.class, java.sql.SQLNonTransientException.class, java.sql.SQLRecoverableException.class, java.sql.SQLSyntaxErrorException.class, java.sql.SQLTimeoutException.class, java.sql.SQLTransactionRollbackException.class, java.sql.SQLTransientConnectionException.class, java.sql.SQLTransientException.class, java.text.ParseException.class, java.util.concurrent.BrokenBarrierException.class, java.util.concurrent.CancellationException.class, java.util.concurrent.ExecutionException.class, java.util.concurrent.RejectedExecutionException.class, java.util.concurrent.TimeoutException.class, java.util.ConcurrentModificationException.class, java.util.DuplicateFormatFlagsException.class, java.util.EmptyStackException.class, java.util.FormatFlagsConversionMismatchException.class, java.util.FormatterClosedException.class, java.util.IllegalFormatCodePointException.class, java.util.IllegalFormatConversionException.class, java.util.IllegalFormatException.class, java.util.IllegalFormatFlagsException.class, java.util.IllegalFormatPrecisionException.class, java.util.IllegalFormatWidthException.class, java.util.IllformedLocaleException.class, java.util.InputMismatchException.class, java.util.InvalidPropertiesFormatException.class, java.util.jar.JarException.class, java.util.MissingFormatArgumentException.class, java.util.MissingFormatWidthException.class, java.util.MissingResourceException.class, java.util.NoSuchElementException.class, java.util.prefs.BackingStoreException.class, java.util.prefs.InvalidPreferencesFormatException.class, java.util.regex.PatternSyntaxException.class, java.util.TooManyListenersException.class, java.util.UnknownFormatConversionException.class, java.util.UnknownFormatFlagsException.class, java.util.zip.DataFormatException.class, java.util.zip.ZipException.class }; public void ensureCompare(Class<?> aw, Class<?> bw, Class<?> cw) { ClassComparator cc = new ClassComparator(); Class<?> t; if (cc.compare(aw, bw) > 0) { t = aw; aw = bw; bw = t; } if (cc.compare(bw, cw) > 0) { t = bw; bw = cw; cw = t; } if (cc.compare(aw, bw) > 0) { t = aw; aw = bw; bw = t; } if (cc.compare(aw, bw) < 0 && cc.compare(bw, cw) < 0 && cc.compare(aw, cw) < 0 && cc.compare(bw, aw) > 0 && cc.compare(cw, bw) > 0 && cc.compare(cw, aw) > 0) { if (cw.isAssignableFrom(bw) || bw.isAssignableFrom(cw)) { Assert.assertEquals(bw.getName() + " <= " + cw.getName(), cw.isAssignableFrom(bw), cc.compare(bw, cw) <= 0); } if (cw.isAssignableFrom(aw) || aw.isAssignableFrom(cw)) { Assert.assertEquals(aw.getName() + " <= " + cw.getName(), cw.isAssignableFrom(aw), cc.compare(aw, cw) <= 0); } if (aw.isAssignableFrom(bw) || bw.isAssignableFrom(aw)) { Assert.assertEquals(bw.getName() + " <= " + aw.getName(), aw.isAssignableFrom(bw), cc.compare(bw, aw) <= 0); } } else { throw new IllegalStateException("Compare result for " + aw + " " + bw + " " + cw + " is wrong (" + cc.compare(aw, bw) + ", " + cc.compare(bw, cw) + ", " + cc.compare(aw, cw) + ", " + cc.compare(bw, aw) + ", " + cc.compare(cw, bw) + ", " + cc.compare(cw, aw) + ")"); } } @Test public void testCompare() { int max = classes.length; for (int i = 0; i < max; i++) { for (int j = 0; j < max; j++) { if (i != j) { for (int k = 0; k < max; k++) { if (i != k && j != k) { Class<?> a = classes[i]; Class<?> b = classes[j]; Class<?> c = classes[k]; ensureCompare(a, b, c); } } } } } } }