package org.hamcrest.object;

import org.hamcrest.AbstractMatcherTest;
import org.hamcrest.Matcher;

@SuppressWarnings("WeakerAccess")
public class HasEqualsValuesTest extends AbstractMatcherTest {
    
private static final WithPublicFields WITH_PUBLIC_FIELDS = new WithPublicFields('x', 666, "a string");
    
private static final HasEqualValues<WithPublicFields> WITH_PUBLIC_FIELDS_MATCHER = new HasEqualValues<>(WITH_PUBLIC_FIELDS);

    
@Override
    
protected Matcher<?> createMatcher() {
        
return WITH_PUBLIC_FIELDS_MATCHER;
    
}

    
public void test_describes_itself() {
        
assertDescription(
                
"WithPublicFields has values [i: <666>, s: \"a string\", c: \"x\"]",
                
WITH_PUBLIC_FIELDS_MATCHER);
    
}

    
public void test_matches_equivalent_object() {
        
assertMatches(WITH_PUBLIC_FIELDS_MATCHER, new WithPublicFields('x', 666, "a string"));
    
}

    
public void test_mismatches_on_first_field_inequality() {
        
assertMismatchDescription(
                
"'s' was \"different\"",
                
WITH_PUBLIC_FIELDS_MATCHER, new WithPublicFields('x', 666, "different"));
    
}

    
public void test_mismatches_on_inherited_field() {
        
assertMismatchDescription(
                
"'c' was \"y\"",
                
WITH_PUBLIC_FIELDS_MATCHER, new WithPublicFields('y', 666, "a string"));
    
}

    
public static class WithPublicFields extends Parent {
        
public final int i;
        
public final String s;

        
public WithPublicFields(char c, int i, String s) {
            
super(c);
            
this.i = i;
            
this.s = s;
        
}
    
}

    
public static class Parent {
        
public final char c;

        
public Parent(char c) {
            
this.c = c;
        
}
    
}
}