001 /*
002 * Created on Oct 20, 2010
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
005 * the License. You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
010 * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
011 * specific language governing permissions and limitations under the License.
012 *
013 * Copyright @2010-2011 the original author or authors.
014 */
015 package org.fest.assertions.api;
016
017 import java.awt.Dimension;
018 import java.awt.image.BufferedImage;
019 import java.util.Comparator;
020
021 import org.fest.assertions.data.Offset;
022 import org.fest.assertions.internal.Images;
023 import org.fest.util.VisibleForTesting;
024
025 /**
026 * Assertion methods for images.
027 * <p>
028 * To create an instance of this class, invoke <code>{@link Assertions#assertThat(BufferedImage)}</code>.
029 * </p>
030 *
031 * @author Yvonne Wang
032 * @author Alex Ruiz
033 * @author Ansgar Konermann
034 * @author Joel Costigliola
035 * @author Mikhail Mazursky
036 */
037 public class ImageAssert extends AbstractAssert<ImageAssert, BufferedImage> {
038
039 @VisibleForTesting
040 Images images = Images.instance();
041
042 protected ImageAssert(BufferedImage actual) {
043 super(actual, ImageAssert.class);
044 }
045
046 /**
047 * Verifies that the actual image is equal to the given one. Two images are equal if:
048 * <ol>
049 * <li>they have equal size</li>
050 * <li>the the RGB values of the color at each pixel are equal</li>
051 * </ol>
052 * @param expected the given image to compare the actual image to.
053 * @return {@code this} assertion object.
054 * @throws AssertionError if the actual image is not equal to the given one.
055 */
056 @Override
057 public ImageAssert isEqualTo(BufferedImage expected) {
058 images.assertEqual(info, actual, expected);
059 return this;
060 }
061
062 /**
063 * Verifies that the actual image is equal to the given one. Two images are equal if:
064 * <ol>
065 * <li>they have the same size</li>
066 * <li>the difference between the RGB values of the color at each pixel is less than or equal to the given offset</li>
067 * </ol>
068 * @param expected the given image to compare the actual image to.
069 * @param offset helps decide if the color of two pixels are similar: two pixels that are identical to the human eye
070 * may still have slightly different color values. For example, by using an offset of 1 we can indicate that
071 * a blue value of 60 is similar to a blue value of 61.
072 * @return {@code this} assertion object.
073 * @throws NullPointerException if the given offset is {@code null}.
074 * @throws AssertionError if the actual image is not equal to the given one.
075 */
076 public ImageAssert isEqualTo(BufferedImage expected, Offset<Integer> offset) {
077 images.assertEqual(info, actual, expected, offset);
078 return this;
079 }
080
081 /** {@inheritDoc} */
082 @Override
083 public ImageAssert isNotEqualTo(BufferedImage other) {
084 images.assertNotEqual(info, actual, other);
085 return this;
086 }
087
088 /**
089 * Verifies that the actual image has the given size.
090 * @param expected the expected size of the actual image.
091 * @return {@code this} assertion object.
092 * @throws NullPointerException if the given size is {@code null}.
093 * @throws AssertionError if the size of the actual image is not equal to the given size.
094 */
095 public ImageAssert hasSize(Dimension expected) {
096 images.assertHasSize(info, actual, expected);
097 return this;
098 }
099
100 @Override
101 public ImageAssert usingComparator(Comparator<? super BufferedImage> customComparator) {
102 throw new UnsupportedOperationException("custom Comparator is not supported for image comparison");
103 }
104
105 @Override
106 public ImageAssert usingDefaultComparator() {
107 super.usingDefaultComparator();
108 this.images = Images.instance();
109 return myself;
110 }
111 }